PHP2Shell: а что с рунетом-то?

На этой неделе нашли дыру в PHP — языке, на котором работает больше половины сайтов. Через неё чужой человек может запустить на сервере свою программу, и для этого ему не нужен ни пароль, ни доступ к сайту. 21 октября вышли исправления. Прошло четыре дня — а что с рунетом-то? Мы посмотрели на 10 000 самых заметных сайтов и попробовали понять, сколько из них уже закрылись.
Короткий ответ: понять не получается. И это само по себе интересно.
Сколько это сайтов
Из 10 000 самых заметных сайтов рунета удалось понять, на чём работают 7 156. Из них на PHP — 4 315, то есть 60%.
Часть сайтов сама называет свою версию PHP — в служебной строке, которую сервер отдаёт браузеру вместе со страницей:
X-Powered-By: PHP/8.2.34Таких 1 201 — примерно каждый четвёртый сайт на PHP. Все цифры ниже про них. Срез — 25 октября.
Что они говорят о себе
Точки на картинке в начале — эти сайты. По номеру версии они делятся на три группы:
29,9% называют версию, вышедшую до исправления. Например,
8.2.34— а исправление вышло в8.2.35.48,2% называют последнюю версию своей ветки —
5.6.40,7.4.33. Новых версий у этих веток уже не будет.21,9% называют исправленную версию.
Хочется сразу написать «78% сайтов уязвимы». Но так нельзя.
Почему по номеру ничего не понятно
Сам проект PHP выпустил исправленные версии только для свежих веток — 8.2–8.5. Старые ветки латают те, кто собирает PHP для хостингов и серверов: CloudLinux, Ubuntu и другие. И почти всегда они оставляют старый номер.
У CloudLinux первая исправленная сборка 8.4 называлась 8.4.26-2 — номер даже меньше, чем у официального исправления 8.4.27. В Ubuntu 22.04 PHP как был 8.1.2, так и остался, поменялся только хвост пакета: 8.1.2-1ubuntu2.28.
Выходит, PHP/5.6.40 у одного сайта — залатанная сборка от хостинга, у другого — забытый сервер, который годами никто не трогал. Снаружи они выглядят одинаково.

Хвост пакета, по которому можно хоть что-то сказать, показывают 7,8% сайтов. У остальных — голый номер, и по нему не скажешь ни «да», ни «нет».
На чём стоит рунет

Две трети сайтов, которые называют версию, — 65% — работают на ветках PHP, для которых официального исправления нет вообще. Самая людная — PHP 5: на нём треть всех сайтов, которые называют версию. Его перестали поддерживать в 2018 году.
В этот раз им повезло: исправление можно получить от поставщика сборки. Но если следующую дыру поставщик не залатает, сайтам на PHP 5 останется искать другого поставщика исправлений или переезжать на новую версию.
У крупных сайтов исправление видно чаще?

Да: среди сайтов с 101-го по 1 000-е место исправленную версию называют 31,4%, среди сайтов с 1 001-го по 10 000-е — 20,9%. Но это не значит, что крупные быстрее обновляются: у крупного сайта чаще своя сборка с новым номером, у небольшого — хостинг, который залатал PHP под старым.
WordPress, Битрикс и остальные

Дыра в PHP, а не в движке — обновление WordPress или 1С-Битрикс её не закрывает. Но движок подсказывает, кто следит за сайтом. Исправленную версию называют 34,5% сайтов на WordPress, 28,9% — на 1С-Битрикс, 20,5% — на Joomla и 13,4% — сайтов, где движок не определяется.
А хостинги?

Разброс большой: исправленную версию называют от 4,4% сайтов в сети REG.RU до 43,4% — в сети FastVPS. Но рейтингом «кто быстрее залатал» этот график не является.
Посмотрите на Beget: три четверти его сайтов называют последнюю версию своей ветки — номер, который у старых веток больше не меняется. Хотя 22 октября Beget сообщил, что обновил все доступные версии PHP на виртуальном хостинге и серверах под своим администрированием. Обновил — а номер остался прежним. Ровно то, о чём вся эта статья.
Ещё две оговорки. В сети хостинга вперемешку его собственные серверы и VPS клиентов, которые клиенты обновляют сами. А у сайтов за Cloudflare или DDoS-Guard сам PHP работает где-то в другом месте. И версию показывают очень по-разному: у одних хостингов — 72% сайтов, у других — меньше процента.
Главное, что меняется по дням?

К концу 22 октября, через полтора дня после выхода исправлений, исправленную версию называли 248 сайтов. Потом — плюс 10, плюс 4 и плюс 1 за день. Кто обновлялся с новым номером, сделал это почти сразу, дальше — тишина.
Но тишина на графике не значит, что больше никто не латает: сборка со старым номером в эти столбики не попадает.
Так что с рунетом?
Снаружи точно сказать нельзя — ни нам, ни тем, кто напишет «78% сайтов уязвимы». Исправление часто приходит под старым номером, и по ответу сайта его не видно. Знают только те, у кого есть доступ к самому серверу: владелец или хостинг.
Графики обновляются каждый день — в исследовании Параграфа и на странице уязвимости в Пульсе Рунета.
Источники: бюллетень PHP, GHSA-6wmf-4rv5-p3rp, GHSA-w8hw-w9fx-j79w, CloudLinux, Ubuntu USN-8948-1, Beget.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.