
Уявіть такий сценарій: сканер Anthropic Skill перевіряє Skill, завантажений з ClawHub або skills.sh. Його інструкції у форматі Markdown чисті, жодного втручання в запит (prompt injection) не виявлено. У файлі SKILL.md не приховано жодних команд оболонки. Все гаразд.
Однак сканер ніколи не перевіряв файл .test.ts, розташований у сусідньому каталозі. Йому це не було потрібно. Тестові файли не є частиною поверхні виконання агента, тому жоден публічно документований сканер їх не перевіряє (станом на момент публікації цієї статті). Але файл все одно виконується. Не через агента, а через тестовий фреймворк, з повним доступом до файлової системи, змінних середовища та SSH-ключів.
Дослідник безпеки Gecko Security, Дживан Джутла, детально описав цей вектор атаки, продемонструвавши, що коли розробник запускає команду `npx Skills add`, інсталятор копіює весь каталог Skill до репозиторію. Якщо шкідливий Skill містить файл `*.test.ts`, фреймворки тестування Jest та Vitest виявляють його за допомогою рекурсивних шаблонів (glob patterns) і розглядають як повноцінний тест, виконуючи його під час команди `npm test` або коли IDE автоматично запускає тести при збереженні. Конфігурація за замовчуванням у фреймворку тестування JavaScript Mocha також використовує подібний шаблон рекурсивного виявлення. Шкідливий код спрацьовує у блоці `beforeAll`, ще до виконання будь-яких перевірок (assertions). Жоден вивід тесту не сигналізує про щось незвичайне. У середовищі безперервної інтеграції (CI) `process.env` містить токени розгортання, хмарні облікові дані та будь-які секрети, до яких має доступ конвеєр CI/CD.
Цей клас атак не новий; шкідливі скрипти `postinstall` в npm та плагіни pytest роками використовували модель “довіряй під час встановлення” (trust-on-install). Те, що робить вектор атаки через Skills ще гіршим, це те, що встановлені Skills потрапляють до каталогу, який призначений для комітування та спільного використання командою, поширюється на кожного члена команди, хто клонує репозиторій, і перебуває поза межами перевірки будь-якого сканера.
Агент при цьому не викликається, а сканер Anthropic Skill перевіряє правильні файли, але для неправильної моделі загроз.
Три аудити, одна сліпа зона
Публікація від Gecko не була ізольованою. Вона доповнила два масштабні безпекові аудити, які вже задокументували обсяг проблеми з іншого боку, ілюструючи, що виявляють сканери, а що вони пропускають. Обидва аудити зробили саме те, для чого призначалися: вони виміряли загрозу на поверхні виконання, яку сканери вже перевіряють. Gecko виміряв те, що знаходиться поза нею.
Академічне дослідження SkillScan, опубліковане 15 січня, проаналізувало 31 132 унікальних Anthropic Skills, зібраних з двох основних маркетплейсів. Їхні результати: 26,1% Skills містили принаймні одну уразливість, що охоплює 14 різних патернів у чотирьох категоріях. Витік даних був виявлений у 13,3% Skills. Ескалація привілеїв з’явилася в 11,8%. Skills, що містили виконувані скрипти, були в 2,12 рази більш схильні до уразливостей, ніж Skills, що містили лише інструкції.
Через три тижні Snyk опублікував ToxicSkills – перший комплексний аудит безпеки маркетплейсів ClawHub та skills.sh. Команда Snyk просканувала 3 984 Skills (станом на 5 лютого). Результати: 13,4% усіх Skills містили принаймні одну критичну проблему безпеки. 76 підтверджених шкідливих навантажень (payloads) було ідентифіковано за допомогою комбінації автоматичного сканування та ручного перегляду. Вісім з цих шкідливих Skills все ще були публічно доступні на ClawHub на момент публікації дослідження.
Потім Cisco випустила свій AI Agent Security Scanner для IDE 21 квітня, інтегрувавши свій відкритий сканер Skills безпосередньо у VS Code, Cursor та Windsurf. Сканер забезпечує реальні можливості для робочих процесів розробників. Однак він не перевіряє упаковані тестові файли, оскільки категорії виявлення, розроблені Cisco, націлені на шар взаємодії агента, а не на шар інструментів розробника.
Три основні сканери Anthropic Skill мають спільну структурну сліпу зону: жоден з них не перевіряє упаковані тестові файли як поверхню виконання, хоча Gecko Security довела, що ці файли виконуються з повними локальними дозволами через стандартні тестові фреймворки.
Snyk Agent Scan, Cisco AI Agent Security Scanner та VirusTotal Code Insight працюють. Вони виявляють prompt injection, команди оболонки та витік даних у визначеннях Skills та скриптах, на які посилається агент. Але вони не заглядають за межі поверхні виконання агента до поверхні виконання розробника, яка знаходиться в тому самому каталозі.
Як працює ланцюг атаки
Механіка ланцюга атаки має значення, оскільки виправлення має бути точним. Коли розробник запускає `npx skills add
Jest і Vitest передають параметр `dot: true` своїм механізмам glob. Це означає, що вони виявляють тестові файли всередині каталогів, що починаються з крапки, таких як `.agents/.`. Поведінка Mocha залежить від конфігурації, але за замовчуванням дотримується подібних рекурсивних шаблонів. Жоден з них не виключає `.agents/`, `.claude/` або `.cursor/` зі своїх шляхів виявлення за замовчуванням.
Зловмисник публікує Skill з чистим `SKILL.md` та файлом `tests/reviewer.test.ts`, що містить блок `beforeAll`. Цей блок читає `process.env`, файли `.env`, приватні ключі з `~/.ssh/` та облікові дані з `~/.aws/credentials`. Він надсилає все на зовнішній сервер. Тестові випадки виглядають правдоподібно. Витік даних відбувається під час налаштування, тихо, незалежно від того, успішні тести чи ні.
Цей вектор не обмежується TypeScript. Python-репозиторії стикаються з такою ж вразливістю через `conftest.py`, який pytest автоматично виконує під час збору тестів. Щоб запобігти цьому, додайте `.agents` до виключень `testpaths` у `pyproject.toml`.
Каталог `.agents/skills/` призначений для комітування до репозиторію, щоб члени команди могли спільно використовувати Skills. Шаблони `.gitignore` за замовчуванням у GitHub не включають `.agents/`. Як тільки шкідливий тестовий файл потрапляє до репозиторію, кожен розробник, який клонує його та запускає тести, виконує шкідливе навантаження. Те ж саме відбувається з кожним конвеєром CI/CD для кожної гілки та кожного форку, що успадковує тестовий набір.
Сканери перевіряють не ту поверхню загроз
Технічний директор CrowdStrike, Еліа Зайцев, операційно сформулював цю структурну проблему під час ексклюзивного інтерв’ю VentureBeat на RSAC 2026: “Спостереження за фактичними кінетичними діями є структурованою, розв’язуваною проблемою,” – сказав Зайцев. “Намір – ні.”
Ця відмінність безпосередньо стосується прогалини сканерів Anthropic Skill. Жоден публічно документований сканер не працює поза припущенням, що загроза полягає у `SKILL.md` та скриптах, які агент отримує інструкцію запустити. Ці інструменти аналізують намір: що Skill наказує робити агенту? Висновок Gecko знаходиться на кінетичному боці. Тестовий файл виконується через власний інструментарій розробника. Агент не задіяний. Запит не інтерпретується. Шкідливе навантаження – це TypeScript, який виконується з повними локальними дозволами через легітимний тестовий фреймворк. Сканер вирішував не ту проблему.
Зайцев з CrowdStrike окреслив аспект ідентичності: “AI-агенти та нелюдські ідентичності вибухнуть в корпоративному середовищі, експоненційно зростаючи і затьмарюючи людські ідентичності,” – сказав він VentureBeat. “Кожен агент діятиме як привілейована надлюдина з OAuth-токенами, API-ключами та постійним доступом до раніше ізольованих наборів даних.”
Charlotte AI від CrowdStrike та подібні корпоративні агенти діють саме з такими привілеями. Коли ці облікові дані перебувають у змінних середовища, доступних будь-якому процесу в репозиторії, файлу-навантаженню в тестовому файлі не потрібні привілеї агента. Він вже має привілеї розробника, що в більшості конфігурацій CI означає токени розгортання та доступ до хмари.
Майк Рімер, старший віце-президент групи мережевої безпеки та головний інформаційний директор (CISO) в Ivanti, кількісно оцінив вікно експлуатації в інтерв’ю VentureBeat: “Зловмисники реверс-інжинірять патчі протягом 72 годин,” – сказав Рімер. “Якщо клієнт не застосовує патч протягом 72 годин після випуску, він відкритий для експлуатації.”
Більшість підприємств роблять це тижнями. Сліпа зона сканера Anthropic Skill посилює це вікно. Розробник встановлює шкідливий Skill сьогодні. Тестовий файл виконується негайно. Патча не існує, оскільки жоден сканер його не виявив.
Сітка аудиту Anthropic Skill
VentureBeat висвітлює ланцюг постачання Anthropic Skill з моменту атаки ClawHavoc на ClawHub у січні. Кожна розмова з лідерами безпеки зводиться до однієї і тієї ж фрустрації. Їхні команди купили сканер, він повідомляє про відсутність загроз, але у них немає чіткого розуміння, що саме він не перевіряє.
VentureBeat опитувало команди розробників, які встановлюють Anthropic Skills з ClawHub та `skills.sh`. Сітка нижче поєднує опубліковану сторону аудиту (Snyk, SkillScan) зі стороною обходу сканерів (Gecko). Кожен рядок представляє поверхню виявлення, яку команда безпеки повинна перевірити перед схваленням будь-якого інструменту сканування Skills для закупівель у другому кварталі.
|
Питання аудиту |
Що роблять сканери сьогодні |
Прогалина |
Рекомендована дія |
|
Перевірка `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) або виключити (Vitest). Один рядок конфігурації. |
|
Позначка Skills, які містять тестові файли або конфігурації збірки |
Не позначаються як метадані з вищим ризиком жодним сканером |
Тривіальна статична перевірка. Skills з додатковими виконуваними файлами в 2,12 рази частіше містять уразливості (SkillScan). |
Додати перевірку CI: `find .agents/ -name “*.test.*” | grep -q . && exit 1`. Блокувати злиття (merge) при збігу. |
|
Обмеження glob-шаблонів тестових фреймворків до шляхів, що належать проекту |
Рідко. Більшість конфігурацій CI використовують рекурсивні glob. Jest/Vitest за замовчуванням передають `dot: true`. |
Стандартні glob-шаблони сканують каталоги `.agents/`, `.claude/`, `.cursor/`. Шкідливі тестові файли виявляються автоматично. |
Обмежити корені тестів первинними каталогами (src/, app/). Заборонити `.agents/`, `.claude/`, `.cursor/`. |
|
Розрізнення Skills, що містять скрипти, від Skills, що містять лише інструкції |
Часткове покриття через статичний та семантичний аналіз |
SkillScan: Skills, що містять скрипти, в 2,12 рази частіше містять уразливості, ніж Skills, що містять лише інструкції. |
Вимагати структурований запис аудиту: тип Skill, поверхні виконання, покриття сканером, залишковий ризик. |
|
Публікація методології аудиту з розміром вибірки |
Snyk так (3 984 Skills). SkillScan так (31 132 Skills). |
Cisco та інші сканери, що з’являються, не публікували еквівалентних аудитів масштабу екосистеми. |
Запитуйте у постачальників: методологія, розмір вибірки, рівень виявлення. Відсутність опублікованого аудиту = відсутність незалежної базової лінії. |
|
Прив’язка джерел Skills до незмінних комітів |
Не примусово жодним сканером чи маркетплейсом |
Автори Skills можуть опублікувати чисту версію для перевірки, а потім додати шкідливий тестовий файл після схвалення. |
Прив’язувати до конкретного хешу коміту. Переглядати зміни при кожному оновленні. OWASP Agentic Skills Top 10 рекомендує це. |
Три кроки з посилення безпеки CI, які слід виконати зараз
Рімер у інтерв’ю VentureBeat зазначив, що розміщення елементів контролю безпеки на периферії призводить до того, що кожна загроза націлюється саме на цю межу. Сканери Anthropic Skill розмістили цю межу у `SKILL.md`. Зловмисники розмістили шкідливе навантаження на один каталог далі. Три зміни нижче переміщують межу туди, де код фактично виконується.
Ці зміни займають хвилини. Жодна з них не вимагає заміни поточних інструментів або очікування, поки постачальники сканерів закриють прогалину.
Додайте `.agents/` до списку виключень тестового фреймворку. У Jest додайте `/.agents/` до `testPathIgnorePatterns` у `jest.config.js`. У Vitest додайте `**/.agents/**` до масиву `exclude` у `vitest.config.ts`. Один рядок в одному конфігураційному файлі запобігає виявленню тестовим фреймворком файлів у каталогах встановлених Skills. Зробіть це, незалежно від того, чи використовує команда Anthropic Skills. Каталог може з’явитися у клонованому репозиторії, навіть якщо ніхто не встановлював Skill безпосередньо.
Аудитуйте кожне встановлення Skill на наявність неінструктивних файлів перед злиттям. Додайте перевірку CI, яка позначає будь-який файл у `.agents/skills/`, що відповідає шаблонам `*.test.*`, `*.spec.*`, `__tests__/`, `*.config.*` або `conftest.py`. Ці файли не мають законних підстав існувати всередині каталогу Skill. Перевірка – це однорядковий скрипт оболонки: `[ -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-ключів.
Прив’язуйте джерела Skills до конкретних комітів, а не до останньої версії. Команда `npx skills add` копіює все, що містить репозиторій на момент встановлення. Автор Skill може опублікувати чисту версію для перевірки сканером, а потім додати шкідливий тестовий файл після схвалення. Прив’язка до конкретного хешу коміту перетворює модель “довіряй при першому використанні” на модель “перевіряй при кожній зміні”. OWASP Agentic Skills Top 10 рекомендує саме це.
Якщо Skills вже є у вашому репозиторії: Запустіть команду `find` вище проти вашого існуючого каталогу `.agents/` негайно. Якщо тестові файли присутні, розглядайте їх як потенційне компрометування: ротація будь-яких облікових даних, доступних для CI (токени розгортання, ключі хмари, SSH-ключі), аудит логів CI на наявність несподіваних вихідних мережевих викликів під час виконання тестів та перегляд історії git, щоб визначити, коли тестові файли потрапили до репозиторію та які конвеєри CI/CD їх виконували.
П’ять запитань до вашого постачальника сканера Anthropic Skill
Команди безпеки укладають контракти на свої перші спеціалізовані інструменти сканування Skills. Обхідний шлях Gecko означає, що запитання під час переговорів про продажі мають змінитися. Не зупиняйтеся на “Чи виявляєте ви prompt injection?”. Запитуйте:
-
Які саме файли та каталоги ви аналізуєте в репозиторії Skill?
-
Чи розглядаєте ви тестові файли як потенційні поверхні виконання?
-
Чи можете ви позначати Skills, які містять тести, конфігурації CI або скрипти збірки, як такі, що становлять вищий ризик? Дослідження SkillScan показало, що Skills, які містять скрипти, у 2,12 рази частіше містять уразливості.
-
Чи надаєте ви інтеграцію або рекомендації щодо обмеження glob-шаблонів тестових фреймворків у CI? Cisco заслуговує на похвалу за відкриття свого сканера Skills на GitHub, що дозволяє командам безпеки точно перевіряти, які категорії виявлення реалізує інструмент. Така прозорість є базовим стандартом, якого повинні дотримуватися всі постачальники. Якщо ваш постачальник не бажає публікувати категорії виявлення або відкривати своє скануюче логічне забезпечення, ви не зможете перевірити, що саме він перевіряє, а що пропускає.
-
Чи публікували ви аудит масштабу екосистеми з методологією та розміром вибірки? Snyk опублікував дані для 3 984 Skills. SkillScan – для 31 132. Рімер описав модель розкриття інформації: “Вони вирішили не публікувати CVE. Вони просто тихо виправили проблему і жили далі,” – сказав він. Екосистема Anthropic Skills демонструє ранні ознаки тієї ж моделі: сканери документують те, що вони виявляють, не окреслюючи поверхні, які вони не охоплюють. Прогалина між документованим покриттям та реальною поверхнею виконання – це місце, де живе вектор з тестовими файлами.
Сітка аудиту має значення, тому що модель сканування неповна
Екосистема Anthropic Skill повторює ранню історію ланцюга постачання npm, але без десятиліття накопичених інцидентів, які змусили реєстри пакетів будувати інфраструктуру безпеки. Набір даних SkillScan з 31 132 Skills показав, що чверть екосистеми містить уразливості. Snyk виявив 76 підтверджених шкідливих навантажень у менш ніж 4 000 Skills. Gecko довів, що сама модель сканування має структурну прогалину, яку жоден постачальник публічно не задокументував як усунену.
Оцінки сканерів послідовно тестують покриту поверхню. Сітка аудиту Anthropic Skill надає командам безпеки сім поверхонь для аудиту, які необхідно перевірити перед підписанням контрактів. Три кроки CI – це виправлення, які слід впровадити до наступного встановлення Skill. Команда Рімера з Ivanti спостерігає, як цикл “патч-до-експлуатації” стискається в реальному часі в корпоративних середовищах. Вектор з тестовими файлами стискає його ще більше: жоден сканер не позначив цю загрозу, тому вікно для патча не існує.
Сканер не зламаний. Він неповний. Модель загроз зупинилася на агентові. Тестовий фреймворк – ні.
Як захиститися (Порада ІТ-Блогу): Уникайте встановлення Skills з неперевірених джерел. Перед додаванням будь-якого Skill до свого проекту, ретельно перевіряйте його конфігурацію та залежності, особливо на наявність файлів з розширеннями `.test.ts` або `.spec.js` у каталогах, не пов’язаних безпосередньо з логікою агента.
Оригінал статті: venturebeat.com
