Claude CodeにSageプラグインを入れてコマンドとファイル操作を検査する
Gen DigitalのSageは、Claude Codeのツール呼び出しの手前でコマンド・URL・ファイル操作を検査するプラグインです。導入、動作確認、誤検知の例外設定、送信されるデータまで。
Sageは、Claude Codeが Bash や Write を実行する直前に、その中身を検査するプラグインです。提供元はGen Digitalで、プラグインの説明は「Agent Detection & Response(ADR)for AI agents」。危険と判断した操作は止めるか、承認ダイアログに回します。
ここでは導入と動作確認、検査の仕組み、誤検知の抑え方、送信されるデータの範囲を順に説明します。
Sageが検査する5つの層と、止める対象
Sageはツール呼び出しからコマンド・URL・ファイルパス・書き込み内容を取り出し、複数の層に通します。READMEに挙がる機能は次のとおりです。
Sageの検出層
URL評判
クラウド側でマルウェア・フィッシング・詐欺サイトのURLを判定します。APIキーは不要です。
ローカルのヒューリスティクス
YAMLで書かれた300件超のパターンが、危険なコマンドや認証情報の露出、難読化を拾います。
プロンプトインジェクション検知
取得した内容に紛れた指示を、ルールとMLモデルの二段で探します。MLは既定でオフです。
パッケージのサプライチェーン検査
npmとPyPIのパッケージについて、レジストリ上の実在・ファイル評判・公開からの経過日数を見ます。
プラグインとスキルのスキャン
セッション開始時に、入っている他のプラグインやスキルを走査します。
Claude Codeで検査の対象になるのは、PreToolUse が走る Bash・WebFetch・Write・Edit・Read の5つです。ツールの実行後にも PostToolUse で出力を見て、プロンプトインジェクションの兆候があれば警告を文脈に足します。ただしこちらは実行を止められません。
Windowsでは、AMSI(Windows標準のマルウェアスキャン連携)も使われます。macOSと、WSLでないLinuxでは何もしません。
入れ方と動作確認
前提はNode.js 18以上です。マーケットプレイスの追加とインストールの2行で入ります。
Claude Codeへの導入
- 1
マーケットプレイスを追加する
Claude Codeのセッション内で、提供元のリポジトリをマーケットプレイスとして登録します。
- 2
プラグインを入れる
sage@sageを指定します。プラグイン名もマーケットプレイス名もsageです。 - 3
Claude Codeを再起動する
再起動すると、以降のセッションで自動的に読み込まれます。
/plugin marketplace add https://github.com/gendigitalinc/sage.git
/plugin install sage@sageclaude.comのマーケットプレイスには gen-sage という名前のページがあり、「Anthropic verified」の表示とプラグインソースへのリンクが付いています。上のコマンドの識別子はリポジトリ側のマニフェスト(name が sage)に合わせたものです。
入ったかどうかを無害なコマンドで確かめる
Sageには、動作確認用のカナリアが同梱されています。Claude Codeに次のコマンドを実行させると、balanced の既定設定ではClaude Codeの権限ダイアログが出て、承認か拒否を選ばされます。
echo diagmark_cmd_8f2e6b71この文字列は DUMMY-CMD-ASK-001 のルールに当たります。diagmark_cmd_a75bf229 は DUMMY-CMD-DENY-001 に当たり、こちらはブロックされます。ダイアログも出ずに実行された場合は、プラグインが読み込まれていません。
askとdenyで何が起きるか
Sageの判定は3種類です。複数の信号が重なったときは deny が ask に、ask が allow に優先します。
| 判定 | 意味 | Claude Codeでの見え方 |
|---|---|---|
allow | 意味脅威なし | Claude Codeでの見え方そのまま実行される |
ask | 意味怪しい | Claude Codeでの見え方権限ダイアログで承認か拒否を選ぶ |
deny | 意味確認済みの脅威 | Claude Codeでの見え方実行がブロックされる |
ask の承認はそのセッション限りです。恒久的に通したいパターンは、次の節の例外ルールに書きます。
もう一つ、設計上の特徴があります。内部でエラーが起きたときは必ず allow を返します。URL評判のAPIが落ちた場合も、ヒューリスティクスだけで判定を続けます。エージェントを止めないことを優先した作りで、検査が効かない状況があり得ることも意味します。フックが8秒のタイムアウトを超えたときも、Claude Code側がフックを無視して呼び出しを通します。
誤検知を例外ルールで減らす
開発で日常的に使うコマンドが ask に落ちるなら、~/.sage/exceptions.json にルールを足します。保存すれば次のツール呼び出しから効き、再起動は要りません。
{
"rules": [
{
"decision": "allow",
"match": "executable",
"pattern": "docker build",
"reason": "Docker builds are part of my workflow"
}
]
}match に使えるのは executable・domain・path・plugin・regex の5種類です。落とし穴になりやすい挙動を3つ挙げます。
executableは&&・|・;などで連結した複合コマンドに当たりません。rmを許可してもrm foo && curl ... | bashは通らず、この設計は意図的ですgit --no-pager logのようにフラグが間に入ると、git logのパターンに当たりません。そのときはregexを使いますdenyのルールが常に勝ちます。許可ルールと拒否ルールが両方当たれば、拒否になります
落とし穴
プロジェクトのパスを丸ごと許可すると、書き込み内容の検査も飛ぶ
path の許可ルールは、ファイルパスが一致した時点で検査パイプラインを飛ばします(表の記述では「短絡」)。/home/user/project を許可すると、その配下への Write や Edit は中身を見られずに通ります。便利ですが、検査を入れた目的とぶつかります。許可は docker build のような狭い実行ファイル単位から始めるほうが、検査の網を残せます。
特定のルール自体が合わないときは、~/.sage/config.json の disabled_threats に脅威ID(例: CLT-CMD-001)を並べます。IDはリポジトリの threats/ 配下のYAMLに載っています。
感度とMLの設定
sensitivity は3段階で、ask から deny に昇格する信頼度のしきい値が変わります。
| プリセット | denyのしきい値 | askのしきい値 | 挙動 |
|---|---|---|---|
paranoid | denyのしきい値0.70 | askのしきい値0.30 | 挙動少しでも怪しければ止める |
balanced(既定) | denyのしきい値0.85 | askのしきい値0.50 | 挙動確認済みの脅威を止め、怪しいものは警告 |
relaxed | denyのしきい値0.95 | askのしきい値0.70 | 挙動確度の高い脅威だけ止める |
paranoid で ask が deny に昇格するのはOpenClawとOpenCodeです。Claude Codeは別経路のネイティブダイアログなので影響を受けません。
MLのプロンプトインジェクション検知を使うなら、~/.sage/config.json で有効にします。
{
"sensitivity": "balanced",
"pi_check": { "enabled": true }
}モデルは同梱されておらず、有効化後の最初のセッションがバックグラウンドで ~/.sage/models/ に取得します。ダウンロード中はMLの推論が黙って省かれ、モデルは次のセッションから効きます。
パッケージ検査が拾う、AI特有の事故
npm install などのインストールコマンドと、package.json・requirements.txt の書き込みが対象です。判定は表のとおりです。
| 状況 | 判定 |
|---|---|
| レジストリに存在しないパッケージ(幻覚や綴り違い) | 判定deny |
| 実在パッケージの存在しないバージョン | 判定deny |
| ファイル評判で既知のマルウェア・PUP | 判定deny |
| 公開から7日未満 | 判定ask |
エージェントが実在しない依存名を提案する事故を、実行前に止める設計です。tarballはダウンロードせず、レジストリのメタデータとハッシュ照会だけで判断します。@scope/pkg 形式のスコープ付きは、プライベートレジストリの誤検知を避けるためスキップされます。依存関係の検査には、脆弱性とライセンスを照会するプラグインを併用する手もあります。手順はClaude CodeにSonatype Guideプラグインを入れて依存関係を検査するにあります。
送信されるデータと止め方
検査にはGen Digitalのクラウドサービスが絡みます。送られるものは5種類です。
- 抽出したURL(URL評判)
- npm・PyPIのパッケージのSHA-256ハッシュ(ファイル評判)
- 未知のスキルの中身(
SKILL.mdとスキルのフォルダ内のファイル) - セッション開始時のバージョン確認(Sageのバージョン、エージェント種別、OS、ランダムなインストールID)
- 検知時のテレメトリ(Community IQ。
denyのとき、一致したルールIDと上限付きのコマンド文字列など)
見落としやすいのは3つ目です。スキルのアップロードは既定でオンで、自分で書いた個人用スキルも対象になり得ます。
ソースコードやプロジェクトのファイル内容は送られない、と説明されていますが、未知のスキルだけは例外です。完全にローカルで動かすには、設定を次のようにします。
{
"url_check": { "enabled": false },
"file_check": { "enabled": false },
"package_check": { "enabled": false },
"skill_check": { "enabled": false },
"community_iq": false
}スキルは照会だけ続けて中身を送りたくないなら、skill_check の upload_enabled だけを false にします。この状態でもセッション開始時のバージョン確認は残ります。
入れる前に知っておく限界
- MCPツール(
mcp__*)の呼び出しは、まだ検査の対象外です。インターセプトされるのは組み込みの5ツールだけです - ユーザー独自の脅威ルール(
~/.sage/threats/)は計画段階で、使えません - 検査はClaude Codeの権限設定を置き換えるものではありません。どのコマンドを許可するかの設計は別に必要です
Claude Codeの使用状況を後から集計したい場合は、検知ログとは別にOpenTelemetryを使います。設定はClaude CodeのOpenTelemetryでプラグインの導入と利用を測るが参考になります。
検知の履歴をたどる
検知は ~/.sage/audit.jsonl に1行1件のJSONで追記されます。既定では deny と ask だけが記録され、allow は logging.log_clean を有効にしたときに限ります。ファイルが5MiBに達すると、バックアップを3世代まで残して回転します。
tail -n 5 ~/.sage/audit.jsonl各行の tool_input_summary は200字以内の要約で、grep に向きます。entry_id は誤検知の報告に使います。
誤検知をClaude Codeに報告させる
プラグインはMCPサーバーも同梱し、sage_list_audit_entries と sage_report_false_positive の2つのツールを出します。Claude Codeに「直近のSageの検知を一覧して」と頼むと、entry_id が分かります。続けて理由を添えて報告を頼めば、Gen Digitalに送られます。
1回の報告に含められるのは最大10件です。ソースコードやファイルの中身は含まれないと説明されています。
まとめ
Sageは、権限ダイアログの手前に検査層を足すもので、いちばん効くのは依存パッケージの実在確認と、危険なコマンドのask化です。許可ルールを広く書くと検査が飛ぶこと、MCP呼び出しが対象外であること、未知スキルが既定でアップロードされることの3点は、入れる前に設定を決めておく項目です。