Последние несколько месяцев я ковыряю experience-to-skill pipelines в агентных фреймворках - от Voyager-подобных архитектур до кастомных ReAct-цепочек с persistent skill library. Главный вопрос, который не давал покоя: при каких пороговых условиях отравленная траектория выживает после skill extraction и превращается в переиспользуемый вредоносный артефакт. Собственные результаты меня, мягко говоря, напрягли - safety-фильтры, ловившие более 97% вредоносных записей в сыром виде, пропускали абсолютное большинство навыков, скомпилированных из тех же записей. Работа SkillJack (предположительно от Tencent Zhuque Lab, не верифицирована через первичные источники) даёт этой проблеме количественную рамку: по заявлениям авторов, детекция вредоносности падает с 98.5% на сырых траекториях до 11.4% после skill extraction, attack success rate достигает 89.2%, а в matched-task экспериментах 80% имплантированных навыков переживают полное удаление исходных записей. Все приведённые ниже данные SkillJack не проверены независимо - привожу их как иллюстрацию методологии.
Бизнес-логика атаки: зачем отравлять навыки самообучающихся AI-агентов
Прежде чем лезть в механику - зачем атакующему SkillJack, и почему эта техника опаснее классических prompt injection или memory poisoning. Подробнее - в нашем подробном разборе безопасность llm приложений.Финальный импакт: агент с compromised skill library выполняет вредоносные действия - эксфильтрацию данных, генерацию уязвимого кода, подмену получателей - при каждом обращении к задаче, семантически похожей на триггер навыка. Это не one-shot injection. Это persistent backdoor skill, который срабатывает многократно, в разных сессиях, на разных задачах.
Полная цепочка атаки:
- Доставка (Initial Access) - отравленная траектория попадает в experience corpus агента через adversarial документ, взаимодействие с компрометированным API или специально сконструированную задачу. По аналогии с MITRE это можно условно соотнести с T1195.002 (Supply Chain Compromise), хотя маппинг приблизительный - T1195.002 описывает компрометацию дистрибутива ПО поставщика, а не подачу adversarial-контента в experience corpus. На стадии подготовки атакующий использует AI-специфичные ресурсы - Artificial Intelligence (T1588.007, Resource Development).
- Экстракция - агент через собственный skill extraction pipeline компилирует траекторию в навык. Атакующий тут не при делах - агент сам производит артефакт.
- Закрепление - навык сохраняется в skill library и индексируется для будущего использования. Концептуально соотносится с Stored Data Manipulation (T1565.001, Impact), хотя маппинг условный - навык сохраняется штатным pipeline, а не атакующим напрямую.
- Активация - при поступлении задачи, семантически близкой к триггеру, routing-механизм выбирает заражённый навык. Агент выполняет вредоносные действия как часть нормальной работы - Runtime Data Manipulation (T1565.003, Impact).
- Распространение - навык может быть передан через skill sharing, marketplace или fork agent configurations, масштабируя AI supply chain attack.
Experience-to-skill pipeline: поверхность атаки на self-evolving agents
Self-evolving agents - агенты, которые накапливают опыт и преобразуют его в переиспользуемые процедуры - следующий шаг после stateless task solvers. Вместо того чтобы обрабатывать каждое взаимодействие как изолированный эпизод, такой агент сохраняет успешные траектории и компилирует их в навыки. Механизм укладывается в четыре стадии:- Load - агент получает опыт: траекторию взаимодействий, документ, результат выполнения задачи.
- Transform - LLM извлекает из сырого опыта структурированный навык: описание, предусловия, последовательность действий, код.
- Persist - навык сохраняется в skill library, отдельно от исходного опыта.
- Route - при поступлении новой задачи routing-механизм выбирает релевантные навыки по семантической близости.
Tencent/AI-Infra-Guard/tree/main/Research/SkillJack.Корень проблемы в том, что стадия Transform выполняется самим агентом без внешней верификации. Всё, что проходит через Transform, получает статус «доверенного навыка». Систему изначально не проектировали с учётом адверсарного опыта. Learning pipeline - это implicit trust boundary, которую никто не защищает. Именно здесь начинается отравление навыков LLM-агентов: агентная память и уязвимости experience replay poisoning сливаются в единый вектор, дающий атакующему persistent backdoor skill без прямого доступа к целевой системе.
По сути, агент сам себе троянит skill library. Ему скармливают отравленный опыт - он добросовестно извлекает из него «навык», упаковывает в красивый функциональный фантик и кладёт на полку для повторного использования.
Три свойства бэкдора в LLM-агентах: sanitization, promotion, isolation
SkillJack выделяет три свойства, возникающие на стыке experience poisoning и автоматической skill extraction. Ни одно из них не проявляется при классическом memory poisoning, prompt injection или adversarial skill injection через marketplace.Sanitization whitewashing: навык теряет маркеры вредоносности
При экстракции навыка из траектории LLM-генератор абстрагирует, сжимает и переформулирует исходный опыт. Этот процесс непреднамеренно удаляет маркеры, по которым safety-классификаторы идентифицируют вредоносный контент.Цифры: в системе SkillX safety-детекция (LLM-judge) падает с 98.5% для сырых отравленных траекторий до 11.4% для навыков, извлечённых из тех же траекторий. Anything2Skill показывает аналогичный эффект. Safety-фильтры заточены на маркеры explicit intent - прямые формулировки, подозрительные ключевые слова. Когда LLM при экстракции переписывает действия в нейтральном функциональном стиле, маркеры исчезают.
Для сравнения: в экспериментах с GhostWriter DataFilter (rule-based сканер) тоже не распознавал отравленные записи в долговременной памяти. Но GhostWriter не проходил через LLM-трансформацию - вредоносный контент хранился в том виде, в котором был инъецирован. SkillJack добавляет слой маскировки за счёт самого pipeline обучения: агент-жертва одновременно «отбеливает» payload, становясь невольным соучастником.
Cross-layer promotion: отравление опыта агента превращается в навык
Experience-layer и skill-layer - разные уровни абстракции. Опыт - transient input, который можно удалить, отфильтровать, заменить. Навык - persistent capability, которая выбирается routing-механизмом для будущих задач без повторного обращения к исходной записи.Cross-layer promotion означает, что adversarial input с одного уровня (опыт) конвертируется в артефакт другого уровня (навык). Attack success rate для SkillX - 56.2%, для Anything2Skill - 89.2%. Разница обусловлена архитектурно: SkillX применяет более агрессивную нормализацию, которая иногда ломает payload, тогда как Anything2Skill обрабатывает документы «бережнее», сохраняя структуру контента.
Критический момент: навык, пройдя promotion, начинает участвовать в routing. В экспериментах SkillJack native skill routing давал как целевое срабатывание на задачах-триггерах, так и коллатеральное - на семантически смежных задачах, для которых навык не предназначался. Это расширяет поверхность атаки за пределы, которые контролирует атакующий. Навык начинает жить своей жизнью.
Persistence isolation: постоянный бэкдор в навыках агента переживает удаление
Skill library хранится отдельно от experience corpus. Удаление исходных отравленных записей не удаляет навык, извлечённый из них. В matched-task эксперименте persistence rate после удаления source records - 80.0%.Стандартные процедуры инцидент-респонса - «найти и удалить вредоносные записи» - не устраняют угрозу. Для полного remediation нужен provenance tracking: привязка каждого навыка к source experience record с возможностью каскадного удаления. Ни SkillX, ни Anything2Skill не реализуют такой механизм. На момент публикации работы ни один из известных experience-to-skill фреймворков не делает этого из коробки. Ситуация, как с первыми SQL-инъекциями в 2000-х: все знают про prepared statements, но никто не ставит.
Transformation-resilient payload: дизайн skill poisoning атаки
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Описание - формально легитимное описание задачи. Именно оно определяет routing: по описанию навык выбирается для будущих задач.
Код/действия (content) - собственно payload. Вредоносные действия встроены в легитимный workflow так, что их изъятие ломает функциональность навыка.
Парное сравнение framed vs explicit-malicious payloads подтвердило: функциональный фрейминг выживает экстракцию там, где overt wording разоблачается. Паттерн знакомый - он же зафиксирован в ToxicSkills: по данным аудита Snyk, 100% подтверждённых вредоносных навыков в ClawHub комбинировали оба вектора - code layer и natural language instruction layer. Разница в том, что ToxicSkills - прямое размещение вредоносных навыков на marketplace, а SkillJack заставляет агент сам генерировать аналогичный артефакт из отравленного experience replay.
Результаты на SkillX и Anything2Skill: уязвимости самообучающихся AI-агентов
По данным авторов, результаты получены на shared dataset из 150 траекторий, четырёх категорий policy-risk, с конфигурацией DeepSeek-v4-flash для обеих систем.| Метрика | SkillX | Anything2Skill |
|---|---|---|
| Детекция сырых траекторий (safety judge) | 98.5% | Сопоставимо |
| Детекция извлечённых навыков | 11.4% | Аналогичное снижение |
| Attack success rate (целевое срабатывание) | 56.2% | 89.2% |
| Persistence после удаления source records | 80.0% | 80.0% |
| Коллатеральное срабатывание | Да | Да |
Несколько наблюдений, которые стоит разобрать подробнее.
Разрыв в детекции - падение с 98.5% до 11.4% - не артефакт конкретного safety judge. Это системное свойство Transform-стадии: LLM при абстрагировании нормализует формулировки, удаляя маркеры, на которые заточены классификаторы. Проблема не решается заменой одного safety judge на другой - нужна принципиально другая точка инструментирования.
Разница attack success rate между SkillX (56.2%) и Anything2Skill (89.2%) объясняется архитектурно. SkillX применяет агрессивное сжатие траекторий, которое может повредить payload. Anything2Skill обрабатывает документы с большей сохранностью структуры - что играет на руку атакующему. Ирония в том, что более «бережный» к данным pipeline оказывается более уязвимым.
Metadata влияет на вердикт safety judge. Отдельный эксперимент показал, что нейтральные метаданные - имя, описание - материально меняют решение LLM-классификатора. Тот же контент с нейтральным описанием проходит проверку, которую без метаданных не прошёл бы. Компонент «имя навыка» в payload - не косметический, а критически важный для обхода.
Behavior-aware мониторинг превосходит статический анализ в предварительном исследовании, но авторы помечают результат как preliminary - выборка ограничена. Направление перспективное: если навык невидим для текстового анализа, остаётся инструментировать фактическое поведение (сетевые вызовы, файловые операции, API-запросы).
AI supply chain attack: от SkillJack до adversarial skill injection в экосистеме
SkillJack описывает атаку на уровне отдельного агента. Масштаб проблемы виден в контексте экосистемы.По неподтверждённым данным, в публикациях сообщалось о компрометации значительной доли навыков на marketplace-платформах, включая размещение вредоносных навыков через множественные publisher-аккаунты. Эти данные не были независимо верифицированы.
Отдельно от темы SkillJack (без прямой технической связи, но как иллюстрация общего паттерна) Check Point Research раскрыла уязвимости в Claude Code: CVE-2025-59536 (CVSS 8.7 HIGH, CWE-94 - выполнение кода до подтверждения trust dialog, UI
ANTHROPIC_BASE_URL в настройках проекта, что при последующем использовании украденного ключа может соответствовать Application Access Token (T1550.001, Lateral Movement), тогда как сама эксфильтрация ближе к Unsecured Credentials (T1552, Credential Access)). Обе уязвимости эксплуатируют доверие агента к файлам конфигурации - тот же паттерн избыточного доверия к входным данным, хотя технически эти уязвимости (trust dialog bypass при загрузке проекта) не связаны с experience-to-skill pipeline.В классификации OWASP это пересечение трёх рисков: LLM04:2025 (Data and Model Poisoning) - core-механизм skill poisoning атаки, LLM03:2025 (Supply Chain) - вектор доставки через экосистему, LLM06:2025 (Excessive Agency) - агент имеет достаточные привилегии для самостоятельного создания и исполнения навыков.
Компаундирование: ToxicSkills - прямое размещение вредоносных навыков на marketplace. SkillJack - генерация вредоносных навыков самим агентом из отравленного опыта. Агент, скачавший навык из ClawHub, может не только выполнить вредоносный код, но и - если его experience-replay pipeline зафиксирует траекторию выполнения - сохранить вредоносный паттерн поведения как собственный навык, масштабируя атаку без повторного обращения к marketplace. Цепочка замыкается: marketplace → агент → skill library → другие агенты.
Детекция и ограничения: безопасность автономных AI-агентов
Что показывает результат
Behavior-aware мониторинг - отслеживание фактических действий агента (сетевые вызовы, файловые операции, API-запросы) вместо статического анализа текста навыков - показал лучшие результаты в предварительном исследовании SkillJack. Если навык невидим для textual safety judge после whitewashing, единственный надёжный сигнал - поведенческие аномалии при выполнении.Provenance tracking - привязка каждого навыка к source experience с каскадным удалением - ломает persistence isolation. Но ни один из протестированных фреймворков этого не реализует.
Что не работает
- Статические safety filters - пропускают 88.6% навыков после extraction (11.4% детекция).
- Удаление отравленных source records - неэффективно, 80% навыков переживают удаление.
- Rule-based сканеры - неэффективны и против GhostWriter (memory poisoning), и тем более против SkillJack.
- Криптографическая подпись навыков (рекомендация OWASP AST01: ed25519) - блокирует adversarial skill injection через marketplace, но не защищает от локального отравления через experience pipeline. Подпись подтверждает авторство, а не чистоту содержимого.
Предусловия и ограничения SkillJack
Работает если: агент реализует experience-to-skill extraction pipeline (SkillX, Anything2Skill, Voyager-подобные архитектуры); experience corpus принимает внешние данные; skill library не имеет provenance tracking.Не работает если: агент stateless (без skill learning); skill library read-only (навыки только от разработчика); реализован provenance tracking с каскадным удалением; Transform-стадия применяет агрессивное сжатие, повреждающее payload (снижает, но не исключает success rate - SkillX всё равно показывает 56.2%).
Сообщество AI security сфокусировано на prompt injection и retrieval poisoning как главных угрозах для LLM-агентов - и систематически недооценивает learning pipeline как вектор атаки. SkillJack демонстрирует неудобный факт: чем лучше агент абстрагирует и обобщает опыт, тем чище выглядит вредоносный артефакт на выходе. Safety-классификаторы, обученные ловить explicit malicious intent, принципиально бессильны против навыков, прошедших трансформацию - потому что трансформация и есть whitewashing.
За ближайший год мы увидим первые in-the-wild случаи отравления навыков LLM-агентов, которые будут обнаружены не при инъекции, а ретроспективно - через аномалии в поведении, которые никто не свяжет с конкретной исходной записью. Предпосылки: по неподтверждённым данным, ClawHub растёт на 500+ навыков в день, значительная часть экосистемы может содержать уязвимости, ни один marketplace не реализует provenance tracking, ни один фреймворк не привязывает производный навык к source experience по умолчанию. Рабочая защита - не фильтры на входе (обходятся framing) и не safety judges на выходе (обходятся whitewashing), а provenance-aware skill lifecycle: каждый навык привязан к source record, каждый derived artifact наследует trust level источника, каждое обновление аудитируется. Это требует изменений на уровне архитектуры агента. Пока ни один фреймворк не делает этого - каждый self-evolving agent уязвим с первого дня деплоя. На HackerLab есть задачи, где аналогичную persistence-цепочку нужно развернуть end-to-end без подсказок - те же примитивы injection, transformation и закрепление.