
Бэкдор User-Agentt в PHP 8.1.0-dev: удаленное выполнение кода (RCE)
User-Agentt: бэкдор удаленного выполнения кода (RCE)Критичность: критическая (эквивалент CVSS: 10.0)
Тип уязвимости: бэкдор в цепочке поставок / удаленное выполнение кода (RCE)
Затронутое ПО: PHP 8.1.0-dev (только dev-сборка)
Вектор атаки: удаленный (без аутентификации)
Требуется аутентификация: нет
Взаимодействие с пользователем: не требуется
Воздействие: полная компрометация системы
Бэкдор PHP 8.1.0-dev User-Agentt — одна из самых громких компрометаций цепочки поставок в истории open-source ПО. В отличие от традиционных уязвимостей, возникающих из-за ошибок программирования, эта проблема стала результатом намеренного внедрения вредоносного кода в официальный репозиторий исходного кода PHP.
Бэкдор появился в dev-сборках PHP 8.1.0-dev в марте 2021 года после того, как злоумышленники успешно скомпрометировали Git-инфраструктуру PHP. Вредоносные коммиты выдавались за действия доверенных мейнтейнеров PHP и внедряли скрытый механизм, способный выполнять произвольный PHP-код при получении специально сформированного HTTP-заголовка.
Хотя бэкдор просуществовал недолго, прежде чем был обнаружен и удален, любой сервер, развернувший одну из скомпрометированных dev-сборок, мгновенно становился уязвимым к неаутентифицированному удаленному выполнению кода (RCE).
Этот инцидент коренным образом изменил процесс разработки PHP и в конечном итоге привел к переносу репозитория исходного кода PHP с собственной Git-инфраструктуры. :contentReference[oaicite:0]{index=0}
Большинство уязвимостей удаленного выполнения кода возникают из-за:
Эта уязвимость была другой.
Это был не баг в коде.
Это был преднамеренно внедренный бэкдор, скрытый внутри легитимного исходного кода PHP.
Вместо эксплуатации существующей слабости злоумышленники изменили сам PHP, чтобы он выполнял произвольный PHP-код, переданный любым человеком, отправляющим HTTP-запрос.
Это делает данный инцидент одним из самых известных примеров атаки на цепочку поставок ПО.
28 марта 2021 года в Git-репозитории PHP появились два подозрительных коммита.
Оба коммита выглядели так, будто были сделаны известными мейнтейнерами PHP.
Изначально они выглядели безобидно.
Сообщения коммитов напоминали обычные исправления опечаток.
Однако исследователи быстро заметили подозрительный код, добавленный в интерпретатор PHP.
Вставленный код искал во входящих HTTP-запросах кастомный заголовок:
User-Agentt
Обратите внимание на лишнюю «t».
Это едва заметное отличие в написании помогало скрывать бэкдор при поверхностном ревью.
Если заголовок начинался со строки-триггера:
zerodium
PHP немедленно выполнял все, что следует за ней, с помощью:
zend_eval_string()
Это фактически позволяло любому удаленно выполнять произвольный PHP-код.
Вредоносные коммиты были удалены в течение нескольких часов после обнаружения. Последующее расследование показало, что злоумышленники скомпрометировали Git-инфраструктуру PHP, а не законно получили ключи подписи мейнтейнеров. :contentReference[oaicite:1]{index=1}
Вставленный код выполнял примерно следующую логику:
Incoming HTTP Request
│
▼
Read User-Agentt Header
│
▼
Does header start with "zerodium"?
│
Yes ▼
Execute remaining text as PHP
│
▼
Attacker gains Remote Code Execution
Вместо того чтобы обрабатывать заголовок как безобидные метаданные, PHP выполнял его напрямую как исполняемый PHP-код.
Обычно HTTP-запрос содержит заголовки, подобные следующим:
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Firefox
Скомпрометированная версия PHP дополнительно обрабатывала:
User-Agentt:
Если его значение начиналось с:
zerodium
PHP вызывал:
zend_eval_string()
Оставшееся содержимое становилось исполняемым PHP-кодом.
Схематично:
User-Agentt:
zerodium
│
▼
zend_eval_string(payload)
│
▼
Remote Code Execution
Attacker
│
│ HTTP Request
▼
GET /
User-Agentt: zerodiumsystem("id");
│
▼
PHP 8.1.0-dev
│
▼
Backdoor Triggered
│
▼
system("id")
│
▼
Command Executed
│
▼
Output Returned
Без аутентификации.
Без сессии.
Без учетных данных.
Достаточно было одного HTTP-запроса.
Злоумышленники намеренно выбрали
User-Agentt
вместо
User-Agent
потому что:
Эта крошечная опечатка скрывала полноценный бэкдор удаленного выполнения кода.
Только:
PHP 8.1.0-dev
А именно скомпрометированные dev-сборки, опубликованные в период инцидента в марте 2021 года.
Стабильные релизы, такие как:
никогда не были затронуты.
Злоумышленнику требовалось только:
Без аутентификации.
Без брутфорса.
Без входа в систему.
Без предварительного доступа.
Успешная эксплуатация позволяет злоумышленникам:
На практике эта уязвимость приводит к полной компрометации сервера.
Администраторам следует немедленно проверить системы, которые раскрывают:
PHP/8.1.0-dev
в заголовках ответов, например:
X-Powered-By:
PHP/8.1.0-dev
Журналы HTTP-запросов также следует проверить на подозрительные запросы, содержащие:
User-Agentt
или
zerodium
Многие системы обнаружения вторжений и IPS-продукты теперь включают сигнатуры именно для этого вектора атаки. :contentReference[oaicite:2]{index=2}
Возможные индикаторы включают:
User-Agenttzerodium| Свойство | Значение |
|---|---|
| Аутентификация | Не требуется |
| Взаимодействие с пользователем | Не требуется |
| Сложность | Очень низкая |
Эта уязвимость считается одной из самых простых для эксплуатации среди уязвимостей удаленного выполнения кода, поскольку злоумышленнику достаточно отправить специально сформированный HTTP-запрос.
Никогда не развертывайте dev-сборки PHP на производственных системах.
Если обнаружен сервер, работающий на скомпрометированной сборке:
Этот инцидент продемонстрировал несколько важных уроков:
Компрометация ускорила изменения в инфраструктуре разработки PHP и подчеркнула растущую важность безопасности цепочек поставок ПО во всей отрасли. :contentReference[oaicite:3]{index=3}
Бэкдор PHP 8.1.0-dev User-Agentt остается одним из самых значимых примеров атаки на цепочку поставок ПО, затронувшей крупный open-source проект. Вместо эксплуатации ошибки в коде злоумышленники внедрили скрытый бэкдор непосредственно в исходный код языка, что позволяло без аутентификации выполнять произвольный PHP-код через специально сформированный HTTP-заголовок User-Agentt. Хотя скомпрометированные dev-сборки были быстро удалены и ни один стабильный релиз PHP не пострадал, инцидент подчеркнул критическую важность защиты инфраструктуры разработки ПО, проверки происхождения кода и отказа от развертывания dev-сборок в производственных средах. Сегодня эта уязвимость широко изучается как знаковый случай в области безопасности цепочек поставок и служит напоминанием о том, что целостность процесса сборки ПО не менее важна, чем безопасность самого кода.
| Техника | Описание |
|---|
| T1195 | Компрометация цепочки поставок |
| T1059 | Интерпретатор команд и сценариев |
| T1505 | Компонент серверного ПО |
| T1105 | Передача инструментов извне |
| T1071 | Протокол прикладного уровня |
| T1106 | Нативный API |
| T1055 | Внедрение в процессы (возможно на этапе пост-эксплуатации) |
| T1027 | Обфусцированные файлы или информация |
| Требуемые привилегии |
| Не требуются |
| Удаленно | Да |