
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 | 높음: 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()을 호출하지 않음 |
| 단독 CR 및 단독 LF | 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. 결과: 하나의 헤더 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 참조. 루프백 랩 전용. 보증 없음.