Звіт про компрометацію git-репозиторію та бази користувачів проекту PHP

Опубліковано перші результати аналізу інциденту, пов'язаного з виявленням в Git-репозиторії проекту PHP двох шкідливих коммітів з бекдором, що активується при передачі запиту зі спеціально оформленим заголовком User Agent. У ході вивчення слідів діяльності атакуючих було зроблено висновок, що безпосередньо сервер git.php.net, на якому був розміщений git-репозиторій, не був зламаний, але була скомпрометована база даних з обліковими записами розробників проекту.

Не виключається, що зловмисники змогли завантажити базу користувачів, що зберігалася у СУБД на сервері master.php.net. Вміст master.php.net вже перенесено на новий сервер main.php.net, встановлений з нуля. Всі паролі розробників, які використовувалися для доступу до інфраструктури php.net, були скинуті та ініційовані процес їх зміни через спеціальну форму відновлення пароля. Репозиторії git.php.net та svn.php.net залишаються доступними в режимі тільки для читання (розробка перенесена на GitHub).

Після виявлення першого шкідливого комміта, здійсненого через обліковий запис Расмуса Лердорфа, засновника PHP, було зроблено припущення, що зламано його обліковий запис і Микита Попов, один із ключових розробників PHP, відкотив зміни та блокував права коміту для проблемного облікового запису. Через якийсь час прийшло усвідомлення, що блокування не мало сенсу, оскільки без верифікації комітів з цифрового підпису будь-який учасник з доступом до репозиторію php-src міг внести зміну, підставивши фіктивне ім'я автора.

Услід атакуючі відправили шкідливий коміт від імені самого Микити. Через аналіз логів сервісу gitolite, що застосовується для організації доступу до репозиторій, була спроба визначення учасника, який дійсно вніс зміни. Незважаючи на включений облік всіх коммітів, для двох шкідливих змін у лозі не було записів. Стало зрозуміло, що має місце компрометація інфраструктури, оскільки комміти додані безпосередньо, в обхід підключення через gitolite.

Оперативно було відключено сервер git.php.net, а первинний репозиторій переведено на GitHub. Похапцем було втрачено на увазі те, що для доступу до репозиторію крім SSH з використанням gitolite був ще один вхід, що дозволяє відправляти коміти через HTTPS. В даному випадку для взаємодії з Git використовувався бекенд git-http-backend, а автентифікація виконувалася за допомогою HTTP-сервера Apache2, який перевіряв повноваження через звернення до бази даних, розміщеної в СУБД на сервері master.php.net. Допускався вхід не лише за ключами, а й за звичайним паролем. Розбір логів http-сервера підтвердив, що шкідливі зміни були додані через HTTPS.

При вивченні ліг було виявлено, що атакуючі підключилися не з першого разу, а спочатку намагалися підібрати ім'я облікового запису, але після визначення увійшли з першої спроби, тобто. вони заздалегідь знали паролі Расмуса та Микити, але не знали їхньої логіни. Якщо атакуючі змогли отримати доступ до СУБД, то незрозуміло, чому вони відразу не використовували вказаний коректний логін. Ця нестиковка поки не отримала достовірного пояснення. Злом master.php.net розглядається як найімовірніший сценарій, тому що на даному сервері був використаний дуже старий код та застаріла ОС, які давно не оновлювалися та мали невиправлені вразливості.

З вжитих дій відзначається переустановка оточення сервера master.php.net і переклад скриптів на нову версію PHP 8. Код для роботи з СУБД перероблено для використання параметризованих запитів, що ускладнюють підстановку SQL-коду. Для зберігання хешей паролів у БД задіяно алгоритм bcrypt (раніше паролі зберігалися з використанням ненадійного хеша MD5). Існуючі паролі скинуті та запропоновано встановити новий пароль через форму відновлення пароля. Так як доступ до репозиторій git.php.net і svn.php.net по HTTPS був прив'язаний до хеш MD5, вирішено залишити git.php.net і svn.php.net в режимі тільки для читання, а також перенести всі залишаються на них репозиторії розширень PECL на GitHub, за аналогією з основним репозиторієм PHP.

Джерело: opennet.ru

Додати коментар або відгук