Hostヘッダーがlocalhostの場合、WeChat Payのコールバック署名検証がバイパスされる
プラットフォーム
php
コンポーネント
yansongda/pay
修正バージョン
3.7.20
## 概要 `src/Functions.php`の`verify_wechat_sign()`関数は、PSR-7リクエストがホストとして`localhost`を報告する場合、**すべての署名検証を無条件にスキップ**します。攻撃者は、`Host: localhost`ヘッダーを含む細工されたHTTPリクエストをWeChat Payコールバックエンドポイントに送信することで、これを利用してRSA署名チェックを完全にバイパスできます。 これにより、偽のWeChat Pay支払い成功通知を偽造し、アプリケーションが実際の支払いなしに注文を支払い済みとしてマークする可能性があります。 ## 脆弱なコード **`src/Functions.php` 243-246行目:** ```php function verify_wechat_sign(ResponseInterface|ServerRequestInterface $message, array $params): void { // BYPASS: Hostヘッダーがlocalhostの場合、署名チェックなしでリターン if ($message instanceof ServerRequestInterface && 'localhost' === $message->getUri()->getHost()) { return; // 署名は検証されません! } // ... openssl_verify() は Host != localhost の場合にのみ到達 $wechatSerial = $message->getHeaderLine('Wechatpay-Serial'); $sign = $message->getHeaderLine('Wechatpay-Signature'); $result = 1 === openssl_verify($content, base64_decode($sign), $public, 'sha256WithRSAEncryption'); }
修正方法
公式パッチはありません。回避策を確認するか、アップデートを監視してください。