Недавний взлом PHP как ещё один повод задуматься о текущем состоянии языка
В каком состоянии PHP находится сейчас? В этом видео автор разбирает недавний взлом PHP и рассуждает о сферах его применения в 2021 году.
3К открытий3К показов
Не так давно хакеры взломали Git-репозиторий PHP для добавления бэкдоров в исходный код языка. Это породило новый виток обсуждений о языке и его месте в современной разработке.
Кратко напомню суть истории.
Исходники PHP хранились не на GitHub (на нём было только зеркало), GitLab или Bitbucket, а на собственном Git-сервере git.php.net. Этот сервер взломали и сделали коммиты от лица известных разработчиков PHP. Название подобрали безобидное: Fix typo, то есть изменение как будто коснулось исправления опечатки в комментарии или в документации.
Но на самом деле всё не так просто. Разберём код:
- На 366 строчке злоумышленник получает значение заголовка HTTP_USER_AGENTT в двумя буквами T на конце.
- На 368 строчке проверяет, что текст в заголовке начинается со слова zerodium.
- Если условие верное, с 369 по 371 строчку выполняется попытка интерпретировать текст из заголовка HTTP_USER_AGENTT как PHP-код и исполнить его.
Эти изменения затронули ветки разработки для версии PHP 8.1, выпуск которой запланирован на конец 2021 года.
Какие проблемы мог принести взлом PHP
Допустим, никто не заметил, коммит попал в сборку и разошелся по всем источникам, включая официальные репозитории для пакетных менеджеров ОС Linux. Разработчики обновили бы PHP из официального репозитория и запустили свои сервисы на последней версии PHP. Что это даёт? Что можно сделать?
С этого момента можно отправить абсолютно любой запрос на сервер с последней версией PHP. В этот запрос можно добавить заголовок с именем HTTP_USER_AGENTT. Значением может быть любой PHP-код.
Например, мы добавим строку, начинающуюся со слова zerodium. Далее будет PHP-код, который выкачает бинарник по ссылке, положит его в папку /tmp и запустит. В свою очередь, этот бинарник выкачает другой бинарник, который уже может содержать в себе вредоносный код для взлома и предоставления доступа к этой операционной системе злоумышленнику.
Такой сценарий был бы возможен для ЛЮБОГО сервера где развернуто PHP-приложение. В широко известных сообществах в узких кругах даже пошли шутки, что слово zerodium является паролем к PHP.
Конечно, такую ситуацию и представить страшно, а допустить и вовсе было бы эпик-фейлом. Поэтому хорошо, что разработчики PHP заметили проблему и ревертнули коммит. Но хакеры ещё раз ревертнули реверт коммита. Скорее всего, после этого разработчики приняли решение перенести репозиторий со своего сервера на GitHub и ещё раз ревертнули коммит, который ревертил коммит, который ревертил коммит злоумышленика, чтобы избежать ещё одного реверта.
Нынешнее состояние PHP
Я не большой любитель PHP. Меня приводит в панику его синтаксис, особенно стрелочка для вызова методов. Везде через точку, здесь — через стрелочку. Возможно, этому есть объяснение, но в целом неважно, выглядит ужасно.
У самого языка нет ни одного значимого преимущества перед Python или Java, чтобы на нём что-то разрабатывать. Один Xdebug чего стоит. С одной стороны, мощное средство дебаггинга. С другой стороны, работает на сервере и пожирает ресурсы VPS, купленной специально для командной разработки и тестирования.
PHP сегодня — это, по сути, поддержка legacy-кода и CMS вроде WordPress, Drupal и других. Даже новые CMS иногда пишут на PHP. А к ним надо писать плагины. Поэтому нет, PHP живее всех живых, пока есть мелкие интернет-магазины, коих тысячи. Их надо поддерживать, улучшать. А ещё — создавать новые плагины для CMS. Пока вся эта экосистема жива и использует PHP, язык тоже будет жить.
Какие-то новые проекты тоже пишутся на PHP, но особого смысла в этом нет, когда есть Golang, Rust, Python, да тот же C# и Java. По сути, у каждого языка есть своя ниша, хотя они все и являются языками общего назначения. Ниша PHP всегда была там, где нужно разработать быстрый MVP, проверить гипотезу и не заплатить много денег. Ну и CMS, куда же без них.
По сути, CMS и является сейчас основной нишей языка. Примерно такая же ситуация с Java. Много enterprise legacy-кода, который надо поддерживать и развивать, но при выборе языка для микросервиса скорее возьмут Python, Golang или Rust/Ruby, чем PHP или Java.
3К открытий3К показов