Руководство
Slopsquatting: когда ИИ-ассистент устанавливает несуществующий пакет
ИИ-ассистенты иногда выдумывают имена пакетов, которые могут зарегистрировать злоумышленники. Что показывают исследования и как проверить зависимость за минуту.
· 8 мин чтения · Команда vetkit


Попросите ассистента для программирования о помощи, и вместе с кодом он часто предложит библиотеку. В большинстве случаев библиотека настоящая. Иногда — нет: модель выдаёт имя, которое звучит правильно, следует соглашениям об именовании в экосистеме и просто не существует ни в npm, ни в PyPI. Если вы запускаете команду установки не глядя, происходит одно из двух. Установка падает — это раздражает, но безвредно. Или кто-то уже опубликовал пакет ровно под этим именем, и вы только что запустили его код.
Что такое slopsquatting
Slopsquatting — название для второго случая: регистрация имён пакетов, которые ИИ-модели склонны выдумывать, в ожидании, что люди их установят. Термин обычно приписывают Сету Ларсону, security developer-in-residence в Python Software Foundation, и он обыгрывает typosquatting, при котором злоумышленники регистрируют имена популярных пакетов с опечатками. Разница в том, кто ошибается. При typosquatting опечатывается человек. При slopsquatting модель уверенно предлагает неправильное имя, а человек ей доверяет.
Риск не гипотетический. В широко освещавшемся эксперименте исследователь заметил, что модели раз за разом рекомендуют пакет huggingface-cli, хотя настоящий инструмент Hugging Face устанавливается иначе. Он опубликовал под этим именем пустой пакет, чтобы посмотреть, что будет, и его скачали десятки тысяч раз. Пакет был безвредным. Вредоносный безвредным бы не был.
Как часто модели выдумывают пакеты
Самое основательное исследование на сегодня — «We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs», представленное на USENIX Security 2025. Авторы сгенерировали 576 000 примеров кода на Python и JavaScript с помощью 16 популярных моделей и проверили каждый пакет, на который ссылался код. Они обнаружили, что средняя доля галлюцинированных пакетов составила не менее 5,2% у коммерческих моделей и 21,7% у open-source моделей, и собрали 205 474 уникальных несуществующих имени пакетов.
Две детали из статьи важнее, чем громкие цифры. Во-первых, выдуманные имена часто воспроизводимы: когда авторы десять раз перезапускали промпты, вызвавшие галлюцинацию, 43% этих имён возвращались каждый раз. Предсказуемые имена — именно то, что нужно злоумышленнику. Во-вторых, большинство из них не являются опечатками в названиях реальных пакетов, так что проверка на опечатки их не поймает. Лишь около 13% отличались от существующего имени на один-два символа.
С момента этих экспериментов модели стали лучше, а ассистенты, которые ищут пакет в реестре, прежде чем его предложить, делают проблему более редкой. Но реже — не значит исчезла, особенно для нишевых задач, где модель видела мало реальных примеров.
Почему эта атака реальна
Публикация в npm или PyPI бесплатна и занимает минуты. Злоумышленнику не нужно ничего взламывать; достаточно угадать имена, которые выдают модели, и зарегистрировать их первым. Остальное делают install-скрипты: npm по умолчанию запускает скрипты preinstall и postinstall, а Python-пакет может выполнить код при сборке или импорте. Одна установка на ноутбуке разработчика или CI-раннере может раскрыть SSH-ключи, облачные учётные данные и токены в переменных окружения.
Агенты делают проблему острее. Когда ассистент сам может запустить npm install или pip install, на имя пакета может вообще не посмотреть ни один человек.
Проверьте пакет за минуту
Прежде чем добавить зависимость, которую вы выбрали не сами, найдите её в реестре:
# npm: does it exist, who publishes it, when was it first released?npm view some-package name version time.created repository.url # PyPI: same questions, from the JSON APIcurl -s https://pypi.org/pypi/some-package/json | jq '.info | {name, version, home_page, project_urls}'Затем задайте себе несколько быстрых вопросов:
- Существует ли он вообще? 404 означает, что имя выдумано. Не создавайте его и не устанавливайте «достаточно похожую» альтернативу, не проверив и её.
- Он совсем новый? Пакет, впервые опубликованный в последние несколько недель, с одной версией и без истории, заслуживает повторного взгляда, особенно если его имя совпадает с тем, что предложил ассистент.
- Ведёт ли он на реальный проект? Связанный репозиторий с коммитами, issues и другими пользователями — хороший знак. Пустой или отсутствующий репозиторий — нет.
- Это тот пакет, который велит установить документация? Лучший источник правильного имени — собственная документация настоящего инструмента.
huggingface-cliпротив задокументированной команды установки — хороший пример того, почему.
Не запускайте установку, чтобы это выяснить
Полезные привычки
- Используйте lock-файлы и устанавливайте из них в CI (
npm ci,pip install -rс закреплёнными версиями и хешами), чтобы новое имя не проскользнуло во время сборки. - Проверяйте изменения зависимостей в pull request так же внимательно, как изменения кода. Дифф, который добавляет три пакета, заслуживает трёх проверок.
- Просите ассистента дать ссылку на страницу пакета в реестре или на официальную документацию, когда он предлагает что-то новое. Это дешёвый способ выявить выдуманное имя.
- Если ваш агент может сам запускать установки, дайте ему allowlist или требуйте подтверждения для новых зависимостей.
- Подумайте о том, чтобы по умолчанию отключить install-скрипты (
npm config set ignore-scripts true) и включать их только для пакетов, которым они нужны. Это ломает некоторые пакеты, так что сначала проверьте.
Автоматизируйте рутину
Ручная проверка работает для одного пакета. Она не масштабируется на репозиторий с сотнями зависимостей или на импорты, спрятанные в коде, который ассистент сгенерировал на прошлой неделе. Это хорошая задача для инструментов.
Набор AI code risks в vetkit ищет зависимости и импорты из ваших манифестов в публичных реестрах, таких как npm и PyPI. Он помечает несуществующие имена, версии, которые никогда не публиковались, и пакеты, впервые выпущенные за последние 30 дней. В реестры отправляются только имена и версии пакетов, но никогда ваш исходный код, а пакеты из приватных реестров или ваших собственных workspace не проверяются. MCP-сервер vetkit также предоставляет проверку пакетов, так что ассистент может проверить имя, прежде чем что-либо устанавливать.
Чем бы вы ни пользовались, принцип один: имя пакета, полученное от модели, — это утверждение, а утверждения дёшево проверить, прежде чем их запускать.