🇰🇷 한글 설명
Erlang/OTP의 ftp_internal 모듈에서 발생하는 SSRF 취약점으로, PASV 응답의 IP 주소를 검증하지 않아 FTP 바운스 공격이 가능합니다. 공격자는 악의적인 FTP 서버를 통해 클라이언트의 데이터 연결을 내부 호스트나 클라우드 메타데이터 엔드포인트로 리다이렉션할 수 있습니다.
💡 쉬운 설명
FTP 서버가 알려주는 주소를 확인 없이 믿어버려서, 공격자가 원하는 다른 컴퓨터로 데이터를 보내거나 가져오게 만드는 보안 결함입니다. 이를 통해 내부 네트워크의 중요한 정보가 유출될 수 있습니다.
🇺🇸 원문 (English)
Server-Side Request Forgery (SSRF) vulnerability in Erlang/OTP ftp (ftp_internal module) allows FTP bounce attacks and SSRF via an unvalidated PASV response IP address.
The ftp_internal:handle_ctrl_result/2 PASV handler (mode=passive, ipfamily=inet, ftp_extension=false) extracts the IP address from the server's 227 response and passes it directly to gen_tcp:connect/4 without validating it against the control connection peer address. The adjacent EPSV handlers correctly call peername(CSock) to derive the IP from the control connection, but the PASV handler does not. A malicious or compromised FTP server can redirect the client's data connection to an arbitrary internal host and port. On read operations (ftp:ls/1,2, ftp:nlist/1,2, ftp:recv/2,3), data from the redirected target is returned to the caller. On write operations (ftp:send/2,3, ftp:append/2,3), file content is sent to the redirected target. This enables SSRF against internal hosts, cloud metadata endpoints, and FTP bounce attacks against third-party hosts.
The vulnerable path is the default configuration (mode=passive, ipfamily=inet, ftp_extension=false). RFC 2577 section 3 explicitly recommends validating the PASV response IP against the control connection peer.
The ftp application is deprecated and scheduled for removal in OTP-30.
This vulnerability is associated with program files lib/inets/src/ftp/ftp_internal.erl (inets 5.10.4 through 6.5, OTP 17.4 through 20.3) and lib/ftp/src/ftp_internal.erl (ftp 1.0 and later, OTP 21.0 and later).
This issue affects OTP from OTP 17.4 before OTP 29.0.2, OTP 28.5.0.2 and OTP 27.3.4.13, corresponding to inets from 5.10.4 before 7.0 and ftp from 1.0 before 1.2.6, 1.2.4.1 and 1.2.3.1.
📍 영향받는 시스템
OTP 17.4 ~ 29.0.2 미만, 28.5.0.2 미만, 27.3.4.13 미만 및 관련 inets/ftp 라이브러리 버전
⚔️ 공격 벡터
조작된 227 PASV 응답을 통해 클라이언트의 데이터 연결을 임의의 내부 IP 및 포트로 유도
🛡️ 대응 방법
Erlang/OTP를 최신 보안 패치 버전(OTP 29.0.2, 28.5.0.2, 27.3.4.13 이상)으로 업데이트
🔧 검증 코드
출력된 OTP 버전이 취약한 범위(예: 27.3.4.13 미만 등)에 포함되는지 확인
erl -eval 'io:format("~s~n", [erlang:system_info(otp_release)]), halt().' -noshell
📊 CVSS Vector String
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
💻 영향받는 소프트웨어
IBM WebSphere Application Server