🇰🇷 한글 설명
httpd의 check_header/3 함수가 중복된 Content-Length는 거부하지만, RFC 9112 규격에서 경고하는 Transfer-Encoding과 Content-Length의 동시 존재 여부는 확인하지 않습니다. 이로 인해 프론트엔드와 백엔드 간의 요청 해석 차이가 발생하는 CL.TE HTTP 요청 변조(Smuggling) 취약점이 발생할 수 있습니다.
💡 쉬운 설명
웹 서버가 데이터의 길이를 계산하는 두 가지 방식이 동시에 들어올 때 이를 제대로 검사하지 못하는 문제입니다. 공격자가 이를 악용하면 서버 간의 통신을 교란하여 보안을 우회할 수 있습니다.
🇺🇸 원문 (English)
httpd function check_header/3 rejects duplicate Content-Length (per CVE-2026-23941) but never checks for the TE+CL co-presence that RFC 9112 §6.3 identifies as a probable smuggling attempt. handle_body/3 frames by chunked and silently discards Content-Length. A CL-preferring front-end paired with chunked-preferring inets creates a classic CL.TE front-end/back-end desync.
This issue affects OTP from OTP 17.0 before OTP 27.3.4.17, from OTP 28.0 before OTP 28.5.0.6, and from OTP 29.0 before OTP 29.0.6, corresponding to inets from 5.10 before 9.3.2.7, from 9.4 before 9.6.2.3, and from 9.7 before 9.7.2. Whether OTP before OTP 17.0, corresponding to inets before 5.10, is affected is unknown.
📍 영향받는 시스템
OTP 17.0 미만(확인 불가), 17.0~27.3.4.16, 28.0~28.5.0.5, 29.0~29.0.5 (inets 5.10 미만, 9.4~9.6.2.2, 9.7 미만 포함)
⚔️ 공격 벡터
Transfer-Encoding과 Content-Length 헤더를 동시에 사용하여 프론트엔드와 백엔드 간의 HTTP 요청 동기화를 깨뜨리는 방식
🛡️ 대응 방법
OTP를 최신 보안 패치 버전(27.3.4.17, 28.5.0.6, 29.0.6 이상)으로 업데이트하십시오.
🔧 검증 코드
출력된 inets 버전을 확인하여 취약한 범위(5.10 미만, 9.4~9.6.2.2, 9.7 미만)에 해당하는지 체크합니다.
erl -eval 'io:format("~p~n", [application:get_version(inets)]), halt().' 2>/dev/null