01. 취약점 개요
○ 2025.04.16 독일 보훔 루르 대학교 보안 연구진이 Erlang/OTP SSH*서버에서 인증되지 않은 사용자에 의한 원격 코드 실행 가능 취약점(CVE-2025-32433) 발표
* Erlang/OTP SSH : 고성능 동시성 처리 강점을 지닌 언어로 통신 시스템, IoT, OT장비 등 다양한 고가용성 시스템에 사용되는 Erlang와 표준 라이브러리 및 각종 도구 모음인 OTP(Open Telecom Platform)에서 구현한 SSH 라이브러리
•
Erlang/OTP SSH 서버에 네트워크 접근이 가능하나 인증 권한이 없는 사용자가 별도의 인증절차 없이도 원격에서 코드 실행이 가능한 취약점으로 민감정보 탈취 및 서비스 거부 공격(DoS), 랜섬웨어 감염 등의 공격이 가능
○ SSH로 사용자에게 수신받은 명령어가 내부 라이브러리(ssh_connection.erl) 파일 내 handle_msg 함수에서 별도의 인증절차 없이 명령어가 실행됨에 따라 RCE 취약점 발현
•
SSH 통신 중 클라이언트의 메시지 인증 코드가 80 이상인 서비스 요청(SSH_MSG_CHANNEL_REQUEST) 요청에 대해 취약 버전 Erlang/OTP의 SSH 서버가 사용자 인증(SSH_MSG_USERAUTH_REQUEST) 과정 없이 비정상 SSH 핸드셰이크로 인한 RCE 발현
○ 초고위험도(CVSS 10.0)에 해당함에 따라 취약한 버전에 해당하는 Erlang/OTP SSH 라이브러리를 사용하는 경우 보안 업데이트 또는 SSH 접근제한 설정 필요
•
보안패치 버전이 자동 업데이트 되지 않기 때문에 반드시 시스템별 영향도 확인 필요
02. 영향받는 취약 버전 및 대응방안
1.
Erlang社에서 제공하는 보안 패치 업데이트 필요(시스템 별 개별 확인 필요)
CVE | 취약점 설명 | CVSS 3.X | 취약 버전 | 보안패치 버전 |
CVE-2025-32433 | Erlang/OTP의 인증되지 않은 SSH 메시지를 통한 RCE | 10.0 | <= OTP-27.3.2
<= OTP-26.2.5.10
<= OTP-25.3.2.19 | OTP-27.3.3
OTP-26.2.5.11
OTP-25.3.2.20 |
2.
불필요한 Erlang/OTP 기반 SSH 비활성화 또는 SSH 접근제한 설정
3.
SNORT 및 YARA룰 적용으로 CVE-2025-32433 탐지 정책 반영
03. 취약점 상세설명
3.1. CVE-2025-32433 개요
○ CVE-2025-32433(CVSS10.0)은 Erlang/OTP의 SSH 서버에서 인증되지 않은 사용자의 명령어 처리 과정으로 인해 원격 코드 실행(RCE)이 가능한 취약점
•
Erlang/OTP는 에릭슨에서 통신시스템으로 개발된 Erlang과 Erlang으로 작성된 미들웨어, 라이브러리, 도구 모음인 OTP(Open Telecom Platform)의 조합
•
Erlang은 고가용성이 요구되는 확장 가능한 실시간 시스템을 구축하기 위해 설계된 프로그래밍 언어로 다양한 분산 컴퓨팅 문제를 해결하기 위한 솔루션으로 Erlang 프로젝트를 구현하기 위해서는 일반적으로 분산 어플리케이션 구축을 위한 범용 프레임워크인 OTP를 함께 사용하기 때문에 Erlang/OTP로 명명
○ Erlang/OTP의 SSH 프로토콜은 사전 인증단계에서 연결 프로토콜의 메시지 처리 방식에서 취약점이 발생하는데, 80번 이상의 SSH 메시지 번호는 사후 인증용으로 예약된 번호이기 때문에 SSH Client가 인증이 완료되기 전에 해당 번호가 포함된 SSH 메시지를 전송하면 SSH 서버가 해당 메시지 연결을 끊어야 하지만 공격자가 SSH 서버의 명령 처리 흐름에 임의의 명령으로 개입하여 실행되는 취약점
○ SSH 핸드셰이크에서 SSH 세션을 시작하기 위해 채널 오픈 요청을 전송한 후 로그인 전 페이로드를 포함한 채널 요청을 즉시 전송하므로 유효한 사용자 이름이나 키 없이도 해당 취약점 발현 가능
•
Erlang/OTP의 내부 라이브러리 ssh_connection.erl 파일 내 handle_msg 함수의 미흡한 처리 방식에서 비롯됨
•
ssh_connection:handle_msg에서 검사되지 않고 클라이언트 측에서 수신된 SSH 메시지를 처리하기 위해 ssh_cli:handle_ssh_msg 함수가 호출됨
•
ssh_cli:handle_ssh_msg 함수가 전달받은 클라이언트가 실행하려는 명령어 Cmd0을 디코딩 및 리스트로 변환하여 Cmd에 저장함([그림 1]의 Line 193~195 참조)
•
쉘이 비활성화 되어 있지 않고 사용자 정의 함수(F)가 존재하지 않을 경우 Erlang 명령어를 실행하는 기본 쉘 exec_in_erlang_default_shell 함수에 Cmd에 저장된 RCE가 전달됨([그림 1]의 Line 197~205 참조)
•
exec_in_erlang_default_shell 함수가 전달받은 Cmd의 RCE 명령을 실행함([그림 2]의 Line 697 참조)
[그림 1] ssh_cli.erl 파일 내 handle_ssh_msg 함수
[그림 2] ssh_cli.erl 파일 내 exec_in_erlang_default_shell 함수
3.2. 취약점 PoC 분석
○ Erlang/OTP 27.3.2 버전을 Kali GNU/Linux 2024.1 환경에서 PoC 테스트
○ Docker 환경에서 Erlang/OTP 27.3.2 버전의 SSH 서버를 2222번 포트로 오픈
1) Erlang shell에서 SSH 서버 시작 및 특정 포트(2222) 오픈
•
호스트 및 유저 키는 /root/.ssh/ssh_host_rsa_key 사용(없을 시, ssh-keygen으로 생성)
Erlang/OTP 27 [erts-15.2.5] [source] [64-bit] [smp:32:4] [ds:32:4:10] [async-threads:1] [jit:ns]
Eshell V15.2.5 (press Ctrl+G to abort, type help(). for help)
1> ssh:start().
ok
2> {ok, Sshd}=ssh:daemon(2222, [{system_dir,"/root/.ssh"},{user_dir,"/root/.ssh"}]).
{ok,<0.94.0>}
Erlang
복사
[ Erlang/OTP 27.3.2 버전의 Erlang shell ]
2) 비정상 SSH 핸드셰이크를 통한 RCE 발현 시도
•
SSH 프로토콜(RFC 4252 기준)에 따르면 메시지 번호 80 이상은 사용자 인증 이후에만 처리되어야 하나, 취약한 Erlang/OTP SSH 서버는 메시지 처리 로직이 미흡하여 인증 없이 해당 메시지를 수신 및 처리함
•
SSH 핸드셰이크에서 알고리즘 협상 단계 이후 서비스 요청 단계에서 채널 오픈 직후 공격자가 메시지 인증 코드가 80번인 SSH_MSG_CHANNEL_REQUEST 요청을 전송하면 취약한 SSH 서버는 비정상 요청에 대한 검증 로직이 부재하여 공격자가 보낸 요청에 포함된 코드를 실행함
[그림 3] 공격 흐름도
① 신원 확인용 스트링 교환
•
공격자(클라이언트)가 SSH 통신을 위해 SSH 프로토콜 버전을 포함한 식별 문자열(SSH-2.0-OpenSSH_8.9)을 서버에 전송하고, 서버의 식별 문자열(SSH-2.0-Erlang/5.2.9)을 수신([그림 6]의 Line 87~91 참조)
② 알고리즘 협상
•
클라이언트와 서버가 각각 지원하는 암호화, MAC, 압축 등의 알고리즘 목록을 포함하는 SSH_MSG_KEXINIT 패킷 교환 후, 알고리즘 스위트* 결정([그림 6]의 Line 93~97 참조)
* 알고리즘 스위트(Algorithm Suite) : 하나의 SSH 통신 연결을 위해 클라이언트와 서버 간 합의된 여러 종류의 보안 알고리즘 묶음
③ 서비스 요청
1.
채널 오픈 요청
•
공격자가 사용자 인증(SSH_MSG_USERAUTH_REQUEST) 과정 없이, 바로 세션을 시작하기 위한 SSH_MSG_CHANNEL_OPEN 패킷을 서버에 전송([그림 6]의 Line 99~103 참조)
2.
비정상 SSH 핸드셰이크를 통한 RCE 발현 시도
•
인증이 완료되지 않은 상태에서 서버에서 실행할 임의의 명령(command)을 삽입한 SSH_MSG_CHANNEL_REQUEST 패킷 전송([그림 6]의 Line 105~110 참조)
[그림 4] RCE가 삽입된 SSH_MSG_CHANNEL_REQUEST 패킷
④ RCE 발현
•
취약한 SSH 서버는 RCE가 포함된 메시지를 수신하여 SSH_MSG_CHANNEL_REQUEST 패킷에 포함된 명령 실행
[그림 5] RCE 발현 성공
[그림 6] PoC 내 익스플로잇 코드
3.3. 보안 패치 코드 분석
○ Erlang/OTP 27.3.3, 26.2.5.11 및 25.3.2.20 버전 이상에서 보안 패치 적용
○ Erlang/OTP SSH 라이브러리의 handle_msg 함수에 조건 추가
•
인증되지 않은 사용자(authenticated = false(기본값))로부터 수신된 메시지인 경우 SSH 즉시 연결 종료 로직 추가([그림 7]의 Line 476 참조)
•
인증되지 않은 사용자로부터 수신된 메시지 내용 로깅([그림 7]의 Line 483~489 참조)
•
서버가 인증 과정에서 순서가 잘못된 메시지 시퀀스를 강제적으로 중단([그림 7]의 Line 490 참조)
[그림 7] 패치된 버전의 Erlang/OTP에 추가된 ssh_connection:handle_msg 함수
04. 대응방안
4.1. 보안 패치 버전 업데이트
○ Erlang社에서 제공하는 보안 패치가 적용된 버전으로 즉시 업데이트 필요
○ Erlang/OTP SSH 라이브러리(ssh_connection 모듈) 관련 문제로, 취약 버전 27.3.2, 26.2.5.10 및 25.3.2.19 이하 SSH 서버를 실행하는 모든 시스템 해당(시스템 개별 확인 필요)
○ Erlang/OTP가 사용되는 알려진 제품/플랫폼 목록 (그 외 영향받는 시스템 추가 확인 필요)
•
공급업체에서 제공하는 Erlang 배포판을 사용하는 경우 공식 업데이트 참고
제품/플랫폼 | 관련 보안 공지 | 취약 버전 | 보안패치 버전 |
Erlang/OTP | https://github.com/erlang/otp/security/advisories/GHSA-37cp-fgq5-7wc2 | <= OTP-27.3.2
<= OTP-26.2.5.10
<= OTP-25.3.2.19 | OTP-27.3.3
OTP-26.2.5.11
OTP-25.3.2.20 |
Ubuntu | https://ubuntu.com/security/notices/USN-7443-1 | 24.10
24.04 LTS
22.04 LTS
20.04 LTS | erlang,
erlang-ssh 패키지 업데이트 |
NetApp 제품군 | https://security.netapp.com/advisory/ntap-20250425-0001/ | ONTAP Select Deploy administration utility 외 조사 중 | - |
Cisco 제품군 | https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-erlang-otp-ssh-xyZZy | 보안 공지 참조 | 보안 공지 참조 |
SUSE Linux Enterprise | https://www.suse.com/security/cve/CVE-2025-32433.html | 15 SP3~SP6, SAP, HPC 등 | erlang 23.3.4.19 이상 패키지
업데이트 |
openSUSE Leap 15.6 | https://www.suse.com/security/cve/CVE-2025-32433.html | erlang 포함 패키지 | erlang 23.3.4.19 이상 패키지
업데이트 |
4.2. 임시 조치 방안 (패치 적용이 어려운 경우)
○ 방화벽 또는 네트워크 접근 제어로 SSH 접근을 제한하여 공격 표면 최소화
○ 불필요한 Erlang/OTP 기반 SSH 비활성화
○ SNORT 및 YARA룰 적용으로 CVE-2025-32433 탐지 정책 반영
1.
SNORT를 통한 탐지 정책 반영
•
시스코 SNORT (버전:2091101)
alert tcp any any -> $HOME_NET 22 (msg:"IGRSS.1.06703 server-other,Erlang/OTP,SSH,cve-2025-32433, Attempted Administrator Privilege Gain"; flow:to_server,established; flowbits:isset,erlang_ssh_banner; content:"|62|"; depth:1; offset:5; content:"|00 00 00 04|exec"; within:8; distance:4; sid:106703;)
Plain Text
복사
•
윈스 Sniper ONE-I (버전:V3.0.6)
alert tcp any any -> any any (msg:"IGRSS.1.06703 server-other_Erlang/OTP_SSH_cve-2025-32433_Attempted Administrator Privilege Gain"; flow:to_server,established; content:"|62|"; depth:1; offset:5; content:"|00 00 00 04|exec"; within:8; distance:4;)
Plain Text
복사
•
코닉글로리 TESS TMS (버전:V6.0.0.22061)
alert tcp any any -> any any (msg:"IGRSS.1.06703 server-other_Erlang/OTP_SSH_cve-2025-32433_Attempted Administrator Privilege Gain"; flow:to_server,established; content:"|62|"; depth:1; offset:5; content:"|00 00 00 04|exec"; within:8; distance:4;)
Plain Text
복사
2.
YARA를 통한 탐지 정책 반영
•
Erlang/OTP SSH에서 CVE-2025-32433에 취약한 바이너리 탐지 정책
rule IGRYO_00010_VULN_Erlang_OTP_SSH_CVE_2025_32433_Apr25 {
strings:
$a1 = { 46 4F 52 31 ?? ?? ?? ?? 42 45 41 4D }
$s1 = "ssh_connection.erl"
$fix1 = "chars_limit"
$fix2 = "allow macro_log"
$fix3 = "logger"
$fix4 = "max_log_item_len"
condition:
filesize < 1MB
and $a1 at 0 // BEAM file header
and $s1
and not 1 of ($fix*)
}
Plain Text
복사







