Уязвимость, позволявшая выпустить обновление для любого пакета в репозитории NPM

Компания GitHub раскрыла информацию о двух инцидентах в инфраструктуре репозитория пакетов NPM. 2 ноября сторонние исследователи безопасности (Kajetan Grzybowski и Maciej Piechota) в рамках программы Bug Bounty сообщили о наличии в репозитории NPM уязвимости, позволяющей опубликовать новую версию любого пакета, используя для этого свою учётную запись, не авторизированную для выполнения подобных обновлений.

Уязвимость была вызвана некорректной проверкой полномочий пользователей в коде микросервисов, обрабатывающих запросы с NPM. Сервис авторизации выполнял проверку прав доступа к пакетам на основе данных, передаваемых в запросе, но другой сервис, загружающий обновление в репозиторий, определял пакет для публикации на основе содержимого метаданных в загруженном пакете. Таким образом атакующий мог запросить публикацию обновления для своего пакета, к которому он имеет доступ, но указать в самом пакете информацию о другом пакете, который и был бы в итоге обновлён.

Проблема была устранена через 6 часов после появления информации об уязвимости, но проблема присутствовала в NPM дольше, чем охватывают логи с телеметрией. GitHub утверждает, что следов совершения атак с использованием данной уязвимости с сентября 2020 года не зафиксировано, но нет гарантий, что проблема не экслуатировалась раньше.

Второй инцидент произошёл 26 октября. В ходе технических работ с базой данной сервиса replicate.npmjs.com было выявлено присутствие в доступной для внешних запросов БД конфиденциальных данных, раскрывающих информацию о именах внутренних пакетов, которые упоминались в логе изменений. Информация о подобных именах может быть использована для совершения атак на зависимости во внутренних проектах (в феврале подобная атака позволила выполнить код на серверах PayPal, Micrоsoft, Apple, Netflix, Uber и ещё 30 компаний).

Кроме того, в связи с участившимися случаями захвата репозиториев крупных проектов и продвижения вредоносного кода через компрометацию учётных записей разработчиков, компания GitHub приняла решение ввести обязательную двухфакторную аутентификацию. Изменение вступит в силу в первом квартале 2022 года и будет распространяться на сопровождающих и администраторов пакетов, включённых в список наиболее популярных. Дополнительно сообщается о модернизации инфраструктуры, в которой будет внедрён автоматизированный мониторинг и анализ новых версий пакетов для раннего выявления вредоносных изменений.

Напомним, что в соответствии с проведённым в 2020 году исследованием, лишь 9.27% мэйнтенеров пакетов используют для защиты доступа двухфакторную аутентификацию, а в 13.37% случаев при регистрации новых учётных записей разработчики пытались повторно использовать скомпрометированные пароли, фигурирующие в известных утечках паролей. В ходе проверки надёжности используемых паролей удалось получить доступ к 12% аккаунтов в NPM (13% пакетов) из-за использования предсказуемых и тривиальных паролей, таких как “123456”. В числе проблемных оказались 4 учётные записи пользователей из Top20 самых популярных пакетов, 13 учётных записей, пакеты которых загружали более 50 млн раз в месяц, 40 – более 10 млн загрузок в месяц и 282 с более 1 млн загрузок в месяц.
С учётом загрузки модулей по цепочке зависимостей, компрометация ненадёжных учётных записей могла поразить в сумме до 52% от всех модулей в NPM.

Release. Ссылка here.