
CakePHP 5.4.2 - 高 - リモート - ヘッダーインジェクション - SmtpTransport 単独 LF 残留 GHSA-2qh5
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 内の同じコールバック | MailTransport のインクルードリストとストリップコールバックを使った getHeadersString でラボ実証済み。このラボは PHP の mail() を呼び出さない |
| 単独 LF だけでなく単独 CR も | ok\rBcc: ... | ラボで実証済み。ペアのみのストリップでは \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 のストリップ | ラボで実証済み、クローズ。コントロールは okBcc:... を連結する |
| スケルトンアプリでの未認証 RCE | この残存ではない | クローズ |
マルチパート filename= CRLF | 5.4.2 は既に "/\r/\n をストリップする | クローズ |
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 を参照。ループバックラボのみ。無保証。