次のような状況を想像してください。Anthropic Skillスキャナが、ClawHub または skills.sh から取得した Skill を対象に、完全な解析を実行します。Markdown の指示はきれいで、プロンプトインジェクションは検出されません。SKILL.md の中にシェルコマンドを隠しているようなものもありません。盤面はすべてグリーンです。
しかし、そのスキャナは一つディレクトリ上に置かれている .test.ts ファイルを見ていませんでした。必要がなかったのです。テストファイルはエージェントの実行対象(エクゼキューション・サーフェス)の一部ではないため、公開されている文書ベースのスキャナはそれを検査しません(本投稿の公開時点において)。ファイルはそれでも実行されます。エージェント経由ではなく、テストランナー経由で、ファイルシステム、環境変数、SSH キーに対してフルアクセスが与えられた状態で動きます。
Gecko Security の研究者 Jeevan Jutla は、この攻撃フローを詳細に説明し、開発者が npx Skills add を実行すると、インストーラが Skill ディレクトリ全体をリポジトリへコピーすることを示しました。悪意のある Skill が *.test.ts ファイルを同梱している場合、Jest や Vitest のテスティングフレームワークは再帰的な glob パターンを通じてそれを発見し、第一級のテストとして扱い、npm test 中、または IDE がセーブ時に自動でテストを実行する際にそれを実行します。オープンソースの JavaScript テストフレームワーク Mocha のデフォルト設定も、同様の再帰的な検出パターンに従います。ペイロードは beforeAll で発火し、アサーションが実行される前に動きます。テスト出力のどこにも、何か不審な点が示されません。CI 環境では、process.env に、デプロイトークン、クラウド認証情報、そしてパイプラインが到達できるあらゆる秘密情報が格納されています。
攻撃クラス自体は新しいものではありません。悪意のある npm の postinstall スクリプトや pytest プラグインは、何年も前から trust-on-install(インストール時の信頼)を悪用してきました。Skill ベクタがより危険なのは、インストールされた Skills が、チームでコミット共有されることを想定したディレクトリに配置され、クローンするすべての同僚へと伝播し、さらにあらゆるスキャナの検出対象外に置かれるからです。
そして、エージェントは呼び出されません。Anthropic Skill スキャナは、誤った脅威モデルに対して「正しいファイル」を読み取ってしまいます。
3つの監査、1つの盲点
Gecko の開示は単独で届いたわけではありません。ほかの方向から、すでに 2 つの大規模なセキュリティ監査が問題の範囲を文書化していました。Gecko の情報はそれらの上に重なり、「スキャナが何を検出するのか」ではなく「何を見逃すのか」を示すのではなく、検出する対象を明確にすると同時に、見逃される領域を浮き彫りにしました。両方の監査は、意図されたとおりに実行されました。すなわち、スキャナがすでに検査している実行対象の脅威を測定したのです。Gecko は、それらの外側にあるものを測定しました。
SkillScan の学術研究は、1 月 15 日に公開され、2 つの主要マーケットプレイスから収集された 31,132 個の一意な Anthropic Skills を分析しました。その結果は次のとおりです。26.1% の Skills に、4 つのカテゴリにまたがる 14 個の異なるパターンにわたる少なくとも 1 つの脆弱性が含まれていました。データの持ち出し(データエクフィルレーション)は 13.3% の Skills で見つかりました。権限昇格は 11.8% でした。実行可能スクリプトを同梱する Skills は、指示のみの Skills よりも脆弱性を含む可能性が 2.12 倍でした。
それから 3 週間後、Snyk が ToxicSkills を公開しました。これは ClawHub と skills.sh のマーケットプレイスに対する、初の包括的なセキュリティ監査です。Snyk のチームは 3,984 個の Skills(2 月 5 日時点)をスキャンしました。結果は、すべての Skills のうち 13.4% に、少なくとも 1 つのクリティカルレベルのセキュリティ問題が含まれていました。76 件の確認された悪意のあるペイロードが、自動スキャンと human-in-the-loop(人が関与する)レビューの組み合わせにより特定されました。そのうち 8 件の悪意のある Skills は、研究が公開された時点でも ClawHub 上で一般公開されていました。
さらに Cisco は 4 月 21 日に IDE 向けの AI Agent Security Scanner を出荷し、自社のオープンソース Skill Scanner を VS Code、Cursor、Windsurf に直接統合しました。このスキャナは、開発者のワークフローに対して本物の能力を提供します。ただし、同梱されたテストファイルは検査しません。Cisco が構築した検出カテゴリは、エージェントの相互作用層を対象としており、開発者のツールチェーン層ではないからです。
The 3 つの主要な Anthropic Skill スキャナには構造的な盲点があります。Gecko Security が、これらのファイルが標準的なテストランナーを通じてフルのローカル権限で実行されることを証明したにもかかわらず、同梱されたテストファイルを「実行対象のサーフェス」として検査するものはありません。
Snyk Agent Scan、Cisco の AI Agent Security Scanner、VirusTotal Code Insight はすべて機能します。Skills 定義や、エージェントが参照するスクリプトにおけるプロンプトインジェクション、シェルコマンド、データエクフィルレーションを検知します。しかし、それらが行わないのは、同じディレクトリに存在する「開発者の実行対象サーフェス」まで、エージェントの実行対象サーフェスの外側を確認することです。
攻撃チェーンがどのように機能するか
攻撃チェーンの仕組みは重要です。なぜなら、修正は正確だからです。開発者が npx skills add owner/repo-name を実行すると、インストーラは Skill リポジトリをクローンし、その内容をプロジェクト内の .agents/skills/<skill-name>/ にコピーします。Claude Code、Cursor、その他のエージェント系 IDE は、それぞれの Skill ディレクトリへシンボリックリンクを張ります。除外されるのは .git, metadata.json と、接頭辞が _ の付いたファイルだけです。それ以外はすべてディスクに書き込まれます。
Jest と Vitest はどちらも、glob エンジンに対して dot: true を渡します。つまり、 .agents/. のようなドット接頭辞ディレクトリ内にあるテストファイルを発見します。Mocha の挙動は設定次第ですが、デフォルトでは同様の再帰的パターンに従います。これらはすべて、デフォルトの検出パスから .agents/, .claude/, or .cursor/ を除外しません。
攻撃者は、きれいな SKILL.md と、beforeAll ブロックを含む tests/reviewer.test.ts ファイルを持つ Skill を公開します。そのブロックは process.env、.env ファイル、~/.ssh/ の秘密鍵、そして ~/.aws/credentials を読み取ります。そして外部のエンドポイントへすべてを送信します。テストケースは実際に見えます。エクフィルレーションはセットアップ中に実行されます。テストが通っても失敗しても、静かに(見えない形で)起こります。
このベクタは TypeScript に限りません。Python リポジトリでも conftest.py を通じて同様の露出が起きます。pytest はテスト収集の際にそれを自動実行します。これを防ぐには、pyproject.toml の testpaths の除外に .agents を追加してください。
.agents/skills/ ディレクトリは、同僚が Skills を共有できるように、リポジトリにコミットされることを前提に設計されています。GitHub のデフォルトの .gitignore テンプレートには .agents/ が含まれていません。悪意のあるテストファイルがリポジトリへ入ってしまうと、リポジトリをクローンしてテストを実行するすべての開発者がペイロードを実行します。そして、テストスイートを継承するあらゆるブランチ、あらゆるフォーク上での、すべての CI パイプラインでも同様です。
スキャナは誤った脅威サーフェスを読んでいる
CrowdStrike の CTO である Elia Zaitsev は、RSAC 2026 における独占 VentureBeat インタビューで、構造的な課題を運用上の言葉で説明しました。「実際の運動(kinetic)アクションを観測することは、構造化され、解ける問題です」と Zaitsev は言いました。「意図は(解きにくい)。」
この違いは、Anthropic Skill スキャナのギャップに直結しています。公開されている文書ベースのスキャナは、脅威が SKILL.md と、エージェントに実行させるよう指示されたスクリプトの中に存在すると仮定して動作します。これらのツールは意図を分析します。つまり「Skill がエージェントに何をさせようとしているか」を見ます。Gecko の発見は、運動側(kinetic side)にあります。テストファイルは、開発者自身のツールチェーンを通じて実行されます。エージェントは関与しません。プロンプトも解釈されません。ペイロードは TypeScript であり、正当なテストランナーを通じてフルのローカル権限で実行されます。スキャナは、誤った問題を解こうとしていました。
CrowdStrikeのZaitsevは、アイデンティティの側面を次のように捉えた。「AIエージェントや非人間のアイデンティティは、企業全体に爆発的に広がり、指数関数的に増え、人間のアイデンティティを圧倒する」と彼はVentureBeatに語った。「各エージェントは、OAuthトークン、APIキー、そしてこれまでサイロ化されていたデータセットへの継続的なアクセスを備えた、特権的な超人として振る舞う。」
CrowdStrikeのCharlotte AIや同様のエンタープライズ・エージェントは、まさにこれらの特権で動作している。もしその認証情報が、リポジトリ内の任意のプロセスから参照可能な環境変数として存在するなら、テストファイルのペイロードにエージェント権限は不要だ。すでに開発者権限がある。多くのCI設定では、それはデプロイトークンやクラウドアクセスを意味する。
Ivantiのネットワーク・セキュリティ部門SVPであり、フィールドCISOのMike Riemerは、VentureBeatのインタビューの中で悪用の猶予期間を定量化した。「脅威アクターは、72時間以内にパッチを逆コンパイル(リバースエンジニアリング)している」とRiemerは述べた。「顧客がリリースから72時間以内にパッチを当てなければ、悪用される状態にさらされる。」
多くの企業は数週間かかる。Anthropic Skillスキャナの見落としが、その期間をさらに押し広げる。開発者は今日、悪意のあるSkillをインストールする。テストファイルは直ちに実行される。スキャナが何も検知しなかったため、パッチは存在しない。
Anthropic Skill監査グリッド
VentureBeatは、ClawHavocキャンペーンが1月にClawHubを直撃して以来、Anthropic Skillのサプライチェーンを取り上げてきた。セキュリティリーダーとの会話は、いつも同じ苛立ちに着地する。彼らのチームはスキャナを導入し、レポートはクリーン。しかし、何をチェックしていないのかを問うための枠組みがない。
VentureBeatは、ClawHubからAnthropic Skillsをインストールする開発チームに対して調査を行ってきた。skills.sh. T下のグリッドは、公開されている監査の半分(Snyk、SkillScan)と、スキャナ回避の半分(Gecko)を結びつけている。各行は、Q2の調達でSkillスキャンツールを承認する前に、セキュリティチームが検証すべき検知面を表す。
監査の質問 | スキャナは今日何をしているか | ギャップ | 推奨アクション |
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)する。設定行は1つで済む。 |
テストファイルまたはビルド設定を同梱するSkillsにフラグを立てる | どのスキャナも、高リスクのメタデータとしてはフラグしていない | 些細な静的チェック。追加の実行ファイルを含むSkillsは、脆弱性がある可能性が2.12倍(SkillScan)高い。 | CIゲートを追加:find .agents/ -name "*.test.*" | grep -q . && exit 1。マッチしたらマージをブロック。 |
テストランナーのグロブを、プロジェクト所有のパスに限定する | まれ。ほとんどのCI設定は再帰的なグロブを使う。Jest/Vitestはデフォルトでdot: trueを通す。 | デフォルトのグロブが.agents/, .claude/, .cursor/ディレクトリを横断してしまう。悪意のあるテストファイルが自動的に発見される。 | テストルートを第一者のディレクトリ(src/, app/)にスコープする。.agents/, .claude/, .cursor/を拒否する。 |
スクリプト同梱型のSkillsと、命令のみのSkillsを区別する | 静的解析およびセマンティック解析による部分的なカバー | SkillScan:スクリプト同梱型のSkillsは、命令のみのSkillsよりも脆弱性を含む可能性が2.12倍。 | 構造化された監査項目を必須にする:Skillのタイプ、実行サーフェス、スキャナのカバー範囲、残留リスク。 |
サンプルサイズとともに監査手法を公開する | Snykはyes(3,984 Skills)。SkillScanはyes(31,132 Skills)。 | Ciscoや新興のスキャナは、同等のエコシステム規模の監査を公開していない。 | ベンダーに質問する:手法、サンプルサイズ、検知率。公開された監査がない=独立したベースラインがない。 |
Skillの提供元を不変のコミットに固定する | どのスキャナやマーケットプレイスでも強制されていない | Skillの作者は、レビュー用にクリーンなバージョンをプッシュし、その承認後に悪意のあるテストファイルを追加できる。 | 特定のコミットハッシュに固定する。更新のたびに差分をレビューする。OWASP Agentic Skills Top 10がこの方法を推奨している。 |
今すぐ追加すべきCIの強化3ステップ
Riemerは、VentureBeatのインタビューで、セキュリティ制御を境界(perimeter)に置くと、その正確な境界にあらゆる脅威を誘い込むことになる、というより大きな論点を述べた。Anthropic Skillスキャナは境界をSKILL.mdに置いている。攻撃者は、ペイロードを1ディレクトリ分だけずらして配置する。以下の3つの変更により、境界をコードが実際に実行される場所へ移す。
これらの変更は数分で済む。現行ツールの入れ替えや、スキャナベンダーがギャップを埋めるのを待つ必要はない。
.agents/をテストランナーの無視リストに追加する。 Jestでは、jest.config.jsのtestPathIgnorePatternsに/\.agents/を追加する。Vitestでは、vitest.config.tsのexclude配列に**/.agents/**を追加する。1つの設定ファイルで1行ですむ。これにより、インストールされたSkillディレクトリ内のファイルをテストランナーが発見しないようにできる。チームが現在Anthropic Skillsを使っているかどうかに関わらず実施すること。Skillディレクトリは、誰も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キーに触れるファイル操作がないかを確認するよう求める。
Skillの提供元を最新ではなく特定のコミットに固定する。 npx skills addコマンドは、インストール時点でリポジトリに含まれるものをそのままコピーする。Skillの作者は、スキャナによるレビュー用にクリーンなバージョンをプッシュしてから、承認後に悪意のあるテストファイルを追加できる。特定のコミットハッシュに固定することで、「初回信頼」のモデルから「変更のたびに検証」のモデルへ変換される。OWASP Agentic Skills Top 10は、この方法をまさに推奨している。
Skillsがすでにあなたのリポジトリにある場合: 上記のfindコマンドを、既存の. agents/ディレクトリに対して今すぐ実行する。テストファイルが存在するなら、それらを潜在的な侵害として扱うべきだ。CIから参照可能なあらゆる認証情報(デプロイトークン、クラウドキー、SSHキー)をローテーションし、テスト実行中の想定外のアウトバウンドネットワーク呼び出しについてCIログを監査し、テストファイルがいつリポジトリに入ったのかと、それらを実行したパイプラインがどれかを判断するためにgit履歴を確認する。
Anthropic Skillスキャナのベンダーに聞くべき5つの質問
セキュリティチームが、最初の専用Skillスキャンツールの契約を結び始めています。Geckoのバイパスにより、そうした営業通話での質問内容は変える必要があります。「プロンプトインジェクションを検出しますか?」で止めないでください。次を尋ねてください。
Skillリポジトリの中で、実際にどのファイルとディレクトリを解析しますか?
テストファイルを潜在的な実行サーフェスとして扱いますか?
テスト、CI設定、またはビルドスクリプトを同梱するSkillsを、より高リスクとしてフラグ付けできますか? SkillScanでは、スクリプトを同梱するSkillsは脆弱性の可能性が2.12倍高いことが示されました。
CIでテストランナーのグロブを制限するための統合やガイダンスを提供していますか? CiscoがGitHub上でSkill Scannerをオープンソース化したことには、きちんと評価されるべき点があります。これは、ツールが実装している検出カテゴリが具体的にどれかを、セキュリティチームが正確に確認できるようにします。この透明性が、すべてのベンダーが満たすべき最低基準です。もしベンダーが検出カテゴリを公開しない、またはスキャンロジックをオープンソース化しないのであれば、何を確認して何を見落としているのかを検証できません。
方法論とサンプルサイズを含む、エコシステム規模の監査を公開していますか? Snykは3,984件のSkillsを対象に公開しました。SkillScanは31,132件を公開しました。Riemerは開示パターンについて次のように述べました。「彼らはCVEを公開することは選びませんでした。ただ静かに修正して、日々の生活を続けたのです」と。Anthropic Skillsのエコシステムでも、同じパターンの兆候が早期に見えています。スキャナは、自分たちが検出できるものを文書化する一方で、自分たちが到達できないサーフェスを対応づけません。文書化されたカバレッジと実際の実行サーフェスのギャップこそが、テストファイルのベクターが存在する場所です。
監査グリッドが重要なのは、スキャナモデルが不完全だからです
Anthropic Skillsのエコシステムは、npmサプライチェーンの初期の物語を繰り返しています。ただし、パッケージリポジトリがセキュリティ基盤を構築することを余儀なくされた、積み重なった10年分のインシデントはありません。SkillScanの31,132-Skillデータセットでは、エコシステムの4分の1が脆弱性を抱えていることが示されました。Snykは、4,000件未満のSkillsで76件の確認済みの悪意あるペイロードを見つけました。Geckoは、スキャナモデル自体に、どのベンダーも公にその解消を文書化していない構造的なギャップがあることを証明しました。
スキャナの評価では、一貫して「カバーされているサーフェス」をテストします。Anthropic Skill Audit Gridは、契約前にセキュリティチームが検証すべき7つの監査サーフェスを提供します。3つのCIステップは、次のSkillをインストールする前に展開すべき修正です。RiemerのIvantiチームは、パッチから悪用までのサイクルが、エンタープライズ環境全体でリアルタイムに圧縮されていく様子を見守っています。テストファイルのベクターは、この圧縮をさらに進めます。スキャナが脅威をフラグ付けできなかったため、パッチの猶予期間が存在しないからです。
スキャナが壊れているのではありません。不完全なのです。脅威モデルはエージェントで止まっていました。テストランナーは止まっていません。



