Безопасность 9 марта 2026 · 4 мин чтения 39 0

Supply-chain атаки на npm и PyPI: как проверять зависимости и не подставить проект

Каждый раз, когда разработчик пишет npm install или pip install, он доверяет свой проект — а часто и инфраструктуру заказчика — незнакомому человеку, который опубликовал пакет. В большинстве случаев это доверие оправдано. Но в растущем числе случаев — нет. Supply-chain атаки на реестры пакетов стали одним из самых быстрорастущих векторов кибератак, и AI усиливает проблему на каждом уровне.

Эта статья — практическое руководство по защите: какие атаки существуют, как их обнаружить и какие инструменты помогут минимизировать риски.

Анатомия supply-chain атаки

Supply-chain атака на программное обеспечение — это компрометация легитимного компонента в цепочке зависимостей. Вместо атаки на конечный продукт злоумышленник внедряет вредоносный код в библиотеку, которую этот продукт использует. Когда разработчик устанавливает или обновляет зависимость, вредоносный код попадает в его проект автоматически.

Основные методы атак остаются стабильными из года в год, но их исполнение становится всё изощрённее. Typosquatting — создание пакетов с именами, похожими на популярные: lodash vs lodash-es vs 1odash, requests vs requessts. Разработчик опечатывается в имени пакета — и устанавливает вредоносную копию. AI усилил этот метод: злоумышленники используют языковые модели для генерации правдоподобных README, документации и даже рабочего кода, который маскирует вредоносную нагрузку.

Захват аккаунтов (account takeover) — получение контроля над учётной записью легитимного разработчика через утёкшие credentials, фишинг или социальную инженерию. После захвата злоумышленник публикует новую версию популярного пакета с вредоносным кодом. Все проекты, которые автоматически обновляются до latest, получают заражённую версию.

Dependency confusion — эксплуатация механизма разрешения зависимостей. Если компания использует внутренний пакет с именем company-utils, злоумышленник публикует пакет с тем же именем на публичном npm с более высоким номером версии. Менеджер пакетов может выбрать публичную версию вместо внутренней.

Компрометация CI/CD — внедрение вредоносного кода не в сам пакет, а в pipeline его сборки. Это сложнее обнаружить: исходный код на GitHub выглядит чистым, но собранный артефакт на npm содержит дополнительный код, добавленный на этапе сборки.

Масштаб проблемы в цифрах

Экосистема npm насчитывает более двух миллионов пакетов. PyPI — свыше полумиллиона. Количество вредоносных пакетов, обнаруживаемых ежегодно, исчисляется тысячами. Рост за последние два года — многократный, во многом благодаря AI-автоматизации создания вредоносных пакетов.

Среднее время обнаружения вредоносного пакета после публикации — от нескольких часов до нескольких дней. За это время он может быть установлен сотнями или тысячами разработчиков. Автоматические системы сканирования npm и PyPI постоянно улучшаются, но злоумышленники адаптируют методы обхода быстрее, чем обновляются фильтры.

Как защитить проект: практические шаги

Защита от supply-chain атак — не разовое мероприятие, а набор практик, встроенных в ежедневный процесс разработки.

Фиксация версий зависимостей — базовый и самый важный шаг. Вместо «lodash: ^4.17.0» (автообновление до последней минорной версии) используйте «lodash: 4.17.21» (конкретная версия). Lock-файлы (package-lock.json, yarn.lock, poetry.lock) — обязательны и должны коммититься в репозиторий. Это не защищает от компрометации конкретной версии, но предотвращает автоматическое подтягивание заражённых обновлений.

Аудит зависимостей перед установкой. Прежде чем добавить новую зависимость, проверьте автора (реальный человек с историей на GitHub или анонимный аккаунт, созданный вчера?), количество скачиваний (пакет с 5 скачиваниями в неделю — повод для настороженности), дату публикации (старые, проверенные пакеты безопаснее свежих), зависимости самого пакета (тянет ли он за собой десяток неизвестных библиотек?).

Инструменты автоматического сканирования: npm audit и pip-audit проверяют установленные зависимости на известные уязвимости. Socket.dev анализирует поведение пакетов: сетевые запросы, доступ к файловой системе, обфускация кода. Snyk и Dependabot мониторят зависимости в реальном времени и создают pull requests для обновления уязвимых пакетов.

Приватные реестры для корпоративной разработки. Вместо прямого обращения к публичному npm используйте прокси-реестр (Verdaccio, Artifactory, GitHub Packages), который кэширует одобренные пакеты и блокирует неизвестные. Это устраняет вектор dependency confusion и даёт полный контроль над тем, какие пакеты попадают в проект.

Минимизация зависимостей — философский, но практический совет. Каждая зависимость — это потенциальный вектор атаки. Перед добавлением нового пакета задайте вопрос: можно ли реализовать эту функциональность самостоятельно за разумное время? Если пакет — обёртка над тремя строками кода, лучше написать эти три строки самому.

CI/CD как последний рубеж обороны

Pipeline непрерывной интеграции — идеальное место для автоматизации проверок безопасности. Встройте в CI обязательный npm audit (или pip-audit) с порогом серьёзности, при котором билд падает. Добавьте проверку lock-файлов: если package-lock.json изменился без соответствующего изменения в package.json — это красный флаг. Используйте Software Bill of Materials (SBOM) для документирования всех зависимостей каждой сборки — при обнаружении уязвимости в конкретном пакете вы мгновенно определите, какие версии продукта затронуты.

Подпись пакетов и верификация — практика, которая набирает популярность. npm поддерживает подписи пакетов через Sigstore, PyPI внедряет Trusted Publishers. Верификация подписи не защищает от компрометации аккаунта мейнтейнера, но гарантирует, что пакет не был модифицирован после публикации.

Supply-chain безопасность — одна из тех областей, где паранойя полезна. Стоимость проверки зависимостей измеряется минутами; стоимость инцидента — днями простоя, потерей данных клиентов и репутационным ущербом. Встройте проверки в процесс, автоматизируйте всё, что можно автоматизировать, и предполагайте худшее — в мире supply-chain атак это не пессимизм, а реализм.