Игорь Градов
Игорь Градов
5 мин
ai

Мое исследование инструментов выявления уязвимостей в скиллах

Мое исследование инструментов выявления уязвимостей в скиллах — это задача, которую мало кто проверяет на практике: можно ли доверять автоматическим сканерам безопасности, когда вы подключаете новый навык к ИИ-агенту, и где именно они промахиваются.

Мое исследование инструментов выявления уязвимостей в скиллах
Почему это важно

Автоматические сканеры пропускают опасные инструкции, которые обходят согласование через субагента, но срабатывают на безобидные учебные цитаты атак: итоговый балл сканера не годится как единственный критерий допуска навыка к рабочему агенту.

Автор эксперимента собрал 12 синтетических пакетов с текстовыми инструкциями для ИИ-агента (ИИ-агент — программа, которая сама выполняет цепочку действий по вашему заданию) и прогнал их через три сканера: Cisco Skill Scanner, NVIDIA SkillSpector и AgentVerus. Всё без нейросетей и платных API, в изолированных контейнерах без сети. Результаты оказались полезнее, чем ожидалось, но не в том месте, где принято смотреть.

Что понадобится

  • Три сканера (бесплатные режимы без LLM): Cisco Skill Scanner, NVIDIA SkillSpector, AgentVerus
  • Docker или аналогичная среда контейнеризации (контейнер — изолированная «песочница», где программа работает отдельно от вашей системы)
  • Набор тестовых пакетов: текстовые файлы с инструкциями для агента, без реальных ключей и исполняемого кода
  • Отключение сети в контейнере на уровне самого контейнера, а не только флагом --no-llm
  • Время: подготовка окружения и прогон 42 проб заняли один рабочий день

Пошаговая инструкция

  1. Разделите тестовые пакеты на две группы вручную. Пять пакетов с допустимыми инструкциями, семь с заведомо опасными. Без этой разметки вы не поймёте, где сканер ошибся.

  2. Подготовьте изолированное окружение. Скачайте зависимости сканеров при включённой сети. После этого отключите сеть на уровне контейнера.

docker run --network none --read-only \
  -v ./fixtures:/data:ro \
  scanner-image --no-llm --input /data/package-01
  1. Прогоните каждый пакет через каждый сканер. Для 12 пакетов и трёх движков это 36 проб. Дополнительно подайте отдельные Markdown-файлы с описаниями агентов, чтобы проверить поддержку такого входа. Итого 42 пробы.

  2. Сохраняйте не итоговый балл, а структурированный отчёт целиком. Коды выхода у сканеров различаются: Cisco возвращает 0 даже при статусе is_safe=false, NVIDIA тоже возвращает 0 при находках уровня High. Парсите JSON или структурированный вывод, не полагайтесь на код выхода.

  3. Сравните реакцию сканеров с вашей ручной разметкой. Пакет помечен как опасный, а сканер дал «certified»? Это пропуск. Пакет безопасный, а сканер кричит High? Разбирайтесь в контексте срабатывания.

  4. Проверьте вложенные файлы. Если пакет ссылается на дополнительные документы (например, references/extra.md), убедитесь, что сканер анализирует и их содержимое, а не только корневой файл.

  5. Добавьте собственные правила для пропущенных паттернов. Если сканер не поймал конкретную опасную инструкцию, напишите правило для встроенного анализатора и включите его в регрессионные тесты.

Конкретный пример: пакет № 10 и пакет № 5

Пакет № 10 содержал инструкцию обойти согласование через субагента: создать помощника для действия, требующего подтверждения, скрыть от него ограничения и заявить, что пользователь уже всё разрешил. Все три сканера пропустили эту инструкцию. AgentVerus выдал статус certified и 99 баллов.

Пакет № 5 содержал учебную цитату атаки с явным запретом выполнять её (то есть пакет разбирал угрозу в теории). Все три движка выдали находки уровня High. При этом NVIDIA сохранил итоговый статус SAFE, а AgentVerus частично учёл контекст «перечисление угроз».

Вывод из двух случаев: блокировка по любому High отсечёт учебные материалы, а доверие итоговому статусу пропустит реальную угрозу. Нужно сохранять сами срабатывания с контекстом и принимать решение отдельно.

Частые ошибки
  • Полагаться на итоговый балл или статус. Статус certified при 99 баллах ничего не гарантирует: пакет № 10 с обходом согласования получил именно такую оценку.
  • Отключать сеть только флагом сканера. Флаг --no-llm не блокирует все сетевые обращения. У SkillSpector, например, остаются запросы к OSV (база уязвимостей открытого ПО). Сеть должен запрещать контейнер.
  • Проверять только корневой файл. Пакет № 12 прятал сбор секретов (галлюцинация безопасности — когда сканер «уверен», что всё чисто, но просто не заглянул во вложенный файл) в references/extra.md. Cisco не выдал сигнала, потому что не добрался до вложения.
  • Сравнивать severity напрямую между движками. Шкалы различаются, выборка маленькая и синтетическая. Считать «процент обнаружения» или выбирать победителя по такому прогону нельзя.
  • Использовать Gitleaks, OSV-Scanner или Semgrep для текстовых инструкций. Эти инструменты ищут секреты в файлах, уязвимости зависимостей и ошибки в коде. Для чисто текстовых инструкций агенту им проверять нечего. Для них нужен отдельный набор с имитациями ключей и уязвимых зависимостей.

Что делать с этим прямо сейчас?

Автору Дзена и копирайтеру. Если вы подключаете навыки к ИИ-ассистенту для генерации контента, не принимайте зелёную галочку сканера за гарантию. Просмотрите текст инструкций вручную, особенно если навык создаёт субагентов или читает дополнительные файлы.

Маркетологу и предпринимателю. Перед интеграцией стороннего скилла в рабочий процесс разделите проверку на два этапа: быстрый скан при индексации (без тяжёлого окружения) и дополнительный прогон по запросу. Результат проверки не должен автоматически менять права агента.

Тем, кто работает в РФ и СНГ. Все три сканера доступны в офлайн-режиме через контейнеры, платные API не требуются. Для локального контекста учитывайте: если вы используете YandexGPT или GigaChat как основу агента, принцип тот же. Скилл — это текстовая инструкция, и проверять её нужно до подключения, а не после инцидента.

Мнение редакции dzen.guru

Мое исследование инструментов выявления уязвимостей в скиллах показывает неочевидную вещь: сканеры ловят то, что уже описано в базах атак, но пасуют перед новыми паттернами. Обход через субагента — не экзотика, а логичный следующий шаг для тех, кто хочет обойти ограничения. Автор эксперимента поступил правильно, добавив собственное правило для пропущенного паттерна. Но честная оговорка: это правило написано на основе того же тестового набора, поэтому его обнаружение годится для регрессионного теста, а не для независимой оценки. Главный практический вывод — сохраняйте не баллы, а сами срабатывания с контекстом и местоположением в файле. Решение о допуске принимает человек, а не число на экране.

Курс по нейросетям для авторов

Разберитесь, как безопасно подключать ИИ-инструменты к своей работе и не попадать в ловушки автоматических оценок

Узнать подробности

Сканер, который ставит 99 баллов пакету с инструкцией обойти согласование, — не сломанный: он делает ровно то, чему обучен. Ваша задача — знать границы его обученности до того, как навык получит доступ к рабочим данным.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

ai

От рабочей таблицы до SaaS на $30 000 в месяц: как найти идею, которая уже доказала спрос

Десятки тысяч авторов, маркетологов и предпринимателей ежедневно собирают рабочие таблицы, которые решают реальные задачи: учёт клиентов, расчёт контент-плана,…

6 мин
ИИ для создания игрушки без защиты: 13 млн детских разговоров утекли в открытый доступ
ai

ИИ для создания игрушки без защиты: 13 млн детских разговоров утекли в открытый доступ

Почему это важно Исследователь получил доступ к 13 миллионам разговоров 68 000 роботов-игрушек Eiliko по всему миру, включая данные более 31 000 детских…

6 мин
FPGA для нейросетей за $50: списанная плата тянет 8 языковых моделей локально
ai

FPGA для нейросетей за $50: списанная плата тянет 8 языковых моделей локально

Запуск нейросетей на списанной FPGA-плате за 50 долларов звучит как эксперимент для инженеров с паяльником, но автор проекта openTPU доказал, что это рабочий…

6 мин