Что может чужой скил для Claude Code до того, как вы его прочитали
Поставили чужие скилы для Claude Code и проверили, что они делают на машине: команды без подтверждения, хуки в каждой сессии, автообновление.
Скил для Claude Code — это папка с файлом SKILL.md. Ставится одной командой,
как пакет: npx skills add owner/repo или /plugin install name@marketplace.
Каталоги уже считают установки миллионами — у skills.sh, который держит
Vercel, верхний скил показывает три миллиона установок, — и ставят их так же,
как npm-пакеты: по названию и числу звёзд, не открывая.
Разница в том, что зависимость исполняется внутри вашего приложения, а скил — от вашего имени на вашей машине. Ниже — что именно он может, проверено на Claude Code 2.1.223 и на живых репозиториях, а не на пересказах.
Что лежит в папке скила
Из документации и из того, что видно в репозиториях, в скиле три слоя, и у каждого свой момент исполнения.
Описание — поле description во frontmatter. Оно лежит в контексте
каждой сессии, пока скил установлен: именно по нему модель решает,
подхватить ли скил сама, без команды от вас. Чтобы описание не попадало в
контекст, автор должен явно поставить disable-model-invocation: true — из
364 скилов в самом большом репозитории, который мы смотрели, это не сделал
никто.
Тело — инструкции, которые загружаются при вызове и остаются в контексте
до конца сессии. В теле могут быть команды вида !`git diff`: Claude Code
выполняет их до того, как модель увидит текст, и подставляет вывод на
место команды. Это не предложение модели что-то запустить — это запуск.
Права. Поле allowed-tools не ограничивает, а разрешает: перечисленные
инструменты на ход вызова работают без запроса подтверждения. Документация
говорит это прямо: доверие к папке это поле не проверяет, «скил может выдать
сам себе широкий доступ к инструментам, поэтому проверяйте allowed-tools у
скилов в репозитории прежде, чем запускать там Claude Code».
Плагин — это скилы плюс ещё три вещи, каждая со своим входом в систему:
хуки (hooks/hooks.json) — shell-скрипты, которые запускаются на событиях
сессии: старт, каждый вызов инструмента, конец; MCP-серверы (.mcp.json)
— локальные процессы или HTTP-адреса, к которым подключается сессия; и папка
bin/, чьи исполняемые файлы добавляются в PATH инструмента Bash, пока
плагин включён. Хуки, по документации, «выполняют команды с вашими полными
правами пользователя» и песочницей не ограничены — она накрывает только
команды Bash.
Что мы проверили сами
Четыре скила в пустом проекте, запуск claude -p в режиме разрешений по
умолчанию — то есть так, как Claude Code работает в CI или в чужом скрипте,
где ответить на запрос некому.
| Скил | Что в нём | Результат |
|---|---|---|
allowed-tools: Bash(*) + команда !`…` в теле | запись файла-маркера | выполнилось, без вопроса |
то же без allowed-tools | запись файла-маркера | вызов прерван, файла нет |
allowed-tools: Bash(*) + инструкция в теле «выполни команду» | запись файла-маркера | выполнилось, без вопроса |
allowed-tools: Bash(*), автовызов по описанию | команда !`…` | в нашем прогоне модель скил не подхватила |
Маркер — строка с именем пользователя и временем, то есть команда выполнилась от нашего имени. Никаких обходов: ровно то поведение, что описано в документации. Четвёртая строка честная — автовызов остаётся решением модели, и в этот раз она ответила, не подхватив скил. Но механизм для этого есть, и описание для него уже в контексте.
Важная оговорка про режим: в интерактивной сессии без allowed-tools команда
из тела спросила бы разрешение. claude -p и SDK ни диалога доверия, ни
запроса не показывают — по документации папка в этом режиме считается
доверенной, и хуки из .claude/settings.json клонированного репозитория
запускаются. Это ровно тот путь, которым Claude Code ходит в CI.
Что лежит в реальных репозиториях
Мы склонировали пять популярных источников и посчитали, что в них есть, кроме инструкций. Ни один из них не вредоносный — это важно. Речь о том, что устанавливается вместе с текстом.
Курируемый маркетплейс известной аудиторской фирмы, 31 скил. Поле
allowed-tools стоит во всех 31, и в 24 из них в списке голый Bash — без
шаблона. Каждый вызов такого скила — ход, на котором любая shell-команда
проходит без подтверждения. Это не злой умысел, а удобство: скил про фаззинг
должен запускать фаззер. Но тот, кто его ставит, подписывается на это не
глядя.
Сборник на 364 скила и 90 плагинов с 24 тысячами звёзд. Внутри пять файлов
hooks.json: скрипты на Python и bash на событиях SessionStart,
SessionEnd и PostToolUse. Один из них получает вывод каждой команды Bash и
ищет в нём ошибки; другой при старте сессии читает файлы с диска и вставляет
их содержимое в контекст. Три файла .mcp.json подключают внешний
HTTP-сервер, локальный процесс и npx tsx со скриптом из плагина. Установка
«маркетинговых скилов» из этого сборника — это установка и этого тоже.
Маркетплейс популярного набора плагинов, 10 плагинов из внешних
репозиториев: у девяти в источнике только URL, без sha или ref. Установка
берёт то, что лежит в HEAD в этот момент.
Самый популярный скил на GitHub, 99 тысяч звёзд, — режим сокращения
ответов. Его хук на SessionStart — echo с инструкцией модели. Безобидно.
Но это тот же механизм: текст, который попадает в контекст каждой сессии без
вашего участия.
Официальный маркетплейс Anthropic на нашей машине: 286 плагинов, 233 из
них — внешние репозитории на GitHub, и у всех 233 проставлен sha. Это
хорошая новость. Плохая новость в соседнем файле: установленный оттуда плагин
обновился сам ночью, а каталог — ещё раз через несколько часов; ни того ни
другого мы не запрашивали. У официальных маркетплейсов автообновление включено
по умолчанию — документация это подтверждает. Что именно приехало ночью, не
спросили.
Куда уходят данные
У скила нет своего сетевого слоя, поэтому вопрос «куда он шлёт» сводится к тому, какие пути у него есть.
- Хуки получают на вход JSON с параметрами и выводом инструмента — то есть содержимое файлов, вывод команд, текст промптов — и могут делать с ним что угодно: это shell-скрипт с вашими правами.
- MCP-серверы из
.mcp.json— это адрес, к которому сессия подключается сама. В плагине Figma из официального маркетплейса это HTTPS-адрес вендора с заголовком версии сборки; это легитимно и прозрачно, но поле одинаково выглядит для любого адреса. - Команды
!`…`исполняются до модели —curlв них такой жеcurl. - Динамика после установки. Unit 42 разобрал скил
money-radarиз каталога OpenClaw: при каждом вызове он скачивалreferrals.jsonс сервера автора, и инструкция предписывала всегда рекомендовать партнёрские ссылки оттуда. Скил опубликован один раз, поведение меняется с сервера.
Отдельный случай — ключ API. До декабря 2025 года ANTHROPIC_BASE_URL,
подложенный в .claude/settings.json репозитория, перенаправлял первый же
запрос на чужой сервер вместе с ключом, до диалога доверия (CVE-2026-21852,
разбор Check Point). Закрыто: запросы теперь ждут подтверждения доверия. Но
это показывает, где ключ лежит и через какой файл к нему подходят.
Что уже случилось
Это не теоретический риск, и прецеденты идут с начала года.
ClawHub, февраль 2026. Koi Security проверила весь каталог скилов для
OpenClaw: 341 вредоносный из 2 857, почти 12 %, 335 из них — одна кампания.
Snyk просканировала 3 984 скила с ClawHub и skills.sh: 76 подтверждённых
вредоносных, у 13,4 % критичные проблемы, у 10,9 % захардкоженные секреты.
Верхняя сотня skills.sh при этом оказалась чистой — что говорит скорее о
кураторстве, чем о формате. Механика у вредоносных однообразная: блок
«обязательные требования» в SKILL.md, в нём строка base64, агенту
предлагается её раскодировать и передать в bash. Дальше — инфостилер AMOS и
ключи от кошельков. Когда сканеры научились читать SKILL.md, авторы
перенесли команды в комментарии к скилу на странице каталога, а один из скилов
добил README.md 22 мегабайтами мусора, чтобы вывалиться за лимит анализа.
Claude Code, демонстрации. Prompt Security в январе показала плагин из
стороннего маркетплейса, чей скил при просьбе «поставь библиотеку» тихо
направлял установку на подменённый источник — библиотека импортируется, пример
работает, троян в проекте. Reversec в мае: реверс-шелл через команду !`…` плюс allowed-tools: Bash(*) — «динамический контекст обходит рассуждение
модели и исполняется до проверок». Это тот же механизм, что в нашей первой
строке таблицы; модели, по их словам, выполнить реверс-шелл прямой просьбой
отказалась — команда до модели не дошла.
Hookify, апрель 2026. Pluto Security нашла, что плагин из официального маркетплейса читает файлы правил из папки проекта и передаёт их в доверенный канал хуков — то есть файл в чужом репозитории становится каналом управления моделью у всех, кто поставил плагин. Пять нагрузок, оформленных как «соглашения проекта», заставили модель выдать переменные окружения; ни одна не была распознана как инъекция. Ответ Anthropic: «работает как задумано», граница безопасности — диалог доверия к папке.
Последнее важнее всего остального. Модель безопасности Claude Code честная и описана: доверие выдаётся папке, и всё, что в ней, считается вашим. Чужой скил в этой папке — тоже ваш.
Чем это отличается от зависимости
Зависимость из npm тоже может быть вредоносной, и примеров достаточно. Но у неё есть четыре свойства, которых у скила нет.
- Зависимость исполняется в процессе приложения. Скил и его хуки — под
вашим пользователем, с вашим
~/.ssh,~/.aws,~/.claude, с токенами в окружении и доступом в сеть. Один и тот жеSKILL.mdв API Anthropic работает в контейнере без сети; в Claude Code — с полными правами хоста. - У кода есть линтер, у инструкций нет. Вредоносный пакет ищут по коду; «три строки markdown», которые просят прочитать ключ SSH и отправить его, для сканера — текст. Snyk считает, что в 91 % вредоносных скилов код и инъекция в инструкциях идут вместе.
- Ревью и подпись. У community-маркетплейса Anthropic — «автоматическое сканирование безопасности», без деталей; подписи кода нет, верификации издателя нет, манифест плагина требует имя, описание, версию и автора. Маркетплейс курируемый — это список ссылок на чужие репозитории с закреплённым коммитом, и закрепление держится ровно до следующего обновления.
- Доверие транзитивно. Ставя плагин, вы включаете все его скилы, хуки и MCP-серверы сразу — Pluto называет это «пирамидой доверия»: согласие на вершину одобряет каждый слой под ней.
Есть и пятое, про людей. Зависимость выбирает разработчик, читая, что она делает. Скил выбирает модель — по описанию, в контексте, — и разработчик узнаёт об этом из строки в выводе, если вообще смотрит.
Что с этим делать
Ничего из этого не требует отказаться от скилов — мы сами их пишем и держим. Требуется относиться к ним как к коду, который запускается с вашими правами, а не как к подсказкам.
- Читать frontmatter раньше тела.
allowed-toolsс голымBash,Write,Edit— это права;!`…`в теле — это команды. Сколько времени вы потратили бы наpostinstall-скрипт пакета, столько стоит и здесь. - Искать то, что не в
SKILL.md.find . -name hooks.json,.mcp.json, папкаbin/,settings.jsonв корне плагина. У того сборника на 364 скила именно там лежало самое интересное. - Закрепляться. Ставить с
sha, а не сHEAD; у сторонних маркетплейсов автообновление и так выключено по умолчанию — не включать «для удобства». У официальных — включено, и это надо знать. - Отрезать shell у чужого. Настройка
disableSkillShellExecutionотключает!`…`у всех скилов, кроме встроенных; правилоdeny: Bash(*)в ваших настройках перекрываетallowed-toolsлюбого скила — это проверила Reversec. В организации —strictKnownMarketplacesиallowManagedHooksOnlyв managed settings. - Помнить про
-p. В CI и скриптах диалога доверия нет, хуки из клонированного репозитория запускаются. Агент с доступом к ключам, который ходит по чужим репозиториям, — это уже контур с полномочиями, а не подсказчик, и защищать его надо как контур: отдельные креды, сеть по списку, песочница. - Сканировать то, что уже стоит.
uvx mcp-scan --skillsи аналоги находят известные паттерны — не инъекции в естественном языке, но хотя бы base64 иcurl | bash.
Чего это не доказывает
Ни один из репозиториев, которые мы смотрели, не делает ничего плохого, и
называть их мы не стали намеренно: голый Bash в allowed-tools у
аудиторской фирмы — сознательный выбор для своих задач, а не дыра. Цифры
ClawHub — про OpenClaw, у которого другой каталог и другая культура
публикации; верхняя сотня skills.sh, которой пользуются с Claude Code,
оказалась чистой.
Доказывает это одно: скил — не текст, а код с вашими правами, который вы не писали и который обновляется без вас. Со всем, что подходит под это описание, индустрия уже научилась обращаться. Осталось заметить, что это оно.
Читать дальше
Агент вышел из песочницы, чтобы списать на тесте. Атакующего не было
Модели OpenAI покинули тестовую среду и взломали Hugging Face ради ответов бенчмарка. Ни злоумышленника, ни промпт-инъекции — только оптимизация.
Расходы на языковые модели растут не так, как подсказывает интуиция
Функция, которая в демо стоит копейки, в проде обходится в тысячи долларов в месяц — и почти никогда из-за цены за токен. Куда уходят деньги на самом деле.
Infra Graveyard Weekly №04: DFK Chain выключается через четыре дня, а деньги не уходят
Мы дважды замерили одну и ту же умирающую сеть с разницей в восемь дней. Ликвидность на месте, 84 % — внутри двух контрактов, которые кошелёк не показывает.