PHP пересобрал официальные пакеты для версий 8.2–8.5 на Windows, чтобы устранить CVE-2026-111497 — уязвимость в библиотеке сжатия Brotli. Она позволяет злоумышленнику повредить память и потенциально выполнить код.
Уязвимость становится доступна через расширение cURL, когда оно автоматически распаковывает HTTP-ответы. В cURL эта функция отключена по умолчанию, но приложения и HTTP-клиенты могут её активировать.
Пересобранные пакеты версий 8.5.12-1, 8.4.27-1, 8.3.36-1 и 8.2.35-1 вышли через пять дней после октябрьского обновления от 21-го числа, которое закрыло две уязвимости PHP2Shell с возможностью удалённого выполнения кода. Они содержат тот же исходный код PHP, поэтому те исправления остаются в силе, но теперь включают Brotli 1.2.1 — исправленную версию.
PHP публикует список компонентов для каждого пакета. В сборках x64 Non Thread Safe от прошлой недели для всех четырёх версий указана Brotli 1.2.0 — одна из уязвимых версий.
PHP рекомендует пользователям Windows установить новые сборки со своей страницы загрузок. Поскольку сам PHP не обновился, команда php -v выведет тот же номер версии до и после обновления. Определить новую сборку помогают суффикс -1 в имени файла (например php-8.5.12-1-nts-Win32-vs17-x64.zip) и хеш SHA-256 на странице загрузок.
Автоматическое распаковывание означает, что cURL запрашивает сжатый ответ и распаковывает его. В коде PHP это включает опция CURLOPT_ENCODING, а пустое значение принимает все форматы, которые поддерживает cURL.
Guzzle — PHP-библиотека HTTP-клиента — устанавливает это пустое значение по умолчанию для своих запросов через cURL, согласно коду в версиях 7.16.1 и 8.3.1. Приложение, которое сохраняет стандартные параметры Guzzle, соответствует условиям для доступа к уязвимости в сборках Windows от прошлой недели. Практическая проверка на Windows системе не проводилась.
Атака поступит в виде специально составленного сжатого ответа от сервера, к которому подключается PHP-приложение.
Google оценивает уязвимость в 9.2 балла из 10 (Critical) по шкале CVSS 4.0. Red Hat — в 8.1 балла (Important) по CVSS 3.1.
Исследователи Imperva протестировали код через уязвимость в официальной сборке Node.js и потребовалось несколько попыток. В заявлении PHP о проблеме не упоминаются активные атаки. По оценке CISA от 23 октября случаев эксплуатации не было, и уязвимость не включена в каталог Known Exploited Vulnerabilities по состоянию на эту дату.
Уязвимость обнаружили исследователи OpenAI. Google исправил её в Brotli 1.2.1, 1.1.1 и 1.0.10 при раскрытии 21 октября. Node.js, Bun и другое ПО, которое поставляет свою копию Brotli, также выпустили исправления.
PHP не предлагает временного решения для систем, которые пока нельзя обновить. OpenAI рекомендует отключить автоматическое распаковывание Brotli в HTTP-клиентах до установки обновления и предупреждает, что удаление br (имя Brotli в заголовке Accept-Encoding) само по себе не предотвратит отправку сервером сжатого контента.
В коде PHP это означает не устанавливать CURLOPT_ENCODING, так как cURL не распаковывает ответы без этой опции. В Guzzle — установить опцию decode_content для запроса в false, что отключит все автоматическое распаковывание и ответы в gzip придут упакованными.
