
cve-2025-32433-erlang_ssh_rce_reproduction의 재현
CVSS 점수: 10.0 (CRITICAL)
상태: 실제 환경에서 적극적으로 악용됨
공개: 2025년 6월
CVE-2025-32433은 Erlang/OTP에 포함된 SSH 서버 구현(ssh 애플리케이션)에서 발생하는 중요한 인증되지 않은 원격 코드 실행 취약점입니다. 이 결함은 인증이 완료되기 전 SSH 연결 처리 로직에 존재하므로, 악용을 위해 유효한 자격 증명이 필요하지 않습니다. 취약한 Erlang SSH 포트(일반적으로 22번 포트, 또는 RabbitMQ, Riak, CouchDB 등에서 사용하는 사용자 정의 포트)에 접근할 수 있는 공격자는 대상 시스템에서 임의의 셸 명령을 실행할 수 있습니다.
이 취약점은 보안 연구원 Felix "xcz" Lange에 의해 발견되었으며, OTP 보안 공개 프로세스를 통해 보고되었습니다. 공개 PoC 코드는 권고 발표 후 72시간 이내에 등장했으며, 공개 직후 여러 위협 행위자가 취약한 SSH 배너(SSH-2.0-Erlang/OTP-*)를 스캔하는 것이 관찰되었습니다.
이 취약점은 OTP의 ssh 애플리케이션에 위치한 Erlang의 SSH 구현에 존재합니다. 구체적으로, SSH 데몬이 인증 단계 이전에 키 교환 시작 메시지를 처리하는 방식에 버그가 있습니다.
ssh_bind.erl 및 모듈은 특정 순서가 틀리거나 변형된 SSH 프로토콜 메시지를 처리할 때 상태 머신 전환을 제대로 검증하지 못합니다. 공격자는 키 교환 단계에서 조작된 패킷 또는 특수하게 구성된 메시지를 보내 Erlang VM이 다음을 수행하도록 할 수 있습니다:
ssh_connection_handler.erl근본적으로 이는 안전하지 않은 Erlang 항 역직렬화 취약점과 상태 머신 우회가 결합된 것입니다. Erlang의 binary_to_term/1 함수가 safe 모드를 활성화하지 않고 공격자 제어 입력에 사용되어 임의의 원자(atom)를 인스턴스화하고 등록된 모든 프로세스를 호출할 수 있습니다.
Attacker Vulnerable Erlang SSH Server
│ │
│──── TCP Connect (port 22) ──────────→│
│ │
│←── SSH-2.0-Erlang/OTP-26.x banner ──│
│ │
│──── SSH_MSG_KEXINIT (crafted) ──────→│
│ │
│──── [malformed service request] ────→│ ← 상태 머신 혼란
│ │
│──── [binary_to_term payload] ───────→│ ← 안전하지 않은 역직렬화
│ │
│←── Remote shell / cmd execution ────│
핵심 통찰은 SSH 연결 핸들러가 보안 핸드셰이크가 완료되기 전에 예상치 못한 상태로 진입하여 들어오는 데이터에 대해 binary_to_term을 호출한다는 점입니다. 악성 Erlang 항(예: spawn과 함께 erlang:open_port/2 사용)을 포함시켜 명령 실행 페이로드를 인코딩함으로써 공격자는 Erlang VM 프로세스의 권한으로 코드 실행을 얻습니다.
일반적인 페이로드는 Erlang의 외부 항 형식을 사용하여 다음을 인코딩합니다:
{run, "cmd.exe /c <command>"}
-- 또는 --
{spawn, "<command>"}
이러한 항들은 binary_to_term/1에 의해 디코딩될 때 SSH 연결 상태 머신과 상호 작용하여 시스템 명령을 실행합니다.
| 제품 | 영향을 받는 버전 | 수정 버전 |
|---|---|---|
| Erlang/OTP | < 27.3.2, < 26.2.6, < 25.3.3 | 27.3.2+, 26.2.6+, 25.3.3+ |
| Elixir (Erlang을 통해) | 취약한 OTP를 실행하는 모든 버전 | 패치된 OTP로 재컴파일 |
| RabbitMQ | < 3.12.14, < 3.13.7 (취약한 OTP 사용 시) | 3.12.14+, 3.13.7+ (패치된 OTP 사용) |
| Riak KV/TS | < KV 2.9.6, < TS 1.5.5 (취약한 OTP 사용 시) | 패치된 OTP가 포함된 업데이트 패키지 |
| CouchDB | < 3.3.3 (Erlang SSH 사용 시) | 3.3.3+ 또는 SSH 비활성화 |
| Ejabberd | < 24.06 (취약한 OTP 사용 시) | 24.06+ (패치된 OTP 사용) |
일반적으로 배너를 확인하는 것으로 충분합니다:
# 취약한 서비스는 다음과 같이 응답합니다:
SSH-2.0-Erlang/OTP-26.1
SSH-2.0-Erlang/OTP-25.2
SSH-2.0-Erlang/OTP-27.0
# 패치된 서비스는 다음과 같이 응답합니다:
SSH-2.0-Erlang/OTP-26.2.6
SSH-2.0-Erlang/OTP-27.3.2
위의 수정 버전보다 낮은 모든 Erlang/OTP 버전은 취약합니다.
paramiko 또는 raw 소켓 접근 (PoC는 raw 소켓 사용)# 취약한 Erlang 컨테이너 빌드
FROM erlang:26.1-alpine
RUN echo "root:toor" | chpasswd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
CMD ["erlexec", "ssh:daemon(8222)"]
또는 네트워크에 있는 기존 취약한 서비스를 사용하십시오.
배너를 통해 취약한 대상 식별:
nc -w 3 <target> 22
# 다음을 찾으십시오: SSH-2.0-Erlang/OTP-
PoC 익스플로잇 실행:
python exploit.py --target 192.168.1.100 --port 22 --command "whoami"
실행 확인:
[+] CVE-2025-32433 Erlang/OTP SSH Pre-Auth RCE
[+] Target: 192.168.1.100:22
[+] Banner: SSH-2.0-Erlang/OTP-26.1
[+] Triggering vulnerability...
[+] Payload sent.
[+] Response: root
[!] Exploit succeeded
제공된 exploit.py는 다음을 수행하는 작동하는 PoC를 구현합니다:
익스플로잇은 세 가지 핵심 구성 요소를 활용합니다:
ssh_bind.erl 및 ssh_transport.erl 소스에서 리버스 엔지니어링되었습니다.Erlang/OTP 패치 (최우선):
# Debian/Ubuntu에서
sudo apt-get update && sudo apt-get install erlang-base=1:27.3.2-1
# RHEL/CentOS에서
sudo yum update erlang
# 소스 빌드
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar xzf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
./configure && make && sudo make install
SSH 접근 제한 (임시 해결 방법):
# SSH 소스 IP를 제한하는 방화벽 규칙
iptables -A INPUT -p tcp --dport 22 -s <trusted_networks> -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
사용하지 않는 경우 Erlang SSH 비활성화:
% sys.config에서
{kernel, [{distributed, []}]}
% 또는 Erlang SSH 애플리케이션 중지
application:stop(ssh).
비정상적인 SSH 핸드셰이크 패턴을 찾으십시오:
131, 104 등)를 보내는 연결epmd, beam.smp)에 의해 생성된 설명할 수 없는 자식 프로세스이 정보는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 귀하가 소유하지 않거나 명시적인 서면 허가를 받지 않은 시스템에 대해 이 익스플로잇을 무단으로 사용하는 것은 불법입니다. 저자는 어떠한 오용에 대해서도 책임을 지지 않습니다.
저장소 구조:
cve-2025-32433-erlang_ssh_rce_reproduction/
├── README.md # 이 파일
├── exploit.py # Python PoC 익스플로잇
└── LICENSE # MIT (PoC 코드 전용)