
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 | 높음: 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 포함 목록과 strip 콜백을 사용한 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 strip | 랩 검증으로 차단 확인. 대조군은 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를 참조하세요. 루프백 실험실 전용입니다. 보증은 제공되지 않습니다.