Skip to content

bug(worker): #230 signature swap broke live webhook delivery - all deliveries 429, intake silent #231

Description

@liplus-lin-lay

症状

GitHub App liplus-webhook-mcp の webhook 配送が 全件失敗している。

  • App → Advanced → Recent Deliveries が一律赤(Response 429Completed in ~0.8s)。
  • 直近 50 件 = 50/50 FAIL、種別無関係(workflow_run.* / installation_repositories.added / pull_request_review.submitted すべて赤)。範囲 2026-06-21 14:27 JST → 現在。
  • 結果、MCP get_pending_status が常時 pending_count: 0(イベントが保存されず intake が無音)。

根本原因(時刻ロックで確定的)

  • #230fix(worker): constant-time signature verification, merge 2085f03, 2026-06-21 05:23:54Z)で verifyGitHubSignatureworker/src/signature.ts)の署名比較を expected === signaturecrypto.subtle.verify(定数時間)へ差し替え → 即デプロイ。
  • 配送失敗の起点 = 06-21 14:27 JST = 05:27 UTC = デプロイの 約4分後
  • Cloudflare ダッシュ: Worker は 213 リクエスト / CPU 3.2ms。枠・プラン・量の問題ではない(無料枠にも何の上限にも届いていない)。コード回帰で確定。
  • #230 は「patch・機能契約は不変・観測変化なし」と宣言してマージされたが、実機の webhook は全弾落ちた。79 テスト緑は proxy であって実機保証ではなかった("動いてる挙動が正義")。
  • 応答が 401/403 でなく 429 な点は、署名失敗の連発で rate-limit 系(#224 で導入)が二次的に発火した可能性。一次原因は fix(worker): constant-time signature verification (patch) #230 の署名検証経路。要確認。

影響

  • webhook intake 全停止。2026-06-21 14:27 JST 以降の issue / PR / discussion / review イベントは未保存(取りこぼし)。

修正方針(候補)

  1. 即時復旧 = #230 を revertgh pr revert 230)。webhook 即復旧+因果確定。トレードオフ: #229 が塞いだ timing side-channel が一時的に後退(fix(worker): constant-time signature verification (patch) #230 以前=数ヶ月続いた状態、深刻度低)。
  2. fix-forward: 新 crypto.subtle.verify 経路のバグ特定(鍵 import / 生 32byte digest 復元 / sha256= prefix・64hex 形状検証あたりが濃厚)+修正+再デプロイ。side-channel 修正を保ったまま復旧。

推奨 = 1 で止血 → 2 で本筋。fix-forward 採否は実装者判断(この issue の唯一の未決点)。

対象ファイル

  • worker/src/signature.ts(実装の回帰)
  • worker/test/signature.test.ts実機配送形状での失敗を 79 緑が捕まえられなかった = 回帰テストの穴。GitHub 実配送 payload/実 header 形状でのケース追加)

確認

  • revert / fix 後、Recent Deliveries が緑(2xx)に戻ること + get_pending_status に実イベントが入ること。
  • 取りこぼし期間(06-21 14:27 JST 以降)の重要 delivery は Redeliver 検討(workflow_run は不要、issue_comment / pull_request_review 等のみ)。
  • 別軸メモ: App は workflow_run を購読しているが intake 用途では不要。今回の原因ではないが、復旧後に購読を絞るとノイズが減る(別 issue 化可)。

occurrences

  • 実機配送 50/50 fail(2026-06-22 目視確認、GitHub App Recent Deliveries + Cloudflare dashboard)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingreadybody converged for implementation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions