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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions