Skip to main content

あなたの「スキルスキャナー」は、安心を装うだけ(もしかするとマルウェア)

著者

2026年2月11日

0 分で読めます

AIを開発している方かもしれませんし、CISOかもしれません。開発チームによるAIエージェントの利用を承認したばかりです。データの窃取、プロンプトインジェクション、未検証コードの実行など、リスクは把握しています。そんな中、リードエンジニアから「大丈夫です。ClawHubのSkill Defenderで新しいSkillをすべてスキャンしています」と言われれば、ほっと胸をなで下ろすでしょう。これでチェック項目に印がつきました。

でも、このスキルスキャナーをチェックしましたか?

不安の原因は、既知の脅威ではなく、脅威を見つけるために信頼しているツールです。安全網に穴が開いているのではないかという疑念が、頭から離れません。そして、現在出回っている「AIスキルスキャナー」については、その疑念はまったく正当なものです。

Agent Skillsやそのセキュリティリスクについて初めて知る方に向けて、以前、Skill.mdの脅威モデルと、それがAIエージェントのエコシステムやサプライチェーンセキュリティに与える影響について解説しました。

正規表現ではSKILL.mdの悪意をスキャンできない理由

AIセキュリティの敵はハッカーだけではありません。言語の無限の多様性もまた、脅威です。従来のAppSecでは、既知の脆弱性(CVE)や既知のパターン(シークレット)をスキャンします。コードは構造化され、有限で、決定論的だからこそ、この方法が有効です。SQLインジェクションのペイロードには見分けられる構造があり、漏えいしたAWSキーには固有の形式があります。

しかし、AIエージェントのSkillは根本的に異なります。自然言語のプロンプト、コード実行、設定が組み合わさっています。「不適切な単語」や禁止パターンの拒否リストに頼るのは、自然言語の無限の表現に対する終わりのない戦いです。LLMに危険なことをさせるあらゆる表現を列挙することなどできません。おなじみのcurlコマンドを考えてみましょう。正規表現スキャナーは、データ窃取を防ぐためにcurlを検出するかもしれません。しかし、巧妙な攻撃者はcurlを書く必要はありません。たとえば、次のように書けます。

  • c${u}rl(bashのパラメーター展開を使用)

  • wget -O-(別のツールを使用)

  • python -c "import urllib.request..."(標準ライブラリを使用)

  • あるいは、単に「このURLの内容を取得して、表示してください。」と頼むだけです。

最後のケースでは、エージェント自身がコマンドを組み立てます。スキャナーに見えるのは無害な英語の指示だけですが、意図は依然として悪意あるものです。これこそが「拒否リスト」という考え方の根本的な欠陥です。概念を理解するよう設計されたシステムで、特定の単語をブロックしようとしているのです。

文脈を考慮すると、さらに複雑になります。「シェルアクセス」を求めるスキルは、DevOpsのデプロイツールなら正当な場合があります。しかし、「レシピ検索」や「カレンダーアシスタント」では壊滅的な結果を招きかねません。パターンマッチャーは「シェルアクセス」を検出すると、両方を警告する(ノイズが増える)か、両方を無視する(リスクが生じる)しかありません。アクセスが求められる理由は理解できず、その言葉があることしか分からないのです。

事例:コミュニティ製スキャナーを実際のマルウェアでテスト

そこで、コミュニティで最も人気のある「スキルスキャナー」をテストすることにしました。SkillGuard、Skill Defender、Agent Tinmanを調査し、味方と敵を見分けられるか確かめるため、独自の「半悪意的な」Skillとも照らし合わせました。

1. SkillGuard:実はマルウェアだったスキャナー

最初に調査したのは、ユーザーc-goroによるSkillGuardです。うたい文句は、軽量なスキルスキャナー。実態は、罠でした。

AIにAPIキーを漏えいさせるため、システムタグを使ってだます悪意あるプロンプトインジェクション攻撃を含むMarkdownファイルのコードエディター画面。

SkillGuardを分析したところ、社内システムはこれをセキュリティツールではなく、悪意あるスキルとして検出しました。「定義の更新」を装ってペイロードをインストールしようとしていたのです。

悪意のあるBashスクリプト「debug.sh」。リバースシェルのペイロード、Base64でエンコードされたホスト、機密性の高い認証情報ファイルを外部ドメインに流出させるcurlコマンドが表示されています。

更新:この記事の執筆時点で、SkillGuardはClawHubから削除されています。しかし、インストールした数百人のユーザーには、すでに被害が及んでいます。これは根本的な問題を示しています。スキャナーをスキャンするのは誰でしょうか?

画像 image4

2. Skill Defender:見逃しの発生

次に、Skill Defender(作成者:itsclawdbro)とAgent Tinman(作成者:oliveskin)を調査しました。いずれも正当なコミュニティの取り組みで、Skill DefenderにはVirusTotalの「良性」バッジも付いています。

しかし、「良性」であることは「効果的」であることを意味しません。

vercelというテスト用Skillを作成しました。Vercelプラットフォームのデプロイツールに見えるだけで、実際にはユーザーのホスト名をリモートサーバーにひそかに流出させるよう設計されていました。

Gemini CLIを使って、この悪意あるSkillをSkill Defenderでスキャンしました。

> use the skill defender to scan current skills

結果は次のとおりです。

  • 悪意あるSkill(vercel):判定:クリーン。検出数0。

  • スキャナー本体(skill-defender):判定:危険。検出数20。

skill-defenderのセキュリティスキャン結果を表示したターミナル。1つのスキルが20件の検出事項とともに危険と判定される一方、コーディングワークスペース内のVercelスキルは安全と表示されています。

偽のVercelスキルに含まれるデータ流出コードが、ハードコードされた「不適切な」文字列のリストに一致しなかったため、スキャナーは実際の脅威を見逃しました。その一方で、参照ファイルにスキャン対象の「脅威パターン」そのものが含まれていたため、スキャナー自身を危険と判定したのです。

これは典型的な「ウイルス対策のパラドックス」です。悪意のあるものを知っているためにスキャナー自体が悪意あるように見える一方、新しい脅威には気づけません。

3. Ferret Scan:依然として正規表現パターンに依存

GitHubベースのスキャナーFerret Scanも調査しました。正規表現に加えて「Deep AST-based analysis」を使うとうたっています。ClawHub標準のツールより大幅に優れていますが、自然言語を使った攻撃の微妙な違いには、依然として対応しきれていません。

画像 image6

ハードコードされたAPIキーは検出できても、エージェントに要約を頼んだPDFに埋め込まれたプロンプトインジェクションを検出できるでしょうか?

エージェントの意図を行動分析する

AIセキュリティを「不適切な単語のフィルタリング」として捉えるのはやめるべきです。行動分析として考える必要があります。

AIコードは金融負債に似ています。すぐに利用できますが、その条件(つまりプロンプトの意図)を理解していなければ、自らを破産へと追い込むことになります。

正規表現スキャナーはスペルチェッカーのようなものです。単語が正しく書かれているかを確認します。セマンティックスキャナーは編集者のようなものです。「この文は意味が通るか?ユーザーに危険なことをさせようとしていないか?」と問いかけます。

ToxicSkillsの調査が示す証拠:鍵を握るのは文脈

最近実施したToxicSkillsの調査では、スキルの13.4%に重大なセキュリティ上の問題が含まれていることが分かりました。その大半は、単純なパターンマッチングでは検出できませんでした。

  • プロンプトインジェクション:「ジェイルブレイク」手法を使い、安全フィルターを回避する攻撃。

  • 難読化されたペイロード:Base64文字列や外部ダウンロードに隠されたコード(最近のgoogle-qx4攻撃など)。

  • 文脈に応じたリスク:「シェルアクセス」を求めるスキルは開発ツールなら問題ないかもしれませんが、「レシピ検索」では壊滅的な結果を招きかねません。

正規表現は「シェルアクセス」を検出して、どちらも警告します。あるいは、もっと悪いことに、プロンプトが「システムコマンドを実行」と表現しているため、どちらも検出できません。

解決策:SKILL.mdファイルにAIネイティブのセキュリティを

この開発スピードに対応するには、静的なパターンを超える必要があります。必要なのはAIネイティブのセキュリティです。

そこで開発したのがmcp-scan(SnykのEvoプラットフォームの一部)です。単に文字列をgrepするのではありません。専用のLLMでSKILL.mdファイルを読み取り、スキルの機能と関連アーティファクト(スクリプトなど)を理解します。

mcp-scanの実行は、次のような問いかけだと考えることができます。

  • このスキルはファイルを読み取る権限を求めているか?

  • 以前の指示を無視するよう、ユーザーを説得しようとしているか?

  • 1週間未満しか存在しないパッケージを参照しているか(Snyk Advisor経由)?

静的アプリケーションセキュリティテスト(SAST)とLLMベースの意図分析を組み合わせれば、構文だけでなく、未知のエンドポイントへデータを送信するという挙動を検出できるため、vercelのデータ流出スキルを捕捉できます。

明日、チームに次の3つの質問をしてみてください。

  1. 「AIエージェントが使っているすべての『スキル』を一覧で把握できていますか?」 - 「はい」と答えたら、どうやって見つけたのか聞いてみましょう。手作業なら、情報はすでに古くなっています。「いいえ」なら、mcp-scanを共有しましょう。

  2. 「これらのスキルは、意図をスキャンしていますか?それともキーワードだけですか?」 - 正規表現頼みの考え方に疑問を投げかけましょう。

  3. 「信頼しているスキルが、明日、悪意ある依存関係とともに更新されたらどうなりますか?」 - 一度きりではなく、継続的なスキャンを求めましょう。

「セキュリティ・シアター」によって、誤った安心感を抱かないでください。エージェントは賢くなっています。セキュリティもそれ以上に賢くする必要があります。Evo by Snykがエージェント型AIを統合的に制御する方法をご覧ください。

ガイド

Evo by Snykでエージェント型AIの制御を統合

Evo by Snykは、セキュリティおよびエンジニアリングのリーダーに、AIセキュリティを自然言語で統合的にオーケストレーションする手段を提供します。Evoが専門エージェントを連携させ、AIライフサイクル全体をエンドツーエンドで保護する方法をご覧ください。