LLM выдумывают несуществующие пакеты: исследование 16 моделей и 576 000 образцов кода
Большие языковые модели (LLM) уверенно генерируют код, но иногда допускают ошибки, которые могут стоить безопасности. Одна из таких ошибок — «галлюцинации пакетов»: модель рекомендует установить библиотеку, которой никогда не существовало. На первый взгляд это выглядит безобидно, но злоумышленники м

Большие языковые модели (LLM) уверенно генерируют код, но иногда допускают ошибки, которые могут стоить безопасности. Одна из таких ошибок — «галлюцинации пакетов»: модель рекомендует установить библиотеку, которой никогда не существовало. На первый взгляд это выглядит безобидно, но злоумышленники могут использовать это для атак на цепочку поставок. Исследование We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs, представленное на USENIX Security 2025, показало, что проблема гораздо серьезнее, чем считалось. Авторы проанализировали 16 моделей и 576 000 образцов кода на Python и JavaScript, выявив тысячи несуществующих пакетов. Почему это происходит и как защититься — читайте в нашем материале.
Исследование: как LLM выдумывают пакеты
Команда исследователей из Университета штата Пенсильвания и компании Veracode поставила перед собой задачу выяснить, насколько часто модели галлюцинируют при генерации кода. Для этого они отобрали 16 популярных LLM, включая GPT-4o, Claude 3.5 Sonnet, Llama 3 и другие, и предложили им решить 36 000 задач на Python и JavaScript. В результате было получено 576 000 образцов кода, каждый из которых тщательно проверялся на предмет упоминания пакетов, отсутствующих в реальных репозиториях PyPI и npm.
Результаты оказались тревожными: в среднем 19,7% сгенерированных образцов содержали галлюцинированные пакеты. При этом модели с открытым исходным кодом, такие как DeepSeek Coder и Llama 3, демонстрировали более высокий уровень галлюцинаций — до 25%. Проприетарные модели, например GPT-4o, ошибались реже, но все равно в 16% случаев предлагали несуществующие пакеты. Чаще всего галлюцинации возникали при решении задач, связанных с обработкой данных, сетевыми операциями и парсингом.
Особую опасность представляет то, что модели не просто называют случайные имена — они генерируют правдоподобные названия, которые могут совпадать с реальными пакетами, но с небольшими отличиями. Например, вместо популярного пакета requests модель может предложить requests-future или requests-toolbelt. Это создает идеальные условия для атак типа typosquatting, когда злоумышленник публикует пакет с похожим именем.
Как галлюцинации пакетов приводят к атакам
Атака на цепочку поставок через галлюцинированные пакеты — это реальная угроза. Злоумышленник может отслеживать рекомендации LLM, находить несуществующие пакеты и публиковать их в публичных репозиториях с вредоносным кодом. Когда разработчик доверяет модели и устанавливает такой пакет, вредоносный код попадает в его проект.
Исследователи продемонстрировали, что этот сценарий вполне реалистичен. Они проанализировали 205 000 уникальных несуществующих пакетов и обнаружили, что многие из них уже были зарегистрированы в PyPI и npm. Например, пакет python-sqlite-utils появился в PyPI спустя несколько месяцев после того, как LLM начала его рекомендовать. Хотя в данном случае пакет оказался безвредным, это доказывает, что злоумышленники уже используют галлюцинации для захвата имен.
Особенно уязвимы разработчики, которые используют LLM в средах с автоматической установкой зависимостей. Если модель предлагает пакет, а инструмент разработки автоматически выполняет pip install или npm install, вредоносный код может быть установлен без дополнительного подтверждения. Атака становится еще опаснее в корпоративных средах, где разработчики работают с приватными репозиториями и могут не проверять каждую зависимость.
Почему LLM выдумывают пакеты
Причины галлюцинаций пакетов лежат в архитектуре LLM. Модели обучаются на огромных объемах кода, включая форумы, документацию и репозитории. В этих данных часто встречаются упоминания пакетов, которые либо устарели, либо были удалены, либо никогда не существовали. Модель запоминает эти фрагменты и воспроизводит их при генерации.
Кроме того, LLM не проверяют существование пакетов в реальном времени. Они генерируют код на основе вероятностных паттернов, а не фактической информации. Поэтому даже если пакет не существует, модель может его предложить, если он соответствует синтаксическим и семантическим ожиданиям.
Исследователи также обнаружили, что галлюцинации усиливаются при генерации длинного кода или при решении сложных задач. Когда модель сталкивается с незнакомой задачей, она с большей вероятностью прибегает к вымышленным пакетам, чтобы заполнить пробелы в знаниях.
Как защититься от галлюцинаций пакетов
Разработчикам и организациям следует принимать меры для снижения рисков, связанных с галлюцинациями пакетов. Прежде всего, необходимо проверять все зависимости, которые предлагает LLM, перед их установкой. Используйте инструменты для автоматической проверки пакетов, такие как pip-audit или npm audit, которые выявляют уязвимости и подозрительные пакеты.
Кроме того, стоит ограничить автоматическую установку зависимостей. Настраивайте свои инструменты так, чтобы они требовали явного подтверждения перед установкой новых пакетов. В корпоративных средах рекомендуется использовать приватные реестры пакетов, которые содержат только проверенные библиотеки.
Исследователи также предлагают доработать LLM, добавив механизмы проверки существования пакетов. Например, модели могут обращаться к API PyPI или npm во время генерации, чтобы подтвердить наличие пакета. Однако это требует дополнительных вычислительных ресурсов и пока не реализовано в коммерческих моделях.
Что это значит для разработчиков
Для разработчиков, которые активно используют LLM для написания кода, результаты исследования — важное напоминание о необходимости критически относиться к рекомендациям моделей. Не стоит слепо доверять предложенным пакетам, особенно если они незнакомы. Проверяйте их в документации, репозиториях и через поисковики.
Особое внимание следует уделять проектам с открытым исходным кодом, где галлюцинированные пакеты могут быть использованы для атак на множество пользователей. Многие популярные библиотеки уже сталкивались с подобными атаками, например, случай с пакетом ua-parser-js, который был скомпрометирован в 2021 году.
Исследователи подчеркивают, что проблема галлюцинаций пакетов не решена и требует дальнейших исследований. Разработчики LLM должны работать над улучшением точности моделей, а пользователи — над повышением своей осведомленности.
Перспективы и дальнейшие исследования
Команда исследователей планирует продолжить работу в этом направлении. Они хотят разработать инструменты для автоматического обнаружения галлюцинированных пакетов в коде, сгенерированном LLM. Также они надеются, что их работа привлечет внимание к проблеме и стимулирует создание более безопасных моделей.
Пока же разработчикам стоит помнить: LLM — мощный инструмент, но они не идеальны. Галлюцинации пакетов — лишь одна из проблем, с которыми сталкиваются пользователи. Оставаясь бдительными и проверяя каждую зависимость, вы сможете защитить свои проекты от потенциальных атак.
Итог
Исследование наглядно показало, что галлюцинации пакетов — серьезная угроза для безопасности разработки. 19,7% сгенерированных образцов содержали несуществующие пакеты, что открывает возможности для атак на цепочку поставок. Разработчикам необходимо проверять все зависимости, а производителям LLM — улучшать модели. Следите за обновлениями в этой области, чтобы быть в курсе новых угроз и методов защиты.