Рубріки: Новости

Пароли Git-репозитория языка PHP хранились ненадежно

Богдан Мирченко

Разработчик и сопровождающий языка программирования PHP Никита Попов рассказал новые детали об инциденте, связанном с безопасностью git.php.net.

По словам Никиты Попова, когда первый вредоносный коммит был внедрен от имени создателя PHP Расмуса Лердорфа, его первоначальной реакцией было отменить изменение и отозвать доступ на коммит для учетной записи Расмуса. Он исходил из предположения, что учетная запись была скомпрометирована. Но, как Попов понял позже, это действие не имело смысла, потому что не было оснований полагать, что атака произошла через аккаунт Расмуса: любая учетная запись с доступом к репозиторию php-src могла выполнить атаку под вымышленным именем.

Когда второй вредоносный коммит был внедрен уже от имени Никиты Попова, он просмотрел журналы установки gitolite, чтобы определить, какая учетная запись на самом деле использовалась для атаки. Хотя все смежные коммиты были учтены, записи git-receive-pack для двух вредоносных коммитов отсутствовали, что означало, что эти два коммита полностью обошли инфраструктуру gitolite. Это специалисты интерпретировали как вероятное свидетельство взлома сервера.

Вскоре после этого в PHP решили прекратить работу с git.php.net и вместо этого сделать GitHub основным хостом репозитория. По словам Никиты Попова, сохранение собственной инфраструктуры Git потребовало бы настройки нового сервера git.php.net после определения основной причины компрометации. Это заняло бы много времени и нарушило бы разработку PHP. Выбор пал на базовую миграцию на GitHub, поскольку большинство репозиториев уже были зеркальными. 

Согласно заявлению Попова, в то время он не знал, что git.php.net поддерживает отправку изменений не только через SSH (с использованием инфраструктуры gitolite и криптографии с открытым ключом), но и через HTTPS. Последний не использовал gitolite, а вместо этого использовал git-http-backend аутентификации Apache2 Digest в базе данных пользователей master.php.net

Основываясь на журналах доступа, в PHP определили, что коммиты были отправлены с использованием HTTPS и аутентификации на основе пароля. Отрывок из соответствующих записей журнала представлен ниже:

[redacted] - rasmus@[redacted] [27/Mar/2021:19:19:23 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - rasmus@[redacted] [27/Mar/2021:19:19:28 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - rasmus [27/Mar/2021:20:56:51 -0700] "GET
/push/php-src.git/info/refs?service=git-receive-pack HTTP/1.1" 200 125315
[redacted] - rasmus [27/Mar/2021:20:58:13 -0700] "POST
/push/php-src.git/git-receive-pack HTTP/1.1" 200 1080
[redacted] - nikita.ppv [28/Mar/2021:09:09:15 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikita.ppv [28/Mar/2021:09:09:18 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikitappv [28/Mar/2021:09:09:35 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikitappv [28/Mar/2021:09:09:36 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikita [28/Mar/2021:09:09:50 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikita [28/Mar/2021:09:09:53 -0700] "GET
/push/php-src.git/info/refs?service=git-upload-pack HTTP/1.1" 401 941
[redacted] - nikic [28/Mar/2021:09:11:31 -0700] "GET
/push/php-src.git/info/refs?service=git-receive-pack HTTP/1.1" 401 941
[redacted] - nikic [28/Mar/2021:09:11:31 -0700] "GET
/push/php-src.git/info/refs?service=git-receive-pack HTTP/1.1" 401 941
[redacted] - nikic [28/Mar/2021:09:13:28 -0700] "GET
/push/php-src.git/info/refs?service=git-receive-pack HTTP/1.1" 200 123263
[redacted] - nikic [28/Mar/2021:09:13:39 -0700] "POST
/push/php-src.git/git-receive-pack HTTP/1.1" 200 1079

Никита Попов отмечает, что злоумышленнику удавалось успешно проходить аутентификацию с нескольких заходов. И хотя у команды PHP нет никаких конкретных доказательств, возможное объяснение — утечка пользовательской базы данных master.php.net. Вот что уже сделано для повышения безопасности системы: 

  • master.php.net переведен на новую систему, работающую под управлением PHP 8, и одновременно переименован в main.php.net.
    Новая система будет поддерживать TLS 1.2;
  • реализация перемещена в сторону использования параметризованных запросов, чтобы исключить возможность внедрения SQL-кода;
  • пароли теперь хранятся с использованием адаптированной; криптографической хеш-функции формирования ключей bcrypt;
  • ранее пароли хранились в формате, совместимом с аутентификацией HTTP Digest (по сути, это простой хеш md5). Все пароли php.net были сброшены. Установить новый пароль можно здесь;
  • серверы git.php.net и svn.php.net теперь доступны только для чтения.

Один из пользователей Reddit отметил, что, если это была хеш-атака, и учитывая закономерности HTTP-аутентификации, фактический ключ доступа для пользователей хранился в базе данных в виде обычного текста, что и могло привести к утечке.

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024