
CakePHP 5.4.2 - 高 - リモート - ヘッダーインジェクション - SmtpTransport 単独 LF 残留 GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-smtp-crlf
解説記事: https://abraxaslabs.tech/research/cakephp-smtp-crlf
分類: メールヘッダインジェクション 到達範囲: リモート
CakePHP 5.4.2 (887b641) - Cake Software Foundation
GHSA-2qh5 / CVE-2026-77634 は SmtpTransport と MailTransport に str_replace("\r\n", '', $val) を追加しました。このコールバックは単独の LF や CR に対しては何もしません。ヘッダ名は依然としてサニタイズされずに連結されます。PHP の mail() と、私たちが取得した SMTP DATA は、単独の LF を新しいヘッダ行として扱います。
アプリケーションがユーザーデータをカスタムヘッダにコピーする場合、攻撃者は CRLF の代わりに LF を送ることで、Bcc を追加したり、Subject を書き換えたり、本文に侵入したりできます。 公表された修正はこれを防げません。標準の cakephp/app は、それ自体ではリクエストデータをカスタムヘッダに入れません。
| ID | CVE 未割当 |
| 分類 | メールヘッダインジェクション (GHSA-2qh5 の単独 LF 残存) |
| 到達範囲 | リモート (GHSA-2qh5 と同様: アプリがユーザーデータを Message::setHeaders にコピーする) |
| CWE | CWE-93 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| 製品 | CakePHP |
| 影響を受けるバージョン | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| 認証 | GHSA-2qh5 と同様: アプリがユーザーデータを Message::setHeaders / addHeaders にコピーする |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
リクエストデータをカスタムメールヘッダに入れるアプリケーションが必要です。
| 権限 | メソッド / シンク | ラボで実証済みか推測か |
|---|---|---|
SMTP DATA のヘッダブロックに余分な Bcc: (または Cc: / To:) 行を注入する | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) の後に SmtpTransport::send | ラボで実証済み。SMTP DATA と getHeadersString の両方に新しい Bcc: 行が現れる。証拠 X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
MailTransport 経由で同じ注入を行う | MailTransport::send 内の同じコールバック | getHeadersString 上で、MailTransport のインクルードリストと strip コールバックを用いてラボで実証済み。このラボは PHP の mail() を呼び出さない |
| 単独の LF だけでなく単独の CR も同様 | ok\rBcc: ... | ラボで実証済み。ペアのみの strip では \r が残る。CR/LF で分割するヘッダパーサはこれを新しい行として扱う |
Subject を書き換える、または本文に侵入する | 値に \nSubject: または \n\n を含める | 同じ連結処理からの推測。ラボでは Bcc / X-Oracle を注入し、Subject は注入していない |
| エンベロープ受信者の追加 | DATA 内に注入された Bcc | 推測。一部の MTA は DATA を再パースする。Cake の RCPT TO は依然として Message オブジェクトの setTo / setCc / setBcc のみを使用する |
2 バイトの \r\n ペア | GHSA-2qh5 の strip | ラボで実証済み、クローズ。対照では okBcc:... が連結される |
| スケルトンアプリでの未認証 RCE | この残存問題ではない | クローズ |
マルチパートの filename= CRLF | 5.4.2 はすでに "/\r/\n を strip する | クローズ |
GHSA-2qh5、GHSA-fxf7、GHSA-vjqc、および 5.4.2 の filename= に関する注記の後、cakephp/cakephp 5.4.2 を固定しました。トランスポートのテストは "line one\r\nline two" のみを送信し、line oneline two を期待しています。
SmtpTransport 5.4.2:
$headers = $message->getHeadersString(
[...],
"\r\n",
function (string $val): string {
return str_replace("\r\n", '', $val);
},
);
MailTransport も同じコールバックを使用します。Message::getHeadersString はコールバックを値にマッピングし、その後 $key . ': ' . $val を実行します。
すでに記録されている誤った道筋:GHSA-2qh5 をクローズ済みとして扱い、そのまま離れてしまうこと。ラボで PHP の mail() を呼び出すこと(オラクルは SMTP DATA と getHeadersString)。これをスケルトンアプリ上の未認証 RCE にまで誇張すること。見せかけ:リバースシェル。
python3 cakephp-smtp-crlf-Abraxas-Labs.py
または
cd lab
./run.sh
PHP 8.3 上の Composer cakephp/cakephp:5.4.2。127.0.0.1:19410 にループバック SMTP シンク。
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS。結果: ヘッダーが 1 つ X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS。\n のみの同じペイロード。結果: SMTP DATA、Smtp の getHeadersString、および Mail の getHeadersString に新しい Bcc: 行と X-Oracle: 行が追加される。\r のみの同じペイロード。同様に追加の行が発生する。SUCCESS cakephp-smtp-crlf pin=5.4.2 control-crlf-stripped=yes lf-bcc=yes cr-leftover=yes how=smtp-data-bcc-line CAKEPHP-SMTP-CRLF-WITNESS
ヘッダー名とヘッダー値に含まれる \r または \n を除去するか拒否します(5.4.2 の filename= サニタイザーと同じです)。トランスポートのテストでは、\r\n のペアだけでなく、単独の LF と単独の CR もカバーしてください。
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。