ウェブフックの認証は、その検証ではない
多くの開発者が、危険なバグをそのまま本番環境にリリースしてしまいます。彼らは「認証(Authentication)」と「検証(Validation)」を混同しているのです。
認証とは、メッセージが正しいプロバイダーから送られてきたことを意味します。 検証とは、メッセージ内のデータが正しいことを意味します。
もし最初のステップしか行わなければ、金銭的な損失を招くことになります。
最近のWordPressの脆弱性(CVE-2026-9189)が、この誤りを示しています。Contact Form 7 PayPal and Stripe Add-onにおいて、支払い金額のチェックが漏れていました。
攻撃者は次のようにしてこれを悪用します:
- 攻撃者が2,000ドルの注文を作成します。
- 攻撃者が実際に1ドルの支払いを行います。
- 請求書番号を2,000ドルの注文と一致するように設定します。
- PayPalが、1ドルの支払いに対する本物の検証済み通知を送信します。
- プラグインはその検証済みメッセージを受け取り、2,000ドルの注文を「支払い済み」としてマークします。
プラグインは送り主を信頼しましたが、メッセージの内容を無視してしまったのです。
この過ちを繰り返さないでください。ウェブフックを扱う際は、以下の手順に従ってください:
- シグネチャや共有シークレットを使用してメッセージを認証する。
- 金額と通貨がデータベース内の注文と一致するか確認する。
- 受信者のメールアドレスが自分のアカウントと一致するか検証する。
- 注文を紐付けるにはサーバー側の値を使用する。ペイロードに含まれる請求書ID(invoice ID)のみを信頼してはいけない。
- べき等性(idempotency)を利用して、重複するトランザクションIDを無視する。
- すべてのリクエストに対してTLS検証を有効にしておく。
- フェイルクローズ(Fail closed)を徹底する。いずれかのチェックに失敗した場合は、すべてを停止させる。
Contact Form 7 PayPal and Stripe Add-onのバージョン2.4.9以前を使用している場合は、今すぐアップデートしてください。未払いの注文はすべて、この攻撃の標的となります。
常に送り主を認証してから、データを確認するようにしてください。