Все AI-модели галлюцинируют пакеты: как это становится оружием
Исследование «Importing Phantoms» систематически измерило галлюцинации пакетов в 11 языковых моделях. Результат: ни одна модель не застрахована, а схема атаки на этой уязвимости — slopsquatting — уже отработана исследователями на практике: галлюцинированные имена собирают десятки тысяч реальных установок.
Проблема: пакеты, которых не существует
Когда разработчик просит AI-ассистента написать код, модель генерирует не только логику, но и список зависимостей — import и require для пакетов, которые предположительно существуют. Проблема в том, что иногда эти пакеты не существуют. Модель галлюцинирует правдоподобное имя библиотеки, которой нет ни в npm, ни в PyPI, ни в crates.io.
Первые системные данные о масштабе проблемы появились в 2024 году: Спраклен и соавторы (Spracklen et al., arXiv:2406.10279, позднее — USENIX Security 2025) сгенерировали 576 000 образцов кода и показали, что доля несуществующих пакетов составляет как минимум 5.2% у коммерческих моделей и 21.7% у open-source.
Статья «Importing Phantoms: Measuring LLM Package Hallucination Vulnerabilities» (arXiv:2501.19012, январь 2025) дополнила картину контролируемыми экспериментами: единая методология, 11 моделей, три языка программирования, включая редко исследуемый Rust. И результаты оказались хуже, чем предполагалось.
Дизайн эксперимента
Исследователи протестировали 11 языковых моделей — как специализированные кодовые (CodeGemma, StarCoder2, Granite-3.0, Qwen2.5-Coder, Mamba-Codestral), так и общего назначения (GPT-4o, Llama-3.1-8B/70B, Nemotron, Dracarys, Minitron-Mistral). Тестирование проводилось на трёх языках программирования: Python, JavaScript и Rust.
Методология была строгой: 7 различных шаблонов промптов, 13 задач программирования, каждый эксперимент повторялся 5 раз для контроля стохастичности. Это дало 455 запросов на каждую пару «модель — язык», всего 1365 на модель — достаточно для статистически значимых выводов.
Каждый сгенерированный пакет проверялся по реальным реестрам: PyPI для Python, npm для JavaScript, crates.io для Rust. Если пакет не существовал — это фиксировалось как галлюцинация.
Все модели галлюцинируют
Главный вывод исследования прост и тревожен: все 11 протестированных моделей производят галлюцинированные пакеты. Это не баг конкретной модели — это системное свойство текущего поколения языковых моделей.
Диапазон оказался широким: от 0.22% у Nemotron на JavaScript до 46.15% у Granite на Python. Но даже лучшие модели не смогли показать нулевой результат. В реальном использовании, где разработчик генерирует десятки фрагментов кода в день, даже 0.22% означает регулярное появление несуществующих пакетов.
| Модель | Python | JavaScript | Rust |
|---|---|---|---|
| Granite-3.0 | 46.15% | 24.62% | 42.86% |
| Qwen2.5-Coder | 38.02% | 15.16% | 43.08% |
| CodeGemma | 33.85% | 23.74% | 42.20% |
| StarCoder2 | 27.03% | 14.51% | 31.65% |
| Nemotron | 4.84% | 0.22% | 0.22% |
| GPT-4o | 3.52% | 1.76% | 10.99% |
Выборочные данные из Table 3 исследования; всего протестировано 11 моделей.
Парадокс кодовых моделей
Один из самых контринтуитивных результатов: модели, специально обученные для генерации кода, галлюцинируют пакеты значительно чаще, чем модели общего назначения. Средний показатель галлюцинаций у кодовых моделей составил 26.9%, тогда как у общих — 13.6%.
Вероятное объяснение кроется в механизме обучения. Кодовые модели обучаются на огромных корпусах кода из GitHub, включая устаревшие, переименованные, удалённые и никогда не существовавшие пакеты (из учебников, черновиков, экспериментального кода). Модель запоминает паттерны именования и уверенно генерирует имена, которые выглядят как настоящие пакеты, но таковыми не являются.
Модели общего назначения, обученные на более разнообразных данных, оказываются более «осторожными» в генерации имён пакетов — они чаще используют реально существующие, популярные библиотеки, потому что именно они чаще встречаются в обучающих данных наряду с их описаниями и документацией.
Rust — самый рискованный язык
Среди трёх протестированных языков наибольшую долю галлюцинаций показал Rust — 24.74% в среднем по всем моделям. Python оказался совсем рядом с 23.14%, а JavaScript — заметно ниже, 14.73%.
Лидерство «безопасного» Rust контринтуитивно, но объяснимо: экосистема crates.io моложе и меньше PyPI и npm, Rust-кода в обучающих корпусах меньше, и модели хуже «помнят» реальные имена пакетов. При этом зрелость экосистемы сама по себе не спасает: PyPI с его более чем 500 000 пакетов и относительно свободными правилами именования дал почти такой же уровень галлюцинаций — модели, видевшие огромное разнообразие Python-имён, легко генерируют новые, правдоподобно звучащие, но не существующие.
Размер имеет значение, но не решает проблему
Исследование подтвердило интуитивное предположение: более крупные модели (70B+ параметров) галлюцинируют реже, чем малые. Это логично — больший объём параметров позволяет лучше запоминать реальные имена пакетов.
Однако даже самые крупные модели не достигают нулевого уровня галлюцинаций. GPT-4o, одна из самых мощных моделей в выборке, показала от 1.76% галлюцинаций на JavaScript до 10.99% на Rust. Это означает, что увеличение размера модели — необходимое, но недостаточное решение.
Интересная корреляция обнаружена с бенчмарком HumanEval: модели с высоким показателем HumanEval (то есть лучше решающие задачи программирования) производят меньше галлюцинированных пакетов. Коэффициент корреляции Пирсона составил ρ ≈ −0.79, что указывает на сильную обратную связь. Однако даже модели с отличными показателями HumanEval не свободны от галлюцинаций полностью.
Slopsquatting: когда галлюцинация становится оружием
Галлюцинации пакетов сами по себе — неприятность: код не компилируется, разработчик тратит время на отладку. Но в 2025 году эта неприятность превратилась в полноценный вектор атаки, получивший название slopsquatting.
Механизм атаки элегантен: злоумышленник выясняет, какие несуществующие пакеты чаще всего галлюцинируют популярные модели, и регистрирует их в реестрах (PyPI, npm). Внутри пакета — вредоносный код: кража учётных данных, установка бэкдора, криптомайнер. Когда AI-ассистент в следующий раз порекомендует этот пакет разработчику, тот установит его командой pip install или npm install — и скомпрометирует свою систему.
Задокументированные случаи
Известные случаи slopsquatting — пока эксперименты исследователей безопасности, а не атаки с жертвами. Но они показывают, что механизм работает:
- huggingface-cli: несуществующий пакет, который AI-модели регулярно рекомендовали для работы с Hugging Face. Исследователь Бар Ланьядо (Lasso Security) на рубеже 2023–2024 годов зарегистрировал его на PyPI как пустой, безвредный пакет — proof of concept. За три месяца пакет набрал более 30 000 скачиваний, а команда его установки попала в инструкции реального проекта Alibaba (GraphTranslator).
- react-codeshift: галлюцинированный npm-пакет для миграции React-кода, которого никогда не существовало. В январе 2026 года исследователь Aikido Security Чарли Эриксен обнаружил, что на него ссылаются 237 репозиториев GitHub: имя разошлось через сгенерированные ИИ агентские навыки (agent skills), которые никто из людей не проверял. Эриксен зарегистрировал пакет защитно, раньше злоумышленников, — и сразу начал получать реальные попытки установки от AI-агентов, выполнявших
npx-команды из этих навыков.
Оба пакета оказались безвредными только потому, что исследователи успели первыми. Десятки тысяч скачиваний и сотни репозиториев, ссылающихся на несуществующий пакет, показывают: будь на месте исследователя злоумышленник, атака сработала бы в том же масштабе — на доверии разработчиков и AI-агентов к рекомендации модели.
Почему это масштабируется
Важную характеристику галлюцинаций показало исследование Спраклена и соавторов (USENIX Security 2025): они воспроизводимы. При десятикратном повторении промпта, однажды вызвавшего галлюцинацию, 43% галлюцинированных пакетов появлялись во всех десяти попытках, а 58% — более одного раза. Это означает, что злоумышленнику достаточно протестировать популярные промпты, выявить стабильные галлюцинации и зарегистрировать соответствующие пакеты.
При этом галлюцинации в основном специфичны для модели: по данным того же исследования, 81% уникальных галлюцинированных имён генерировались только одной моделью. Для атакующего это не препятствие, а инструкция по таргетированию: достаточно сфокусироваться на самых популярных моделях — их стабильные галлюцинации обеспечат поток установок от миллионов пользователей.
Цепочка атаки
Полная цепочка slopsquatting-атаки выглядит так:
- Разведка: злоумышленник систематически промптит популярные модели, собирая галлюцинированные имена пакетов
- Регистрация: самые часто встречающиеся имена регистрируются в PyPI/npm с правдоподобным описанием и README
- Ожидание: AI-ассистент рекомендует галлюцинированный пакет реальному разработчику
- Установка: разработчик выполняет
pip install— пакет существует, устанавливается без ошибок - Компрометация: вредоносный код выполняется при установке или импорте
Каждый шаг этой цепочки технически тривиален. Регистрация пакета на PyPI занимает минуты и не требует верификации. Именно поэтому slopsquatting — одна из самых доступных и масштабируемых атак на цепочку поставок.
Что можно сделать
Исследование предлагает несколько направлений митигации, но ни одно из них не является полным решением:
- Верификация на стороне AI: модель должна проверять существование пакета перед рекомендацией. Однако это требует интеграции с реестрами и не защищает от уже зарегистрированных вредоносных пакетов.
- Lockfile и воспроизводимые сборки: фиксация зависимостей предотвращает случайное добавление новых пакетов, но не защищает при первоначальной разработке.
- Обучение разработчиков: понимание того, что AI может рекомендовать несуществующие пакеты, снижает риск бездумной установки.
- Мониторинг реестров: автоматическое обнаружение свежезарегистрированных пакетов с именами, похожими на галлюцинации — перспективное направление, над которым работают Socket.dev и другие.
- Проверка зависимостей в CI/CD: автоматическая проверка каждого нового пакета перед мёржем — возраст пакета, количество мейнтейнеров, история версий.
Фундаментальная проблема
Галлюцинации пакетов — частный случай более общей проблемы: языковые модели генерируют правдоподобный текст, но не обязаны генерировать истинный. Модель не «знает», какие пакеты существуют — она предсказывает наиболее вероятное продолжение текста. Если from dataprep.clean import clean_email выглядит правдоподобно, модель сгенерирует это, вне зависимости от того, существует ли пакет dataprep.
Эта проблема не будет полностью решена увеличением размера моделей или объёма обучающих данных. Она требует архитектурных изменений: интеграции с реальными реестрами, RAG-подхода к генерации зависимостей, верификационных слоёв между генерацией и исполнением кода.
До тех пор каждый import в AI-сгенерированном коде — это потенциальный вектор атаки. И относиться к нему нужно соответственно.
Источники
- Importing Phantoms: Measuring LLM Package Hallucination Vulnerabilities — arXiv:2501.19012 (январь 2025)
- Spracklen et al. — «We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs» — arXiv:2406.10279, USENIX Security 2025
- Trend Micro — «Slopsquatting: When AI Agents Hallucinate Malicious Packages» (июнь 2025)
- Socket.dev — «The Rise of Slopsquatting: How AI Hallucinations Are Fueling a New Class of Supply Chain Attacks» (апрель 2025)
- The Register — «AI bots hallucinate software packages and devs download them» (март 2024)
- Aikido Security — «Agent Skills Are Spreading Hallucinated npx Commands» (январь 2026)
Как SAID решает эту проблему
SAID (Safe AI Development) адресует проблему галлюцинаций пакетов через несколько правил:
- Правило верификации зависимостей: каждый пакет, рекомендованный AI, проверяется по реестру до установки — автоматически, в CI/CD-пайплайне
- Правило ревью AI-кода: сгенерированный код проходит такой же ревью, как написанный человеком — включая проверку зависимостей
- Правило lock-файлов: воспроизводимые сборки через фиксацию зависимостей предотвращают внедрение новых пакетов без явного одобрения
- Правило мониторинга: новые зависимости в проекте автоматически проверяются на возраст, репутацию и историю мейнтейнеров
Галлюцинации невозможно устранить полностью, но можно построить процесс, который их надёжно перехватывает.