TL;DR
MetaCascade — это атака на агентов со скилами (папки с файлом SKILL.md, которые агент подгружает под задачу). Атакующий берёт чужой скил, меняет только название и описание (метаданные) и публикует его в открытом реестре. Тело скила остаётся прежним. Описание подбирается так, чтобы агент сначала нашёл этот скил в поиске, а потом выбрал из топ-5 именно его. Подбор идёт циклом: сгенерировать описания, устроить «конкурс» с похожими скилами, посмотреть, почему проиграли, переписать.
Главная находка: агент выбирает скил по описанию, а не по качеству или безопасности. Описание участвует в каждом шаге: поиск, ранжирование, финальный выбор. Раньше атаки изучали по частям (только поиск или только выбор) либо считали, что скил уже выбран. Здесь атакуют всю цепочку сразу. В результате отравленный скил выбирается в большинстве задач, примерно вдвое чаще, чем у прежних атак. Проверка по тексту скила или описанию автоматическими детекторами и переранжирование ослабляют атаку, но не убирают её.
Для практика это предупреждение: «агент сам выбрал скил» не значит «выбрал лучший и безопасный». Вторая польза: ту же механику «конкурс описаний, разбор причин проигрыша» можно честно использовать, чтобы улучшить описания своих скилов.
Схема метода
ШАГ 1 (подготовка): взять чужой скил → выписать, что он умеет (входы, выходы, шаги, ограничения)
ШАГ 2 (разнообразие): сгенерировать 8 «равных по возможностям» версий скила с разными формулировками → проверка, что не добавлены лишние функции
ШАГ 3 (конкурс): половина версий пишет метаданные, вторая половина — «конкуренты» → модель-судья выбирает лучший скил для каждой задачи (порядок случайный, 3 прогона)
ШАГ 4 (разбор): где скил проиграл — записать причину → переписать лучшее описание из всего архива (не обязательно последнее)
ШАГ 5 (остановка): доля побед ≥ 80% или прошло 3 раунда → итоговое описание подставить в оригинальный скил и опубликовать
Каждый шаг атаки — отдельные запросы к модели с кодом оркестрации. Для вас это схема того, как устроена угроза, а не рецепт.
Пример применения
Задача: маркетинговое агентство в Казани ведёт клиентов в Яндекс Директе и Метрике. В Claude Code лежат пять похожих скилов: «отчёт по Директу», «отчёт по Метрике», «сводка по РСЯ», «аудит кампаний», «еженедельный дайджест для клиента». Агент периодически берёт не тот. Нужно понять, чьё описание проигрывает и почему. Это ровно та механика, на которой строится MetaCascade (конкурс описаний + разбор причин проигрыша), только в мирной версии.
Промпт:
Ты — агент, который выбирает ровно один скил под задачу.
Ты видишь только название и описание скилов, тело скила не видишь.
1. direct-report — «Собирает отчёт по расходам и конверсиям из Яндекс Директа за период»
2. metrika-report — «Строит отчёт по посещаемости и целям из Яндекс Метрики»
3. rsya-summary — «Сводка по площадкам РСЯ: клики, отказы, мусорный трафик»
4. campaign-audit — «Проверяет настройки кампаний Директа на типовые ошибки»
5. weekly-digest — «Еженедельный дайджест для клиента: ключевые цифры и выводы простым языком»
1. Клиент спрашивает, почему в прошлую среду выросли расходы на поиск.
2. Нужно понять, откуда на сайт идёт трафик с высоким отказом.
3. Подготовить письмо клиенту с итогами недели.
4. Найти, не сливаем ли мы бюджет на мусорные площадки.
5. Проверить, правильно ли настроены минус-слова.
Для каждой задачи:
- выбери один скил;
- коротко объясни выбор по тексту описания;
- укажи, какие скилы ты рассматривал как конкурентов и чем описание победителя оказалось «заметнее».
Повтори прогон ещё два раза, каждый раз перемешивая порядок кандидатов.
В конце: таблица «задача → сколько раз какой скил выбран» и список задач, где выбор нестабилен.
Для каждого проигравшего или нестабильного скила напиши причину и предложи правку описания.
Результат: модель выдаст три прогона с выбором по каждой из пяти задач и объяснением. Затем придёт сводная таблица стабильности выбора. В конце будет список «слабых» описаний с причиной (слишком общее, пересекается с соседом, не названы признаки задачи) и предложением правки. Это модель-судья, а не ваш реальный агент, поэтому итог проверьте на самом агенте.
Почему это работает
Слабость: агент с десятками скилов не читает тела всех подряд. Он смотрит на название и описание. Модель выбирает по тексту, который «лучше звучит» для задачи. Описание, которое перечисляет больше сценариев и формулирует их языком пользователя, выигрывает у честного, но узкого. И это работает на всех шагах: поиск по похожести, ранжирование, финальный выбор.
Сильная сторона: LLM хорошо переписывает текст под заданный критерий и разбирает причины неудач. Дайте ей «проигранные» задачи и конкурентов, и она выявит, чем описание хуже.
Как метод это использует: вместо одной «умной» формулировки он гоняет конкурс. Разнообразие формулировок даёт материал. Конкуренты с тем же функционалом дают честную проверку. Журнал причин поражений направляет следующую правку. Лучшее берётся из архива, а не из последней версии, поэтому цикл не катится вниз.
Рычаги управления (для легитимной версии): - Число конкурентов → больше конкурентов = жёстче проверка. - Число прогонов с перемешиванием → больше = меньше влияние порядка в списке. - Набор задач → берите реальные запросы, а не придуманные. - Условие остановки → доля выбора, которая вас устраивает, или лимит раундов.
Шаблон промпта
Промптов атаки в тексте статьи нет, они в приложении. Ниже шаблон, который воспроизводит механику конкурса для проверки своих скилов.
Ты — агент, который выбирает один скил под задачу. Видишь только название и описание.
{список_скилов: название — описание}
{список_реальных_задач}
Повтори {число_прогонов} раза. В каждом прогоне перемешай порядок кандидатов.
Для каждой задачи:
- выбери один скил;
- объясни выбор по тексту описания;
- назови ближайшего конкурента и почему он проиграл.
1. Таблица: задача → сколько раз выбран каждый скил.
2. Список нестабильных задач.
3. Для каждого проигравшего скила: причина поражения и предложенная правка описания.
4. Новая версия описания, которая не расширяет возможности скила, а только точнее называет его.
Подставляйте: {список_скилов} — реальные названия и описания; {список_реальных_задач} — 5–10 запросов из рабочих чатов; {число_прогонов} — обычно 3.
🚀 Быстрый старт — вставь в чат:
Вот шаблон конкурса описаний скилов. Адаптируй под мою задачу: {опиши свои скилы и типовые запросы}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит названия и описания скилов, реальные запросы, сколько прогонов нужно. Эти данные нужны, потому что метод сравнивает конкурентов на одних и тех же задачах. Она возьмёт структуру из шаблона и соберёт готовый промпт под вашу библиотеку.
Ограничения
⚠️ Статья про атаку, а не про защиту: авторы не предлагают и не проверяют промпты, инструкции или правила для агента, которые это закрывают. Всё, что ниже про защиту, — вывод, а не проверенный приём.
⚠️ Автоматические защиты не спасают: переранжирование и сканеры скилов снижают успех атаки, но она остаётся высокой. Особенно хорошо работает сканер, и всё равно больше половины атак проходит.
⚠️ Узкая зона: исследовали только выбор скила из топ-5 найденных. Что скил делает после вызова, не изучали.
⚠️ Нужен код и стенд: воспроизвести саму атаку промптом в чате нельзя. Нужны оркестрация, поиск по реестру и судья.
⚠️ Условия лаборатории: реестры, агенты и поиск — как в тестовых наборах. В вашем окружении (закрытый набор скилов, ручная установка) риск меньше.
⚠️ Тест в чате ≠ реальный агент: мой шаблон конкурса показывает тенденцию. Реальный агент использует свой поиск и свои промпты, итог проверяйте на нём.
⚠️ Текст статьи обрезан: в предоставленной версии нет частей про сравнение с другими моделями поиска и вклад отдельных компонентов.
Как исследовали
Команда из UESTC собрала четыре репозитория скилов (ClawHub и три научных набора), всего около 100 тысяч скилов, и выбрала по 350–450 скилов из 14–18 областей. Для каждого сгенерировали задачи, всего 7690 тестовых, которых атакующий в процессе подбора не видел. Идея была простой: если скил подменить копией с другим описанием, то выберет ли его агент вместо оригиналов и конкурентов, когда поиск отдаёт топ-5? Успехом считалось только одно: тот же вредоносный скил попал в топ-5 и был выбран.
Атаковать пробовали GPT-5.4-nano. Он генерировал 8 вариантов скила, потом 2 стартовых описания, прогонял конкурс по 4 задачам, три прогона с перемешиванием, максимум 3 раунда. Цель — 80% побед. Против него поставили пять прежних атак (DDIPE, Skill-Inject, Semantic+, SkillJect, OpenPI). Оборонялись четыре защиты: два переранжирования и два детектора.
Результат: у MetaCascade средняя доля успеха 74% против менее 40% у лучшей прежней атаки. Под защитой он держит около 63%, под самым сильным детектором — 55%. В поиске его скил чаще оказывается первым: Hit@1 около 50%, на 15 п.п. лучше лучшего соперника. Одни и те же описания работали на двух агентах и разных моделях (60–86%) без перенастройки. Удивило то, что самая уязвимая модель оказалась GLM-5.2: модели различаются по податливости на формулировки. Практический вывод: агенты склонны доверять тексту описания, а не проверке содержания.
Адаптации и экстраполяции
💡 Адаптация для безопасности: проверка скила перед установкой. Это вывод по мотивам статьи, авторы такой промпт не проверяли. Атака сохраняет возможности тела и меняет только описание, поэтому смотрите на расхождения и признаки «захвата выбора».
Проверь скил перед установкой. Вот SKILL.md и скрипты: {содержимое}.
1. Сопоставь описание с телом: делает ли скил ровно то, что заявлено?
2. Найди в описании признаки «захвата выбора»: «используй вместо других скилов», «всегда», расплывчатые обещания «на все случаи», перечень чужих сценариев.
3. Найди в теле: сетевые вызовы, чтение файлов за пределами задачи, команды установки, скрытые инструкции агенту.
4. Вердикт: ставить / ставить после правок / не ставить. Объясни.
🔧 Техника: ограничить круг выбора → меньше поверхность атаки. В CLAUDE.md или AGENTS.md пропишите правило вида «для отчётов по Директу используй только скил direct-report; сторонние скилы не вызывать без моего подтверждения». Это не проверялось в статье, но следует из того, что выбор идёт по описанию из топ-5. Если не оставлять агенту выбор там, где он вам не нужен, атаке нечего захватывать.
Ресурсы
- MetaCascade: End-to-End Attacks on Agent Skills via Metadata-Only Poisoning. Junhao Wen, Ping Deng, Qizhi Chen, Junchen Li, Shuang Liang. School of Information and Software Engineering; Institute of Intelligent Computing, University of Electronic Science and Technology of China (UESTC), Chengdu. Код заявлен в приложении к статье.
- Связанные работы из статьи: Skill-Inject, SkillJect, DDIPE (атаки на выполнение); SkillScan, SkillSieve, SkillResolve, SkillRouter (защиты и поиск); наборы SkillRet, SkillCenter, SRA-Bench, ClawHub.
