
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 добавили str_replace("\r\n", '', $val) в SmtpTransport и MailTransport. Этот callback ничего не делает для одиночного LF или CR. Имена заголовков по-прежнему конкатенируются без санитизации. PHP mail() и SMTP DATA, которые мы перехватили, трактуют одиночный LF как новую строку заголовка.
Если приложение копирует пользовательские данные в пользовательский заголовок, злоумышленник может добавить Bcc, переписать Subject или вклиниться в тело, отправив LF вместо CRLF. Объявленное исправление это не останавливает. Стандартный cakephp/app сам по себе не помещает данные запроса в пользовательские заголовки.
| ID | CVE пока нет |
| Класс | Инъекция в заголовки почты (остаточный одиночный LF от GHSA-2qh5) |
| Доступ | Удалённый (как в 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 |
Требуется приложение, которое помещает данные запроса в пользовательские заголовки почты.
| Привилегия | Метод / sink | Доказано в лаборатории или выведено |
|---|---|---|
Внедрить дополнительную строку Bcc: (или Cc: / To:) в блок заголовков SMTP DATA | setHeaders(['X-Meta' => "ok\nBcc: [email protected]"]) затем SmtpTransport::send | Доказано в лаборатории. SMTP DATA и getHeadersString оба показывают новую строку Bcc:. Свидетель X-Oracle: CAKEPHP-SMTP-CRLF-WITNESS |
Та же инъекция через MailTransport | Тот же callback в MailTransport::send | Доказано в лаборатории на getHeadersString со списком включений MailTransport и callback-ом strip. Эта лаборатория не вызывает PHP mail() |
| Одиночный CR, а также одиночный LF | ok\rBcc: ... | Доказано в лаборатории. Strip только пары оставляет \r; парсеры заголовков, которые разбивают по CR/LF, трактуют его как новую строку |
Переписать Subject или вклиниться в тело | Значение содержит \nSubject: или \n\n | Выведено из той же конкатенации. В лаборатории внедрялись Bcc / X-Oracle, а не Subject |
| Дополнительный получатель конверта | Внедрённый Bcc внутри DATA | Выведено. Некоторые MTA повторно разбирают DATA. Cake RCPT TO по-прежнему использует только setTo / setCc / setBcc на объекте Message |
Двухбайтовая пара \r\n | Strip из GHSA-2qh5 | Доказано в лаборатории как закрыто. Контроль конкатенирует okBcc:... |
| Неаутентифицированный RCE на скелетном приложении | не этот остаток | Закрыто |
Multipart filename= CRLF | 5.4.2 уже удаляет "/\r/\n | Закрыто |
Я зафиксировал cakephp/cakephp 5.4.2 после GHSA-2qh5, GHSA-fxf7, GHSA-vjqc и примечания к filename= в 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 использует тот же callback. Message::getHeadersString применяет callback к значениям, затем выполняет $key . ': ' . $val.
Уже зафиксированные неверные пути: считать GHSA-2qh5 закрытым и уйти; вызывать PHP mail() в лаборатории (оракул — это SMTP DATA плюс getHeadersString); раздувать это до неаутентифицированного RCE на скелетном приложении. Театр: reverse shell.
python3 cakephp-smtp-crlf-Abraxas-Labs.py
или
cd lab
./run.sh
Composer cakephp/cakephp:5.4.2 в PHP 8.3. Loopback SMTP-приёмник на 127.0.0.1:19410.
X-Meta = ok\r\nBcc: [email protected]\r\nX-Oracle: CAKEPHP-SMTP-CRLF-WITNESS. Результат: один заголовок X-Meta: okBcc: [email protected]: CAKEPHP-SMTP-CRLF-WITNESS.\n. Результат: новые строки Bcc: и X-Oracle: в SMTP DATA, Smtp getHeadersString и Mail getHeadersString.\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 в именах и значениях заголовков (так же, как санитайзер filename= в 5.4.2). Покрыть одиночный LF и одиночный CR в тестах транспорта, а не только пару \r\n.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Mailer/Transport/SmtpTransport.php · src/Mailer/Transport/MailTransport.php · src/Mailer/Message.phpGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.