[하루한줄] CVE-2025-0108: PAN-OS Nginx/Apache Path Confusion을 통한 인증 우회 취약점

URL

https://www.assetnote.io/resources/research/nginx-apache-path-confusion-to-auth-bypass-in-pan-os

Target

  • PAN-OS 10.2.x < 10.2.13-h3
  • PAN-OS 11.0.x < 11.1.6-h1
  • PAN-OS 11.2.x < 11.2.4-h4

Explain

CVE-2025-0108은 Palo Alto Networks PAN-OS의 방화벽 관리 인터페이스에서 발견된 인증 우회 취약점입니다. Assetnote 연구팀이 CVE-2024-0012 및 CVE-2024-9474의 패치를 분석하는 과정에서 발견되었습니다.

이전 취약점들(CVE-2024-0012 및 CVE-2024-9474)은 공격자들이 PAN-OS 방화벽을 무력화하여 루트 권한을 획득하는 데 악용되었고, 해당 취약점의 패치 과정을 분석하는 중, 연구팀은 PAN-OS 관리 인터페이스 내에서 취약점을 발견했고, 이를 통해 CVE-2025-0108이라는 새로운 인증 우회 취약점을 발견했습니다.

이 취약점은 Nginx → Apache → PHP로 이어지는 복잡한 인증 처리 과정에서 발생하는 Path Confusion 및 URL 이중 디코딩(Double URL Decoding) 문제를 이용하여 인증을 우회하는 방식으로 작동합니다.
PAN-OS의 관리 인터페이스는 다음과 같은 방식으로 웹 요청을 처리합니다:

1. Nginx 단계

클라이언트의 요청을 수신하고, X-pan-AuthCheck 헤더를 설정하여 인증이 필요한지 여부를 결정합니다. 이후 특정 경로(/unauth/ 포함)를 포함한 요청을 인증이 필요 없는 것으로 처리할 수 있습니다.

if ($uri ~ ^\/unauth\/.+$) {
  set $panAuthCheck 'off';
}

이로 인해 /unauth/ 경로를 포함하는 요청들은 X-pan-AuthCheck: off가 설정되며, 인증이 필요하지 않은 것으로 처리됩니다.


2. Apache 단계

Nginx에서 전달된 요청을 다시 처리하고, mod_rewrite를 통해 특정 경로를 재작성합니다.

<Location "/">
    DirectorySlash off
    RewriteEngine on
    RewriteRule ^(.*)(\/PAN_help\/)(.*)\.(css|js|html|htm)$ $1$2$3.$4.gz [QSA,L]
    AddEncoding gzip .gz

    Options Indexes FollowSymLinks
    Require all granted
</Location>
  • 요청이 Apache로 전달되면, Apache는 다시 경로를 해석하고 내부 리디렉션을 수행합니다.
  • 이 과정에서 URL이 한 번 더 디코딩됨으로 인해 Path Confusion이 발생할 가능성이 생깁니다.

3. PHP 단계

Apache에서 전달된 요청을 기반으로 실제 인증 여부를 판단하고 요청을 처리합니다.

if (
    $_SERVER['HTTP_X_PAN_AUTHCHECK'] != 'off'
    && $_SERVER['PHP_SELF'] !== '/CA/ocsp'
    && $_SERVER['PHP_SELF'] !== '/php/login.php'
    && stristr($_SERVER['REMOTE_HOST'], '127.0.0.1') === false
) {
    // ... check authentication ...
}
  • 요청이 PHP 애플리케이션으로 전달될 때 X-pan-AuthCheck: off 상태라면, 인증이 불필요한 것으로 간주됩니다.

Apache의 경로 재해석 문제

Apache는 RewriteRule을 처리할 때 내부 리디렉션(Internal Redirect)을 수행하는데, 이 과정에서 URL이 다시 한 번 디코딩됩니다.

RewriteRule (.*)\.abc$ $1 [L]

이중 디코딩이 발생하는 문제를 이용하면, 공격자는 이중 URL 인코딩(Double Encoding)을 활용하여 인증 우회를 시도할 수 있습니다.


공격자는 아래와 같은 요청을 전송하여 인증을 우회할 수 있습니다:

GET /unauth/%252e%252e/php/ztp_gate.php/PAN_help/x.css HTTP/1.1
Host: target.firewall
Connection: close

요청이 처리되는 과정

  1. Nginx 처리
    • %252e%252e는 첫 번째 URL 디코딩에서 %2e%2e(..)로 변환됨
    • /unauth/%2e%2e/php/ztp_gate.php/PAN_help/x.css 경로가 /unauth/를 포함하므로 X-pan-AuthCheck: off가 설정됨 (즉, 인증 불필요)
  2. Apache 처리
    • Apache가 해당 경로를 재처리하며 내부 리디렉션 수행
    • %2e%2e가 다시 디코딩되어 실제 요청 경로가 /php/ztp_gate.php/PAN_help/x.css로 변경됨
    • Apache는 이 요청을 정상적인 PHP 실행 요청으로 판단하여 ztp_gate.php를 실행
  3. PHP 실행
    • 요청이 /php/ztp_gate.php로 전달되었으며, X-pan-AuthCheck: off 상태이므로 인증 없이 실행됨

이 취약점은 PAN-OS 10.2.13-h3, 11.1.6-h1, 11.2.4-h4 이후 버전에서 패치되었습니다.