Недавний взлом PHP как ещё один повод задуматься о текущем состоянии языка

Обложка: Недавний взлом PHP как ещё один повод задуматься о текущем состоянии языка

Не так давно хакеры взломали Git-репозиторий PHP для добавления бэкдоров в исходный код языка. Это породило новый виток обсуждений о языке и его месте в современной разработке.

Кратко напомню суть истории.

Исходники PHP хранились не на GitHub (на нём было только зеркало), GitLab или Bitbucket, а на собственном Git-сервере git.php.net.  Этот сервер взломали и сделали коммиты от лица известных разработчиков PHP. Название подобрали безобидное: Fix typo, то есть изменение как будто коснулось исправления опечатки в комментарии или в документации.

Но на самом деле всё не так просто. Разберём код:

  1. На 366 строчке злоумышленник получает значение заголовка HTTP_USER_AGENTT в двумя буквами T на конце.
  2. На 368 строчке проверяет, что текст в заголовке начинается со слова zerodium.
  3. Если условие верное, с 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.