Scorecard сканеров · корпус v1 · статические режимы · 2 ноября 2026
Статическая оценка следует за размером пакета, а не за намерением
Мы прогнали два открытых сканера безопасности для скиллов ИИ-агентов — NVIDIA SkillSpector и skill-scanner от Cisco — через 186 реальных скиллов на четырёх языках и 40 обезвреженных образцов атак. Всё, что ниже, цитирует собственный вывод движков.
Андрей Трухачевskillverdict.devданные: CC BY 4.0код: Apache-2.01 900 слов
Скилл агента — это SKILL.md с инструкциями для кодового агента, обычно со скриптами и справочными файлами рядом. Люди — а всё чаще и сами агенты — ставят скиллы прямо с GitHub. Два открытых сканера предлагают вердикт до установки: SkillSpector (NVIDIA; статические паттерны, AST, YARA, OSV, необязательный LLM-проход) и skill-scanner (Cisco AI Defense; статические анализаторы, YARA, необязательный LLM-проход).
Мы задали узкий вопрос: как выглядят эти вердикты на обычных опубликованных скиллах — и меняется ли ответ в зависимости от языка, на котором скилл написан?
Корпус. 146 легитимных скиллов, найденных через поиск по коду GitHub по характерным для языка фразам, дедуплицированных (не больше трёх на репозиторий, авторы чередуются), закреплённых за SHA коммита, с указанной лицензией: 39 английских, 38 русских, 30 немецких, 39 китайских. Плюс 40 синтетических образцов атак: десять паттернов (подмена инструкций в тексте, скрытая инструкция в HTML-комментарии, эксфильтрация, curl | bash, сбор переменных окружения, поддельный установщик, base64 в shell, символы нулевой ширины, расползание полномочий, закрепление в системе), написанных одинаково на всех четырёх языках и обезвреженных. «Легитимный» здесь значит опубликован с лицензией и проверенным происхождением; аудит мы не проводили.
Движки. SkillSpector 2.12.0 с --no-llm; Cisco skill-scanner 2.3.2 с --policy balanced и --policy quiet, без LLM. Версии закреплены в engines.lock.yaml. Режимы с LLM не запускались — это следующий шаг, о нём будет отдельный отчёт. В качестве контроля мы добавили собственный чекер скрытых символов на 60 строк; он есть в таблицах, потому что тоже дал ложные срабатывания, и мы не видим причин это скрывать.
Всё это — манифест, скрипты, результаты — лежит в репозитории бенчмарка и воспроизводится тремя командами.
§2 Статическая оценка следует за размером пакета
SkillSpector сводит свои находки к оценке от 0 до 100 и рекомендации: SAFE до 20, CAUTION до 50, DO NOT INSTALL выше. Сильнейший предиктор этой оценки в нашем корпусе — не то, что скилл делает, а сколько файлов кода лежит рядом с SKILL.md.
Рис. 1 Статическая оценка SkillSpector в зависимости от объёма кода. Каждая точка — пакет; черта — медиана легитимных скиллов в этой полосе. Наведите на точку, чтобы увидеть её id. 178 пакетов; 8 крупных не завершились (§6).
файлов кода в пакете
n
медиана оценки
SAFE
DO NOT INSTALL
Markdown only (0 code files)
60
8
48
8
1-5 code files
35
41
6
15
6-30 code files
27
100
0
23
more than 30 code files
16
100
0
15
Ни один из 43 легитимных скиллов с шестью и более файлами кода не получил SAFE; 38 из них получили DO NOT INSTALL. 40 образцов атак — один SKILL.md и не больше одного скрипта каждый — получили медиану 29 и максимум 51. Только один из десяти паттернов дотянул до DO NOT INSTALL хоть на каком-то языке. Легитимный английский скилл с папкой scripts/ оценён хуже, чем образец из одного файла, который читает файлы с учётными данными и отправляет их на URL.
Вывод Cisco показывает то же, но с меньшей амплитудой. Его самые частые находки MEDIUM и выше на легитимных скиллах — DATA_EXFIL_NETWORK_REQUESTS, DATA_EXFIL_JS_NETWORK, UNANALYZABLE_BINARY, COMMAND_INJECTION_* — все вызваны приложенным кодом, а не инструкциями.
Это важно для всего дальнейшего: четыре языковых набора сильно различаются по количеству кода. Русские и немецкие скиллы «в дикой природе» — в основном чистый Markdown; английские и китайские несут скрипты, иногда целые приложения. Любую цифру по языкам нужно читать с этой поправкой — поэтому §4 смотрит только на находки, расположенные в Markdown.
§3 Вердикты по языкам
Пользователь видит вердикт, поэтому сначала считаем его: долю легитимных скиллов, которые сам движок не оценил как SAFE (SkillSpector: recommendation; Cisco: is_safe), и долю образцов атак, которые он оценил как SAFE.
Рис. 2 Доли на уровне вердикта. Слева: легитимные скиллы без SAFE, по языкам; оранжевая часть — DO NOT INSTALL (SkillSpector) или HIGH/CRITICAL (Cisco). Справа: образцы атак, которые движок оценил как SAFE.
движок
en
ru
de
zh
все
образцов атак с оценкой SAFE
SkillSpector 2.12 · static
94 % (33/35)
37 % (14/38)
28 % (8/29)
81 % (29/36)
61 %
40 %
Cisco skill-scanner 2.3 · balanced
46 % (18/39)
3 % (1/38)
27 % (8/30)
36 % (14/39)
28 %
85 %
Cisco skill-scanner 2.3 · quiet
44 % (17/39)
3 % (1/38)
20 % (6/30)
31 % (12/39)
25 %
85 %
Читать вместе с §2: 94 % SkillSpector на английском — это в основном эффект объёма кода; его 37 % на русском, где кода почти нет, — в основном одно правило (§4). 3 % Cisco на русском против 46 % на английском — тот же эффект объёма, увиденный через другую систему оценки. Статический режим ни одного из движков не отделяет образцы атак от легитимного набора: SkillSpector оценивает 40 % из них как SAFE, Cisco — 85 %.
§4 Правила, которые за этим стоят
Если считать только находки, расположенные в Markdown-файлах, эффект объёма кода почти исчезает и остаётся язык текста:
движок · находки MEDIUM+ в .md-файлах
en
ru
de
zh
SkillSpector 2.12 · static
100 %
76 %
41 %
89 %
Cisco skill-scanner 2.3 · balanced
46 %
11 %
13 %
44 %
Cisco skill-scanner 2.3 · quiet
44 %
11 %
7 %
44 %
hidden-char checker (ours, control)
5 %
0 %
0 %
0 %
Большую часть языкового поведения объясняют четыре правила:
SkillSpector AE4, «Suspicious Unicode normalization or mixed-script content».207 срабатываний на русском Markdown, 3 на английском, 2 на китайском, 0 на немецком. Любой русский SKILL.md, в котором есть блок кода, название продукта или команда, смешивает кириллицу с латиницей и запускает это правило. Уровень MEDIUM — само по себе оно переводит русский скилл из чистого Markdown из SAFE в CAUTION примерно в трети случаев. (Наш собственный скилл, написанный по-русски, собирает четыре таких.)
SkillSpector RP1, «npx commands without a version suffix». 346 срабатываний на английском Markdown — крупнейший источник находок MEDIUM на английском тексте. Документация со словами npx something считается риском для цепочки поставок, даже когда это пример, а не шаг установки.
Cisco YARA_prompt_injection_unicode_steganography. 112 срабатываний на китайских пакетах, 24 на немецких, 0 на русских — в основном в коде и файлах данных, а не в SKILL.md, и главная причина более высокой доли Cisco на китайском.
Cisco YARA_code_execution_generic. 31 срабатывание на английском Markdown, 0 на остальных трёх языках. Его паттерны сопоставляются с английскими словами; текст на других языках его не запускает — и атаки на этих языках тоже.
Правила, срабатывающие на легитимном Markdown, MEDIUM и выше
SkillSpector
правило
en
ru
de
zh
всего
RP1
346
12
14
40
412
AE4
3
207
0
2
212
AE1
23
4
25
118
170
PE3
39
2
24
24
89
E1
34
0
14
39
87
AS3
32
1
44
3
80
RA2
61
2
1
12
76
EA2
58
1
5
7
71
Cisco skill-scanner, balanced
правило
en
ru
de
zh
всего
TOOL_ABUSE_UNDECLARED_NETWORK
14
1
2
14
31
YARA_code_execution_generic
31
0
0
0
31
CORRELATED_SENSITIVE_NETWORK_FLOW
0
0
24
0
24
PIPELINE_TAINT_FLOW
1
0
0
8
9
COMPOUND_FETCH_EXECUTE
7
0
0
1
8
ALLOWED_TOOLS_WRITE_VIOLATION
0
3
0
1
4
SOCIAL_ENG_MISLEADING_DESC
2
0
0
1
3
COMPOUND_FIND_EXEC
2
0
0
0
2
§5 Что не поймал никто
Десять паттернов атак написаны так, чтобы быть узнаваемыми, а не скрытными: смысл был в том, чтобы проверить, переживает ли узнавание перевод.
Рис. 3 Максимальная заявленная серьёзность по паттерну и языку. Наш контрольный чекер скрытых символов не показан: он находит P-08 на всех четырёх языках и больше ничего — как и задумано.
P-01, подмена инструкций обычным текстом («игнорируй предыдущие инструкции и …»). Оба движка отмечают английский образец; ни один не отмечает русский, немецкий или китайский перевод той же фразы.
P-09, слишком широкий триггер и расползание полномочий («используй этот скилл для любого запроса»). Не отметил никто ни на одном языке. Это паттерн только в тексте — и, пожалуй, самая частая проблема в реальной жизни.
SkillSpector ловит структурные паттерны — инструкцию в HTML-комментарии, curl | bash, сбор переменных окружения, base64 в shell, символы нулевой ширины, закрепление — на всех четырёх языках. Статический режим Cisco ловит сбор переменных окружения и base64 на всех четырёх, и больше ничего за пределами английского.
Независимое от языка обнаружение есть ровно там, где паттерн лежит в коде. Где атака находится в инструкциях, обнаружение либо только английское, либо отсутствует — а это обратно тому, где сейчас риск: агент следует инструкциям и лишь иногда запускает код.
§6 Замечания по запуску
SkillSpector не завершился за 15 минут на 8 из 186 пакетов (16–73 МБ, целые репозитории с SKILL.md в корне, один — с 6 342 JavaScript-файлами). Cisco прошёл каждый из них меньше чем за минуту. Эти 8 исключены из всех долей выше и перечислены здесь: de-059, en-160, en-165, en-174, en-190, zh-112, zh-122, zh-142.
Наш собственный чекер скрытых символов, написанный для этого бенчмарка, отмечал легитимные скиллы, пока не узнал, что последовательности эмодзи используют U+200D, а мягкие переносы в немецком — норма. Он всё ещё отмечает 7 из 146 легитимных пакетов, 2 из них в Markdown. Мы показываем его по той же причине, по которой показываем остальные.
Cisco отвергает скилл, файл которого называется Skill.md или _template-skill.md; две такие записи исключены из корпуса, а не переименованы.
§7 Чего мы просили бы от сканера
Ничто из этого — не аргумент против сканирования. Это аргумент за калибровку вердикта, и исправления конкретны:
Отделить объём от риска. Ограничить вклад повторяющихся малоинформативных находок (одно правило про npx не должно набирать 100) и говорить «большой пакет, проанализирован частично» вместо DO NOT INSTALL, когда честный ответ — «мы не посмотрели».
Сделать Unicode-правила чувствительными к алфавиту. Кириллица плюс латиница внутри русского документа — норма, а не аномалия; аномалия — кириллическая буква внутри латинского слова. То же относится к CJK и к немецким мягким переносам.
Тестировать текстовые правила больше чем на одном языке. Правило, которое ловит «ignore previous instructions», должно поставляться с переводами или быть LLM-проверкой — и тестовый набор должен говорить, что именно.
Публиковать корпус ложных срабатываний. Каждый сканер поставляется с вредоносными тестовыми образцами; почти никто — с набором обычных скиллов, которые обязаны проходить. Наш корпус под CC BY 4.0 может быть таким набором.
§8 Оговорки
Только статические режимы. У обоих движков есть режимы с LLM, которые могут изменить картину, особенно для текстовых паттернов. Запустить их — следующий шаг.
Образцы атак короткие и одноцелевые. Они проверяют, узнаётся ли паттерн на данном языке, а не то, как реальный злоумышленник его упаковал бы.
«Легитимный» — суждение о происхождении, а не аудит. Некоторые находки на легитимном наборе могут быть верными.
Один корпус, одна дата. Scorecard будет перезапускаться на каждом выпуске движков; первая цифра, которая действительно важна, — следующая.
§9 Ответы разработчиков
Уведомление до открытия данных
Разработчики SkillSpector и skill-scanner получают файл с находками и полные таблицы 5 ноября 2026, за семь дней до того, как 12 ноября 2026 откроется репозиторий — манифест корпуса, образцы атак, скрипты, журналы запусков и агрегированные результаты. Сырой вывод движков по каждому скиллу не распространяется: он воспроизводится из манифеста. Их ответы и любые исправления, выпущенные за это время, будут воспроизведены здесь без редактирования.
Автор — Андрей Трухачев. Исправления и возражения: andrey@skillverdict.dev. Слова-вердикты на этой странице (SAFE, CAUTION, DO NOT INSTALL, HIGH, MEDIUM) цитируют собственный вывод движков и не являются нашим суждением о каком-либо скилле.
Фаза 2
Узнать, когда откроются страницы скиллов
Одно письмо, когда заработает фаза 2, и больше ничего. Выберите почтовый сервис — письмо уже написано, просто отправьте его.