
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 добавили str_replace("\r\n", '', $val) в SmtpTransport и MailTransport. Этот колбэк ничего не делает для одиночного 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 | Высокий: 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 |
Требуется приложение, которое помещает данные запроса в пользовательские заголовки почты.
| Привилегия | Метод / точка срабатывания | Доказано в лаборатории или выведено логически |
|---|---|---|
Внедрить дополнительную строку 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 | Тот же колбэк в MailTransport::send | Доказано в лаборатории на getHeadersString со списком include и колбэком strip из MailTransport. Эта лаборатория не вызывает PHP mail() |
| Одиночный CR, а также одиночный LF | ok\rBcc: ... | Доказано в лаборатории. Удаление только пар оставляет \r; парсеры заголовков, разделяющие по CR/LF, трактуют его как новую строку |
Переписать Subject или вклиниться в тело | Значение содержит \nSubject: или \n\n | Выведено логически из той же конкатенации. В лаборатории внедрялись Bcc / X-Oracle, а не Subject |
| Дополнительный получатель конверта | Внедрённый Bcc внутри DATA | Выведено логически. Некоторые MTA повторно разбирают DATA. RCPT TO в Cake по-прежнему использует только setTo / setCc / setBcc на объекте Message |
Двухбайтовая пара \r\n | Удаление из GHSA-2qh5 | Доказано в лаборатории как закрытое. Контрольный случай конкатенирует okBcc:... |
| Неаутентифицированный RCE на скелетном приложении | не этот остаточный случай | Закрыто |
CRLF в filename= multipart | 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. Приёмник 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. Без гарантий.