Взлом одного-единственного аккаунта на GitHub обернулся крупнейшей за последние месяцы эпидемией в мире программирования: заражённый код за несколько часов расползся по сотням библиотек, которыми пользуются миллионы разработчиков по всему миру, включая российских.
4 августа кто-то получил доступ к аккаунту разработчика по имени Джаред Рэй (Jared Wray) — человека, который годами поддерживал два небольших, но крайне популярных инструмента для программистов: keyv и cacheable. Это библиотеки для jаvascript, которые помогают программам временно «запоминать» данные, чтобы не запрашивать их заново — что-то вроде кэша в браузере, только внутри кода. Казалось бы, мелочь, пишет xrust. Но именно на таких «мелочах» держится половина интернета: только у keyv свыше 127 миллионов скачиваний в неделю.
Получив доступ к аккаунту, злоумышленник около 9 утра по Гринвичу тихо внёс изменения прямо в главную ветку репозитория и почти сразу выпустил новую «версию» пакета. Спустя считаные минуты заражённый код появился ещё в восьми связанных библиотеках того же автора.
Здесь стоит объяснить, как вообще работает установка программ для разработчиков. Когда программист подключает к своему проекту чужую библиотеку через менеджер пакетов npm — это как скачать приложение из магазина, только магазин этот открыт вообще для всех, и любой может туда что-то выложить. При установке пакет может автоматически выполнить служебный скрипт — например, чтобы что-то донастроить под систему пользователя. Эта функция и стала оружием.
В заражённые версии добавили именно такой скрипт: он незаметно скачивал легитимную программу Bun (это альтернативный движок для запуска jаvascript-кода) и с её помощью запускал уже собственно вредоносную начинку — около 700 килобайт запутанного, специально изуродованного кода, который аналитики так и не смогли сразу прочитать глазами.
А дальше начиналось самое неприятное: программа-паразит рыскала по компьютеру или серверу в поисках всего, что похоже на пароли и ключи доступа — токены npm, доступы к облаку Amazon, ключи GitHub, конфигурации Kubernetes и даже криптокошельки. Всё найденное шифровалось и незаметно отправлялось «хозяину» — так, что расшифровать украденное мог только он сам.
Обычная вирусная программа на этом бы и успокоилась. Но здесь сценарий оказался куда изобретательнее: если на заражённой машине находились ключи доступа самого разработчика к npm, вредонос использовал их, чтобы... опубликовать заражённые версии уже его собственных пакетов. Получилась классическая цепная реакция: один скомпрометированный аккаунт заражает библиотеку, через неё — компьютер другого разработчика, а тот невольно заражает уже свои проекты. К вечеру того же дня счёт заражённых пакетов пошёл на сотни, а версий — на тысячи.
Специалисты по безопасности быстро окрестили атаку в честь фантастических гигантских червей из «Дюны» — это уже не первая подобная эпидемия в мире npm, и по почерку она напоминает прошлые волны того же семейства зловредов.
Отдельная головная боль для специалистов в том, что заражённые пакеты прошли через официальную, полностью законную систему сборки GitHub и получили настоящую, проверяемую цифровую подпись. Формально всё чисто: код действительно собран в том самом репозитории, тем самым автоматическим процессом. Просто сам код внутри — вредоносный. То есть привычные способы проверить «это точно официальная версия?» в данном случае бессильны: подделка неотличима от оригинала со всеми её печатями и подписями.
Украденные данные утекали двумя путями. Основной — через сотни специально созданных публичных репозиториев на GitHub с говорящим названием в описании, отсылающим к тем самым «червям». Запасной канал — отдельный сайт, адрес которого злоумышленник может менять когда угодно: нужный домен программа каждый раз подтягивает из смарт-контракта в блокчейне Ethereum, так что заблокировать инфраструктуру одним махом не получится.
История с keyv — не единичный случай, а очередное напоминание о хронической болезни всей современной разработки софта. Мы привыкли собирать программы из сотен чужих «кубиков» — библиотек, написанных незнакомыми людьми, которым мы, по сути, слепо доверяем. Один скомпрометированный пароль одного не самого известного автора — и под ударом оказываются тысячи компаний, использующих его код где-то в глубине своих систем, зачастую сами того не подозревая.
Для российских компаний, активно использующих открытые библиотеки jаvascript в вебе и бэкенде, риск ровно тот же: npm — интернациональная экосистема без границ, и заражённый пакет с одинаковой вероятностью может оказаться и в стартапе из Сан-Франциско, и в интернет-магазине из Екатеринбурга. Специалисты по безопасности в один голос советуют то, что раньше многие считали избыточной перестраховкой: не давать пакетам автоматически запускать скрипты при установке, регулярно сверять версии зависимостей в проектах и, если есть подозрение на заражение, менять все пароли и ключи доступа, до которых теоретически мог дотянуться заражённый компьютер.
К моменту публикации в сеть выложено больше двух тысяч заражённых версий пакетов, а список продолжает расти — специалисты по безопасности следят за ситуацией в реальном времени.
Источники: wiz.io, microsoft.com, snyk.io
Xrust: Хакеры заразили сотни npm-пакетов вирусом-вымогателем данных