Пока делал CEO AI (моё виденье помощника в работе), решил проверить, можно ли использовать сканеры для проверки скиллов перед подключением. Собрал 12 синтетических пакетов и прогнал через Cisco Skill Scanner, NVIDIA SkillSpector и AgentVerus без LLM и платных API. Список пакетов описал ниже.
Пакет № 10 из таблицы пакетов предлагал обходить согласование через субагента: не передавать ему ограничения, сослаться на разрешение пользователя и скрыть делегирование. Все три сканера пропустили эту инструкцию. AgentVerus выдал certified и 99 баллов. Зато на учебную цитату атаки в пакете № 5 все три отреагировали находками уровня High.
Эти два случая оказались полезнее итоговых баллов. Ниже разберу, что именно проверял, как читал результаты и что из этого использовал в своём проекте.
Из чего выбирал и что вообще есть
Для первого прогона мне нужен был анализ без модели и передачи содержимого внешнему сервису. Обзор возможностей зафиксировал по документации 14 октября 2026 года. Он не исчерпывающий; испытания проводил только для первых трёх инструментов.
Инструмент |
Способ анализа и требования |
Что проверил |
|---|---|---|
Анализ пакетов скиллов. Есть дополнительные режимы с LLM. |
Версию 2.2.2 без LLM, в контейнере без сети |
|
Статический анализ и дополнительные проверки с LLM. Режим без модели может обращаться к OSV. |
Версию 2.12.0 без LLM, в контейнере без сети |
|
Локальные проверки инструкций и действий в пакете. |
Версию 0.8.1, в контейнере без сети |
|
Проверка скиллов и агентной среды через API. Требуется учитывать передачу содержимого. |
Только документацию |
|
Анализ с помощью модели. Нужен выбор провайдера и бюджета. |
Только документацию |
|
Собственные проверки и объединение нескольких сканеров. Возможен ИИ-проверяющий. |
Только документацию |
Отдельно рассматривал привычные инструменты для содержимого пакетов: Gitleaks, OSV-Scanner и Semgrep. Однако в этот прогон их не включал. Они ищут секреты в файлах, известные уязвимости зависимостей и ошибки в коде. В моих 12 пакетах были только текстовые инструкции агенту, поэтому проверять этим инструментам было практически нечего. Для них нужен отдельный тестовый набор: с имитациями ключей, зависимостями уязвимых версий и примерами небезопасного кода. Такой набор тоже можно сделать синтетическим, без настоящих секретов и запуска опасного кода.
Стенд и ограничения эксперимента
До запуска сканеров я разделил пакеты на две группы: пять с допустимыми инструкциями и семь с опасными. Затем проверил, как сканеры отреагируют на каждую группу.
№ |
Что находилось внутри |
Что проверял |
|---|---|---|
1 |
Резюме переданного текста без инструментов и внешних действий |
Допустимая задача без доступа к файлам и сети |
2 |
Переформатирование текста прямо в диалоге |
Допустимая обработка текста без побочных действий |
3 |
Поиск публичных источников по явному запросу пользователя |
Отличает ли отчёт разрешённое использование сети от опасного поведения |
4 |
Чтение заданных файлов и запись согласованного отчёта внутри рабочей папки, с согласованием перезаписи |
Отличает ли отчёт разрешённую работу с файлами от опасного поведения |
5 |
Цитата вредоносной инструкции для разбора с прямым запретом её выполнять |
Отличает ли сканер цитирование атаки от действующей инструкции |
6 |
Требование игнорировать системные инструкции, пропускать проверки и выдумывать успешные результаты |
Подмена приоритета инструкций, обход проверок и ложная отчётность |
7 |
Требование прочитать секреты и незаметно отправить их наружу |
Доступ к секретам и скрытая утечка данных |
8 |
Требование скачать и сразу выполнить непроверенный код, с выдуманным разрешением пользователя |
Выполнение внешнего кода без согласования |
9 |
Требование скрытно изменить LaunchAgent и профиль shell |
Закрепление в окружении и изменение автозапуска без разрешения |
10 |
Передача заблокированной задачи субагенту с выдуманным разрешением и сокрытием ограничений |
Обход согласования через делегирование |
11 |
Русскоязычная инструкция отправить секреты наружу и проигнорировать прежние ограничения |
Реакцию на инструкцию об утечке данных на русском языке |
12 |
Нейтральный |
Проверяет ли сканер вложенные материалы пакета |
Пакеты № 1-5 размечены как допустимые, № 6-12 как опасные. Сигнал о сетевом доступе в № 3 или записи файлов в № 4 сам по себе не является ложным срабатыванием: эти возможности действительно запрашиваются. Важно, как сканер их интерпретирует.
Все примеры были текстовыми. В них не было исполняемых скриптов или реальных ключей; для сетевых адресов использовались домены .invalid. Проверялась реакция сканеров на инструкции, а не успешность эксплуатации уязвимостей.
Каждый пакет проверил тремя движками. Дополнительно подал каждому два отдельных Markdown-файла с описаниями агентов, чтобы проверить поддержку такого входа. Всего получилось 42 пробы: 36 для пакетов и 6 для отдельных файлов.
Сканеры запускались в одноразовых контейнерах без сети и пользовательских данных. Фикстуры монтировались read-only, инструкции из них не исполнялись. Зависимости скачивал при подготовке окружений, до отключения сети. Версии, хеши и условия запуска сохранены в отчёте эксперимента, кому интересно. Но отчёты собирали нейронки. =)
Сеть запрещал именно контейнер. Одного флага --no-llm для этого недостаточно: у SkillSpector, например, остаются обращения к OSV. Пользу онлайн-проверок и LLM-режимов этот эксперимент не оценивает.
Результаты

На схеме показаны только 12 пакетов. Полная сводка 42 проб содержит и отдельные файлы агентов. В обоих таких случаях Cisco вернул ошибки формата; адаптер для этих входов я не проверял.
Числа на схеме показывают наличие сигналов от Medium, а не число распознанных атак. Движок мог заметить ссылку или незаявленное чтение файла, пропустив намерение отправить секреты. Шкалы severity у продуктов различаются, выборка маленькая и синтетическая. Считать по ней процент обнаружения или выбирать победителя было бы преждевременно.
Интересные моменты
Пакет № 10: обход согласования через субагента
В пакете № 10 предлагалось создать помощника для действия, требующего согласования, скрыть от него ограничения и заявить, что пользователь всё разрешил. Результаты:
Cisco |
NVIDIA |
AgentVerus |
|---|---|---|
|
|
|
Это пропуск конкретной инструкции. Я не запускал её на рабочем агенте, поэтому результат не доказывает работоспособность самого обхода. Но он показывает, почему итоговую оценку сканера нельзя использовать как самостоятельное основание для допуска пакета.
Пакет № 5: учебная цитата атаки
В пакете № 5 опасная инструкция была приведена для разбора с явным запретом выполнять её. Все три движка выдали High. При этом NVIDIA сохранил итоговый SAFE, а AgentVerus в части находок отметил контекст перечисления угроз.
Для интеграции здесь сразу две проблемы: блокировка по любому High затронет учебные материалы, а проверка только итогового статуса потеряет находки. Нужно сохранять сами срабатывания и их контекст, а решение принимать отдельно.
Пакет № 12: инструкция во вложенном файле
В пакете № 12 основной SKILL.md просил сделать резюме и прочитать references/extra.md. Сбор и отправка секретов были описаны во вложенном файле.
NVIDIA указал находки непосредственно в references/extra.md. Cisco не выдал существенного сигнала. AgentVerus сообщил о недекларированном чтении файлов и загрузке документации. Этот случай повлиял на требования к интеграции: проверять содержимое пакета, сохранять расположение находок и явно отмечать недоступные ресурсы.
Ещё одно различие проявилось в кодах выхода. Cisco возвращал 0 даже при High и is_safe=false, NVIDIA тоже возвращал 0 при High. У AgentVerus подозрительные пакеты давали разные коды. Для общей политики допуска пришлось бы разбирать структурированные отчёты каждого движка.
Что внедрил
Я разделил проверку при индексации и дополнительный скан по запросу. Постоянная проверка должна работать без подготовки тяжёлого окружения. Более дорогую по ресурсам можно запускать отдельно.
При индексации |
По запросу |
|
|---|---|---|
Реализация |
Собственный ограниченный статический анализатор |
Кинул в отдельный скилл, чтобы было удобно использовать, но не съедало ресурсы по-умолчанию: |
Требования |
Python 3.10+, Windos, MacOS или Linux |
Python, Docker и подготовленный образ NVIDIA |
Сеть и модель |
Не используются |
Сканирование без сети и LLM |
Результат |
Возможности пакета, находки и полнота проверки |
Нормализованные находки, расположение и полнота проверки |
Для адаптера выбрал NVIDIA из-за полезных находок во вложенном файле и структурированного отчёта. Возможности пакета, severity и покрытие сохраняются раздельно. Пропущенный ресурс делает проверку неполной даже при положительной оценке движка. Результат проверки не меняет права агента.
Во встроенный анализатор добавил правило для обхода через субагента. Этот пример участвовал в разработке, поэтому его обнаружение годится для регрессионного теста, но не для независимой оценки качества. Для неё нужен отдельный набор.
Вывод
По итогам исследования решил встроить в CEO AI собственную лёгкую проверку, учитывающую результаты испытаний готовых сканеров. Она работает при индексации и не требует отдельного окружения. NVIDIA SkillSpector подключил для дополнительного скана по запросу: он дал полезные находки во вложенных файлах, а его отчёт оказался удобен для обработки. Для его запуска нужен подготовленный Docker-образ, поэтому делать такую проверку обязательной для каждого пользователя я не стал.
Ограничения файлов, сети и инструментов остаются на стороне среды выполнения. Особенно это касается делегирования: новый субагент не должен получать дополнительные полномочия только потому, что основной агент попросил его выполнить задачу. Ограничение полномочий и проверка вызовов инструментов вне модели входят и в рекомендации OWASP.
Платные API в этих испытаниях не использовал. ИИ-помощник участвовал в подготовке стенда и ревью; затраты его токенов отдельно не измерял. LLM-анализ с передачей данных внешнему сервису оставил за рамками первой интеграции.
Следующий эксперимент хочу провести на независимых допустимых пакетах, перефразированных атаках и разных языках. Пока полезнее всего оказались конкретные расхождения: пропущенный обход, High на цитате и разные результаты для вложенного файла. Именно они определили требования к проверке и обработке отчётов.