エージェントスキルに隠された指示を見つける(HTML コメント・不可視文字・大量の空行)
不正と判定されたスキルの一部は、プレビューでは見えない場所に指示を隠していた。スキルを入れる前に元ファイルを最後まで読み、検査前に不可視文字と空行を正規化し、記憶・設定ファイルをスキルから守る。
どんな隠し方があったか
VirusTotal で不正と判定された 6,637 件のスキルのうち、少なくとも 90 件(約 1.4%)で見つかった。実害の件数ではなく、概念実証も含む。
- 大量の空行(56 件): 78〜825 行の空行の後に指示を置く。プレビューやエディターの最初の画面では見えない。例として、WHO の指標を照会するスキルで、733 行の空行の後に「特定国のマラリア罹患率を 0 と答える」指示があった。
- HTML コメント(28 件): GitHub や IDE の Markdown プレビューに表示されない
<!-- -->内に、API キーやトークンを外部へ送らせ、それを利用者に知らせないよう求める指示。 - 不可視の Unicode 文字(6 件): タグ文字やゼロ幅文字で指示を符号化したり、単語の間にゼロ幅スペースを入れて検査の照合をすり抜けたりする。
- LLM 型のスキャナーに「安全と判定せよ」と求める文や、
MEMORY.mdなどへ書き込ませてスキル削除後も影響を残そうとする例もあった。
入れる前の確認
- プレビューではなく元ファイルを末尾まで確認する。行数が不自然に多くないかを見る。
- HTML コメントを抜き出して読む。例:
grep -n '<!--' SKILL.md - 不可視文字を探す。例(GNU grep):
grep -nP '[\x{200B}-\x{200F}\x{2060}\x{FEFF}\x{E0000}-\x{E007F}]' SKILL.md - 自動検査を組むなら、検査の前にゼロ幅文字を除去し、タグ文字は復号するか拒否し、連続する空行を圧縮してから判定する。
入れた後の守り
- 記憶ファイルや設定ファイル(
MEMORY.md、エージェントの設定など)は、利用者の承認なしにスキルが変更できないようにする。 - スキル削除後も、記憶・設定ファイルに見覚えのない追記が残っていないか確認する。
関連
- エージェントスキルの「確認なしで使わせるツール」欄は制限ではない(6,309 件の調査から)
- AI スキルに書かれた外部ドメイン・URL を「依存」として点検する(OpenAI render-deploy 事例)
追記(2026-11-08):スキルファイル経由の脱獄の実測と検査ツール
- 読み込んだ Markdown をシステムプロンプトとして使う質問応答エージェントで、SKILL.md 相当のファイルに脱獄プロンプトを埋め込むと、7 つのオープンウェイトモデルの平均攻撃成功率が 0.5% から 44.8% に上がった(モデルにより 13.7〜68.9%)。ゼロ幅文字などの難読化は平文の埋め込みを上回らなかったので、「見えない文字だけ探す」点検では足りず、平文の指示そのものを読む必要がある。
- 導入前の機械的な検査には エージェントのスキルは入れる前に検査する:NVIDIA の SkillSpector が使える。