Специалисты компании JFrog обнаружили особенность поведения интерфейса командной строки npm, которая позволяет вредоносным библиотекам оставаться незамеченными при стандартных проверках безопасности. Проблема кроется не в самом коде пакетов, а в том, как npm CLI формирует предупреждения о найденных уязвимостях.
В чём суть проблемы
Команды install и audit в npm CLI умеют проверять сам пакет и все его зависимости на предмет известных уязвимостей, предупреждая разработчика о потенциальных рисках. Это встроенный механизм защиты, на который многие полагаются, не углубляясь в детали.
Но исследователи JFrog установили: предупреждения об уязвимостях не выводятся, если версия установленного пакета имеет определённый формат. Конкретно — проблема возникает, когда номер версии содержит дефис (например, 1.2.3-a). Такой формат обозначает pre-release, то есть предварительную (тестовую) версию npm-модуля.
Разработчики самого npm считают это различие между обычными версиями пакетов и pre-release-версиями штатным поведением, а не багом. Но именно это делает механизм удобной лазейкой для атакующих, желающих отравить открытую экосистему пакетов.
Как это может использоваться злоумышленниками
По словам исследователя JFrog Ора Пелеса (Or Peles), злоумышленники могут намеренно внедрять уязвимый или вредоносный код в внешне безобидные пакеты, которые затем подключаются другими разработчиками — либо ради полезной функциональности, либо по ошибке в результате техник заражения вроде тайпсквоттинга (typosquatting) или dependency confusion.
Иными словами, атакующий может опубликовать на первый взгляд безвредный пакет в формате pre-release-версии. Другие разработчики подключат его к своему проекту, и стандартная проверка не покажет им никаких предупреждений, даже если в пакете реально присутствует опасный код.
Эта находка в очередной раз подчёркивает, что цепочка поставок программного обеспечения строится на доверии между множеством участников: разработчиками пакетов, мейнтейнерами репозиториев и конечными пользователями. Компрометация одного звена этой цепи способна затронуть все downstream-приложения, которые используют скомпрометированную стороннюю зависимость.
Что рекомендуют исследователи
JFrog советует разработчикам избегать установки npm-пакетов с pre-release-версией, если только источник пакета не является полностью проверенным и надёжным. Это простое правило снижает риск того, что вредоносный код проскочит мимо автоматических проверок безопасности незамеченным.
Источник: The Hacker News.