Ad

CVE-2026-69246

HIGH CVSS 3.1: 7,2
Обновлено 4 августа 2026
PHP
Параметр Значение
CVSS 7,2 (HIGH)
Тип уязвимости CWE-180, CWE-918 (Подделка запросов на стороне сервера (SSRF)), CWE-436, CWE-941
Поставщик PHP
Публичный эксплойт Нет

Guzzle — это расширяемый PHP HTTP-клиент. До версий 7.15.2 и 8.0.1 Guzzle передает транспортный URI запроса в виде текста и отдельно предоставляет заголовок Host. Обработчики cURL устанавливают CURLOPT_URL в URI точно так, как написано, и помещают этот хост в CURLOPT_HTTPHEADER; StreamHandler делает то же самое через fopen().

Затем libcurl анализирует сам авторитет, декодирует его в процентах и, в сборке с поддержкой IDN, применяет сопоставление IDNA и использует результат для разрешения, подключения, присвоения имени одноранговому узлу TLS и адреса прокси-сервера CONNECT, в то время как предоставленный хост подавляет выровненный, который мог бы сгенерировать libcurl. Для хоста URI, записанного как 127.0.0.%31, filter_var() отклоняет хост как литерал IP, однако libcurl декодирует его до 127.0.0.1 и достигает обратной связи без поиска DNS, в то время как сервер получает Host: 127.0.0.%31. Таким образом, злоумышленник, который влияет на полученный URI, может добраться до хоста, из которого исключены проверки приложения, и прочитать все, что хост предоставляет в ответе.

То же самое расхождение переносит собственные решения Guzzle на написание, которое транспорт не использует: no_proxy выбирает маршрутизацию прокси-сервера от буквального хоста, а RedirectMiddleware решает на его основе, следует ли удалять авторизацию и cookie. Для эксплуатации требуется, чтобы приложение создало URI запроса на основе ненадежных входных данных и приняло решение хоста, прежде чем передать его в Guzzle. Эта проблема исправлена ​​в версиях 7.15.2 и 8.0.1.

Показать оригинальное описание (EN)

Guzzle is an extensible PHP HTTP client. Prior to 7.15.2 and 8.0.1, Guzzle gives a transport the request URI as text and supplies the Host header separately. The cURL handlers set CURLOPT_URL to the URI exactly as written and push that Host into CURLOPT_HTTPHEADER; StreamHandler does the same through fopen(). libcurl then parses the authority itself, percent-decoding it and, on an IDN-capable build, applying IDNA mapping, and uses the result to resolve, connect, name the TLS peer and address a proxy CONNECT, while the supplied Host suppresses the aligned one libcurl would have generated. For a URI host written as 127.0.0.%31, filter_var() rejects the host as an IP literal, yet libcurl decodes it to 127.0.0.1 and reaches loopback with no DNS lookup while the server receives Host: 127.0.0.%31. An attacker who influences a fetched URI can therefore reach a host the application's checks excluded and read whatever the host exposes of the response. The same divergence moves Guzzle's own decisions onto a spelling the transport does not use: no_proxy selects proxy routing from the literal host, and RedirectMiddleware decides from it whether to strip Authorization and Cookie. Exploitation requires the application to build a request URI from untrusted input and to make a host decision before handing it to Guzzle. This issue is fixed in versions 7.15.2 and 8.0.1.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Низкая
Легко эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Низкое
Частичная утечка данных
Целостность
Низкое
Частичная модификация данных
Доступность
Нет
Нет нарушения работы

Строка CVSS v3.1