Обнаружена критическая уязвимость в ИИ-навыках: сканеры безопасности упускают важный вектор атаки

Обнаружена критическая уязвимость в ИИ-навыках: сканеры безопасности упускают важный вектор атаки

Исследователи обнаружили серьезную уязвимость в системе безопасности «навыков» (Skills) для ИИ-агентов, которая позволяет злоумышленникам обходить существующие сканеры угроз. Проблема заключается в том, что вредоносный код может скрываться в тестовых файлах, которые не анализируются традиционными сканерами, но при этом выполняются с полным доступом к системе разработчика.

«Слепое пятно» сканеров: тестовые файлы как скрытый вектор атаки

Согласно отчету исследователя Дживана Джутлы из Gecko Security, стандартные сканеры, такие как Anthropic Skill scanner, тщательно проверяют инструкции Markdown и основные скрипты «навыков», ища инъекции промптов или скрытые команды оболочки (командной строки). Однако они игнорируют тестовые файлы (например, *.test.ts), полагая, что эти файлы не являются частью «поверхности выполнения» агента, то есть напрямую не используются ИИ-агентом.

Тем не менее, когда разработчик устанавливает «навык» с помощью команды вроде npx Skills add, вся директория «навыка», включая тестовые файлы, копируется в репозиторий. Популярные тестовые фреймворки, такие как Jest, Vitest и Mocha, автоматически обнаруживают и выполняют эти тестовые файлы (даже при автозапуске тестов в среде разработки или при выполнении npm test). Вредоносный код, внедренный в тестовый файл (например, в блок beforeAll), может быть выполнен до каких-либо проверок, незаметно для разработчика.

Это предоставляет злоумышленникам полный доступ к файловой системе, переменным окружения и ключам SSH. В системах непрерывной интеграции (CI) такие переменные могут содержать критически важные данные, включая токены развертывания, облачные учетные данные и другие секреты конвейера CI/CD.

Масштаб проблемы: подтверждено тремя аудитами

Раскрытие уязвимости от Gecko Security стало кульминацией серии исследований, которые уже указывали на широкое распространение проблем безопасности в экосистеме «навыков» Anthropic. Эти исследования, однако, фокусировались на том, что сканеры обнаруживают, в то время как Gecko выявила, что они упускают.

  • Академическое исследование SkillScan, опубликованное 15 января, проанализировало 31 132 уникальных «навыка» Anthropic с двух крупных маркетплейсов. Результаты показали, что 26,1% «навыков» содержали как минимум одну уязвимость. Из них 13,3% имели уязвимости, ведущие к утечке данных, и 11,8% — к повышению привилегий. «Навыки», включающие исполняемые скрипты, в 2,12 раза чаще содержали уязвимости, чем «навыки» только с инструкциями.
  • Отчёт ToxicSkills от Snyk, опубликованный через три недели, стал первым всесторонним аудитом безопасности маркетплейсов ClawHub и skills.sh. Команда Snyk просканировала 3 984 «навыка», выявив критические проблемы безопасности в 13,4% из них. Было подтверждено 76 вредоносных модулей, восемь из которых всё ещё были доступны на ClawHub на момент публикации исследования.
  • Cisco AI Agent Security Scanner, выпущенный 21 апреля, интегрирует сканер «навыков» Cisco с открытым исходным кодом непосредственно в среды разработки (IDE) VS Code, Cursor и Windsurf. Однако этот сканер также не проверяет тестовые файлы, поскольку его категории обнаружения нацелены на уровень взаимодействия с агентом, а не на цепочку инструментов разработчика.

Таким образом, три основных сканера «навыков» Anthropic имеют одно «структурное слепое пятно»: ни один из них не рассматривает тестовые файлы как потенциальную поверхность для выполнения вредоносного кода, хотя Gecko Security доказала, что эти файлы выполняются с полными локальными разрешениями через стандартные тестовые фреймворки.

Механизм атаки и её распространение

При выполнении команды npx skills add owner/repo-name инсталлятор клонирует репозиторий «навыка» и копирует его содержимое в директорию .agents/skills// внутри проекта. Тестовые фреймворки Jest и Vitest по умолчанию используют рекурсивные шаблоны поиска, которые обнаруживают тестовые файлы даже в скрытых директориях, таких как .agents/. Mocha также следует аналогичным рекурсивным шаблонам по умолчанию.

Злоумышленник может опубликовать «навык» с «чистым» файлом SKILL.md, но с вредоносным тестовым файлом tests/reviewer.test.ts, содержащим блок beforeAll. Этот блок может считывать переменные окружения (process.env), файлы .env, приватные ключи SSH из ~/.ssh/ и учетные данные AWS из ~/.aws/credentials, отправляя всю информацию на внешний сервер. Эксфильтрация данных происходит бесшумно во время настройки тестов, независимо от того, проходят они или нет.

Вектор атаки не ограничивается TypeScript. Репозитории Python сталкиваются с аналогичной угрозой через файл conftest.py, который pytest автоматически выполняет при сборе тестов. Эта проблема усугубляется тем, что директория .agents/skills/ часто коммитится в репозиторий для совместного использования «навыков» в команде. Шаблоны .gitignore GitHub по умолчанию не исключают .agents/. Таким образом, вредоносный тестовый файл, попав в репозиторий, выполняется каждым разработчиком при клонировании и запуске тестов, а также каждым конвейером CI.

Сканеры анализируют не ту область угроз

Технический директор CrowdStrike Элиа Зайцев на конференции RSAC 2026 подчеркнул, что «наблюдение за фактическими кинетическими действиями — это структурированная, решаемая проблема, а вот намерение — нет». Это различие точно описывает пробел в сканерах «навыков» Anthropic. Ни один публично задокументированный сканер не работает вне предположения, что угроза находится в файле SKILL.md и в скриптах, которые ИИ-агент должен выполнять. Эти инструменты анализируют намерение: что «навык» говорит агенту делать? Находка Gecko относится к «кинетической» стороне: тестовый файл выполняется через собственный набор инструментов разработчика. Агент не задействован, промпт не интерпретируется, а вредоносный код, написанный на TypeScript, выполняется с полными локальными разрешениями через легитимный тестовый фреймворк. Сканер решал не ту проблему.

Майк Ример, старший вице-президент группы сетевой безопасности и главный специалист по информационной безопасности в Ivanti, отметил, что злоумышленники проводят обратную разработку патчей в течение 72 часов. Если компания не установит патч в течение 72 часов после выпуска, она становится уязвимой. Большинству компаний требуются недели на это. «Слепое пятно» сканеров «навыков» Anthropic только усугубляет эту проблему. Разработчик устанавливает вредоносный «навык», тестовый файл выполняется немедленно, и поскольку сканер не обнаружил угрозу, патча не существует.

Таблица аудита «навыков» Anthropic: как закрыть пробелы

Издание VentureBeat, освещающее цепочку поставок «навыков» Anthropic с момента кампании ClawHavoc в январе, выявило общую проблему: команды безопасности покупают сканеры, получают «чистые» отчеты, но не имеют инструментов для понимания того, что сканеры не проверяют. Ниже представлена таблица аудита, объединяющая результаты опубликованных исследований (Snyk, SkillScan) с выявленным Gecko методом обхода сканеров. Каждая строка представляет собой поверхность обнаружения, которую команда безопасности должна проверять перед утверждением любого инструмента сканирования «навыков».

  • Вопрос аудита: Проверка SKILL.md и скриптов, вызываемых агентом
    Что сканеры делают сегодня: Охватывается Snyk Agent Scan, Cisco AI Agent Security Scanner, VirusTotal Code Insight
    Пробел: Это охваченная поверхность. Злоумышленники перемещают вредоносный код в файлы за пределами этой области.
    Рекомендуемые действия: Продолжайте использовать текущие сканеры. Они выявляют реальные угрозы на уровне инструкций.
  • Вопрос аудита: Проверка включенных тестовых файлов (*.test.ts, *.spec.js, conftest.py)
    Что сканеры делают сегодня: В настоящее время не проверяется как поверхность атаки никакими сканерами
    Пробел: Gecko доказала, что тестовые файлы выполняются через Jest/Vitest (задокументировано) и Mocha (зависит от конфигурации) с полными локальными разрешениями. Агент не задействован.
    Рекомендуемые действия: Добавьте .agents/ в testPathIgnorePatterns (для Jest) или exclude (для Vitest). Одна строка в файле конфигурации.
  • Вопрос аудита: Пометка «навыков», содержащих тестовые файлы или конфигурации сборки, как более высокорискованных
    Что сканеры делают сегодня: Не помечается как метаданные повышенного риска никакими сканерами
    Пробел: Тривиальная статическая проверка. «Навыки» с дополнительными исполняемыми файлами в 2,12 раза чаще содержат уязвимости (SkillScan).
    Рекомендуемые действия: Добавьте проверку CI: find .agents/ -name "*.test.*" | grep -q . && exit 1. Блокируйте слияние при обнаружении.
  • Вопрос аудита: Ограничение шаблонов глобального поиска тестового фреймворка путями, принадлежащими проекту
    Что сканеры делают сегодня: Редко. Большинство конфигураций CI используют рекурсивный поиск. Jest/Vitest по умолчанию передают dot: true.
    Пробел: Шаблоны по умолчанию обходят директории .agents/, .claude/, .cursor/. Вредоносные тестовые файлы обнаруживаются автоматически.
    Рекомендуемые действия: Ограничьте корни тестов собственными директориями проекта (например, src/, app/). Запретите .agents/, .claude/, .cursor/.
  • Вопрос аудита: Различение «навыков» со скриптами и «навыков» только с инструкциями
    Что сканеры делают сегодня: Частичное покрытие через статический и семантический анализ
    Пробел: SkillScan: «навыки» со скриптами в 2,12 раза чаще содержат уязвимости, чем «навыки» только с инструкциями.
    Рекомендуемые действия: Требуйте структурированного элемента аудита: тип «навыка», поверхности выполнения, покрытие сканером, остаточный риск.
  • Вопрос аудита: Публикация методологии аудита с размером выборки
    Что сканеры делают сегодня: Snyk — да (3 984 «навыка»). SkillScan — да (31 132 «навыка»).
    Пробел: Cisco и новые сканеры не опубликовали эквивалентные аудиты в масштабах экосистемы.
    Рекомендуемые действия: Спрашивайте поставщиков: методология, размер выборки, уровень обнаружения. Отсутствие опубликованного аудита означает отсутствие независимой базовой линии.
  • Вопрос аудита: Привязка источников «навыков» к неизменяемым коммитам
    Что сканеры делают сегодня: Не обеспечивается никакими сканерами или маркетплейсами
    Пробел: Авторы «навыков» могут отправить «чистую» версию для проверки, а затем добавить вредоносный тестовый файл после одобрения.
    Рекомендуемые действия: Привязывайте к конкретному хэшу коммита. Проверяйте изменения при каждом обновлении. OWASP Agentic Skills Top 10 рекомендует это.

Три шага по усилению безопасности CI, которые следует предпринять немедленно

Сканеры «навыков» Anthropic установили границу защиты на файле SKILL.md. Злоумышленники переместили вредоносный код в соседнюю директорию. Следующие три изменения переносят границу туда, где код фактически выполняется. Эти изменения займут всего несколько минут и не требуют замены текущих инструментов или ожидания, пока поставщики сканеров устранят этот пробел.

  1. Добавьте .agents/ в список игнорирования тестового фреймворка. В Jest добавьте /\.agents/ в testPathIgnorePatterns в файле jest.config.js. В Vitest добавьте **/.agents/** в массив exclude в файле vitest.config.ts. Одна строка в одном файле конфигурации предотвращает обнаружение тестовым фреймворком файлов внутри установленных директорий «навыков». Сделайте это, независимо от того, использует ли ваша команда «навыки» Anthropic в настоящее время. Директория может появиться в клонированном репозитории, даже если никто не устанавливал «навык» напрямую.
  2. Проверяйте каждую установку «навыка» на наличие неинструкционных файлов перед слиянием. Добавьте проверку CI, которая помечает любой файл в .agents/skills/, соответствующий *.test.*, *.spec.*, __tests__/, *.config.* или conftest.py. Эти файлы не имеют законных причин находиться внутри директории «навыка». Проверка представляет собой одну строку в оболочке: [ -d .agents ] && find .agents/ -name "*.test.*" -o -name "*.spec.*" -o -name "conftest.py" -o -name "*.config.*" -o -type d -name "__tests__" | grep -q . && exit 1. Если обнаружится совпадение, заблокируйте слияние. Для любых тестовых файлов, которые все же попадают в запрос на слияние (PR), требуйте от рецензента проверки на предмет вызовов оболочки (exec, spawn, child_process), внешних сетевых вызовов и файловых операций, затрагивающих секреты или SSH-ключи.
  3. Привязывайте источники «навыков» к конкретным коммитам, а не к последней версии. Команда npx skills add копирует содержимое репозитория на момент установки. Автор «навыка» может отправить «чистую» версию для проверки сканером, а затем добавить вредоносный тестовый файл после одобрения. Привязка к конкретному хэшу коммита преобразует модель «доверия при первом использовании» в модель «проверки при каждом изменении». Это именно то, что рекомендовано в OWASP Agentic Skills Top 10.

Если «навыки» уже находятся в вашем репозитории, немедленно выполните команду find, указанную выше, для вашей существующей директории .agents/. Если тестовые файлы присутствуют, рассматривайте это как потенциальный компромисс: смените все учетные данные, доступные CI (токены развертывания, облачные ключи, SSH-ключи), проверьте логи CI на предмет неожиданных исходящих сетевых вызовов во время выполнения тестов и просмотрите историю Git, чтобы определить, когда тестовые файлы попали в репозиторий и какие конвейеры их выполняли.

Пять вопросов поставщику сканера «навыков» Anthropic

Команды безопасности заключают контракты на первые специализированные инструменты для сканирования «навыков». Обход сканеров, обнаруженный Gecko, означает, что вопросы, задаваемые на этих встречах, должны измениться. Не останавливайтесь на вопросе «Обнаруживаете ли вы инъекции промптов?». Спросите:

  1. Какие файлы и директории в репозитории «навыка» ваш сканер фактически анализирует?
  2. Рассматриваете ли вы тестовые файлы как потенциальные поверхности для выполнения вредоносного кода?
  3. Можете ли вы помечать «навыки», которые содержат тесты, конфигурации CI или скрипты сборки, как более высокорискованные? SkillScan показал, что «навыки» со скриптами в 2,12 раза чаще содержат уязвимости.
  4. Предоставляете ли вы интеграцию или рекомендации по ограничению шаблонов глобального поиска тестового фреймворка в CI? Cisco заслуживает похвалы за открытие исходного кода своего сканера «навыков» на GitHub, что позволяет командам безопасности точно проверять, какие категории обнаружения реализует инструмент. Эта прозрачность является базовым требованием, которое должен выполнять каждый поставщик. Если ваш поставщик не публикует категории обнаружения или не предоставляет открытый исходный код своей логики сканирования, вы не сможете проверить, что он проверяет, а что пропускает.
  5. Опубликовали ли вы аудит в масштабах экосистемы с методологией и размером выборки? Snyk опубликовал данные по 3 984 «навыкам». SkillScan опубликовал данные по 31 132. Ример описывает модель раскрытия: «Они решили не публиковать CVE. Они просто тихо пропатчили и пошли дальше». Экосистема «навыков» Anthropic демонстрирует ранние признаки той же модели: сканеры документируют то, что они обнаруживают, не описывая поверхности, до которых они не дотягиваются. Разрыв между задокументированным покрытием и фактической поверхностью выполнения — это то место, где обитает вектор атаки через тестовые файлы.

Сканер неполон, а не сломан

Экосистема «навыков» Anthropic повторяет раннюю историю цепочки поставок npm, но без десятилетия накопленных инцидентов, которые вынудили реестры пакетов создавать инфраструктуру безопасности. Набор данных SkillScan из 31 132 «навыков» показал, что четверть экосистемы содержит уязвимости. Snyk обнаружил 76 подтвержденных вредоносных модулей менее чем в 4 000 «навыках». Gecko доказала, что сама модель сканера имеет структурный пробел, который ни один поставщик публично не задокументировал. Оценки сканеров последовательно проверяют охваченную поверхность. «Таблица аудита «навыков» Anthropic» предоставляет командам безопасности семь поверхностей аудита для проверки перед подписанием контракта. Три шага по усилению безопасности CI — это исправления, которые необходимо внедрить до следующей установки «навыка». Команда Римера в Ivanti наблюдает, как цикл «патч-эксплойт» сокращается в реальном времени в корпоративных средах. Вектор атаки через тестовые файлы сокращает его еще больше: сканер не пометил угрозу, поэтому «окна» для патча просто не существует. Сканер не сломан. Он просто неполон. Модель угроз остановилась на агенте. Тестовый фреймворк — нет.

Как сделать фаркоп
Как поменять масляный фильтр
Выгодное предложение: премиальные спортивные часы Garmin Forerunner 970 получили редкую скидку
Сорняк лисохвост
Что нужно розам в июле для пышного цветения: 5 главных задач и ошибка, которая может его остановить