AIエコシステムの保護:Claudeスキルセキュリティスキャナーのアーキテクチャ
Claude Codeの普及により、サードパーティスキルはデータ漏洩や任意のコマンド実行といった新たなセキュリティリスクをもたらします。本稿では、静的解析で悪意あるコードを検出するツールの設計・実装、加重スコアリングによるリスク定量化、ビジュアルレポート生成について解説します。
このページの内容
Claude Codeエコシステム向けのセキュリティスキャナーのアーキテクチャ、リスク定量化アルゴリズム、実装に関する詳細解説です。
「Skills」の台頭とセキュリティのギャップ
Claude Codeのリリースにより、開発者がAIとやり取りする方法にパラダイムシフトが起きています。Skillsメカニズムの導入により、ユーザーはカスタムスクリプトを通じてAIアシスタントの機能を拡張できるようになりました。これらのSkillは、ファイルシステムへのアクセス、システムコマンドの実行、ネットワークリクエストの開始など、強力なアクションを実行できます。
これは効率性を大きく向上させますが、同時に大きな攻撃対象領域を生み出します。悪意のある、または不適切に書かれたSkillは、以下を行う可能性があります:
~/.ssh/id_rsaやAPI認証情報を読み取る- データを不明な外部サーバーに外部送信する
rm -rf /やその他の破壊的なコマンドを実行する
現在、ユーザーがサードパーティのSkillをインストールする際、そのコードが実際に何をするかを監査する標準的な方法が不足しています。これを解決するため、私はSkill-Security-Scannerを構築しました—Claudeエコシステム向けに設計された自動静的アプリケーションセキュリティテスト(SAST)ツールです。
本記事では、このツールのシステムアーキテクチャ、正規表現ベースの検出エンジン、リスク定量化アルゴリズムについて説明します。
システムアーキテクチャ
スキャナーは、新しい攻撃ベクトルが発見されたときに簡単に拡張できるよう、モジュール性を念頭に置いて設計されています。アーキテクチャはボトムアップのレイヤーアプローチに従います:
- データ収集レイヤー:ディレクトリ構造を解析し、
.gitやnode_modulesなどのノイズを無視して、関連するコードファイルを抽出します。 - ルールエンジン:正規表現パターン、ホワイトリスト、ルール定義を管理するコアロジックです。
- 解析エンジン:実際のスキャンを行い、すべてのマッチに対して信頼区間を計算します。
- リスク評価:数学的モデルで、発見事項を集計して単一の「リスクスコア」にします。
- レポート生成:人間-readableな出力(コンソール、JSON、レスポンシブHTMLダッシュボード)を生成します。
主要コンポーネント
- ConfigLoader:YAMLベースの構成を管理し、ユーザーが感度を設定したり信頼できるドメインをホワイトリストに追加したりできます。
- Rules Factory:Factoryパターンを使用してセキュリティルールを動的にロードし、コードベースを拡張可能にします。
- Skill Analyzer:ファイルの解析と発見事項の集計を実行するワーカーレイヤーです。
検出エンジン:動作原理
スキャナーの心臓部はルールシステムです。リスクを5つの主要なカテゴリに分類します:
- ネットワークセキュリティ:暗号化されていないHTTP呼び出しや不明なドメインへのデータ送信を検出します。
- ファイル操作:
~/.ssh/authorized_keys、環境変数などの機密パスへのアクセスや危険な書き込み操作をフラグ立てします。 - コマンド実行:
subprocess、os.system、または危険なシェルコマンド(sudo、mkfsなど)の呼び出しをキャッチします。 - コードインジェクション:
eval()、exec()、ロジックを難読化する動的インポートを識別します。 - 依存関係リスク:依存関係(confusion)攻撃やグローバルパッケージの強制インストールを検出します。
マッチングアルゴリズム
私たちは単にキーワードを探すだけでなく、信頼度を計算します。単純なgrepだけではノイズが多すぎます。アルゴリズムはコンテキストに基づいて信頼度スコアを調整します(例:キーワードはコメント内にありますか?)。
以下はPythonでのマッチングロジックを簡略化したものです:
import re
def match(content: str, patterns: list) -> list:
compiled_patterns = [re.compile(p, re.IGNORECASE) for p in patterns]
matches = []
for line_number, line in enumerate(content.split('\
'), 1):
for pattern in compiled_patterns:
if pattern.search(line):
confidence = calculate_confidence(line)
matches.append({
'line': line_number,
'content': line.strip(),
'confidence': confidence
})
return matches
def calculate_confidence(line: str) -> float:
base_confidence = 0.7
# コメントアウトされている場合は信頼度を下げる
if line.strip().startswith(('#', '//')):
base_confidence -= 0.2
# 高リスクのキーワードが含まれている場合は信頼度を高める
if "sudo" in line or "rm -rf" in line:
base_confidence += 0.2
return max(0.0, min(1.0, base_confidence))
リスクの定量化:スコアリングモデル
「やや乱雑な」スクリプトと「重大な脅威」の違いをどのように見分けますか?私たちは加重スコアリングモデルを使用します。
1. 重み配分
重大度に基づいて重みを割り当てます:
- 重大(CRITICAL):10.0ポイント
- 警告(WARNING):4.0ポイント
- 情報(INFO):1.0ポイント
2. 数式
最終スコアは0-10のスケールに正規化されます。
$$ \text{Raw Score} = \sum (\text{Issue Weight} \times \text{Issue Confidence}) $$
$$ \text{Normalized Score} = \left( \frac{\text{Raw Score}}{\text{Max Possible Score}} \right) \times 10 $$
3. 視覚化
HTMLレポートでは、これらのスコアは直感的な危険ゾーンにマッピングされます:
- 🔴 重大(CRITICAL)(8.0 - 10.0):使用しないでください。
- 🟠 高(HIGH)(6.0 - 7.9):高リスク、手動監査が必要。
- 🟡 中(MEDIUM)(4.0 - 5.9):注意して進行。
- 🟢 安全(SAFE)(0.0 - 1.9):問題なし。
レポートの生成
CLIツールはCI/CDに最適ですが、人間には視覚的なものが必要です。スキャナーは、Tailwind CSSでスタイリングし、Vanilla JSでインタラクティブ性を提供するスタンドアロンのHTMLレポートを生成します。
国際化(i18n)
このツールはグローバルな対象読者を想定しているため、Python標準のgettextライブラリを実装しました。UIはユーザーのロケールに適応し(英語と中国語をサポート)、すぐに使えます。
import gettext
from pathlib import Path
def init_i18n(lang: str = 'en_US'):
locale_dir = Path(__file__).parent / 'locales'
translator = gettext.translation('skill_scan', localedir=locale_dir, languages=[lang])
translator.install()
def _(message):
return get_translation().gettext(message)
ケーススタディ:悪意のあるSkillの検出
システムをテストするために、静かに悪意のあるペイロードを 포함한「Code Optimizer」スキルに対して実行しました。
スキャン結果:
リスクレベル:重大(CRITICAL)(10.0/10)
- [NET001] 外部C2サーバーへのPOSTリクエストを検出。
- [FILE001]
~/.ssh/id_rsaの読み取りを試行。- [CMD001]
sudoによる権限昇格を試行。- [INJ001]
eval()を使用してペイロードを難読化。
このツールなしでは、開発者は単に/optimize-codeを実行して、知らず知らずのうちにローカル環境を危険にさらしていた可能性があります。
パフォーマンス最適化
静的解析は大きなリポジトリでは遅くなる可能性があります。以下の方法でパフォーマンスを最適化しました:
- スマートフィルタリング:バイナリファイル、画像、大きなデータセット(50MB以上)を自動的にスキップ。
- 正規表現の事前コンパイル:ループ内でコンパイルする代わりに起動時に一度だけパターンをコンパイル。
- ジェネレータパターン:Pythonジェネレータを使用してファイルを1行ずつ読み取り、大規模なプロジェクトをスキャンしてもメモリ使用量を低く維持。
今後のロードマップ
Skill-Security-Scannerは現在v1.0.0ですが、大きな計画があります:
- CI/CD統合:不安全なSkillのマージをブロックするためのネイティブGitHub ActionsとGitLab CIランナー。
- 機械学習:正規表現を超えて、複雑なロジックボムや難読化されたコードを検出するためにLLMを使用。
- サンドボクシング:Dockerコンテナ内でSkillを実行して実際の動作を観察するオプションの動的解析モード。
結論
AIエージェントとそのプラグインエコシステムにより多くのコントロールを委譲するにつれて、セキュリティは後付けにできません。Skill-Security-Scannerは、開発者がClaude Skillを安全に利用するために必要な可視性を提供する необходимый防御レイヤーを提供します。
🔗 コードの取得
プロジェクトはオープンソースでGitHubで公開中です。コントリビューション、イシュー、星印を歓迎します!
リポジトリ:github.com/huifer/skill-security-scan
クイックリファレンス
| 側面 | 主な情報 |
|---|---|
| トピック | 患者教育と認識 |
| 関連性 | あなたの個人的な状況に適用されるかどうかについて、医療提供者と相談してください |
| アクション | あなたのケアチームと推奨される頻度でフォローアップをスケジュールする |
| 頻度 | 現在の臨床ガイドラインに基づいています |
| 証拠 | バランス取れた栄養、身体活動(週150分以上)、質の良い睡眠(7〜9時間)、ストレス管理、タバコの回避 |
よくある質問
Q:これが私に当てはまるかどうか、どうやってわかりますか? A:あなたの個人的な病歴と家族歴について医療提供者と相談し、あなたの個人的なリスク要因と適切な次のステップを評価してください。
Q:医師に何を尋ねるべきですか? A:良い質問には次のようなものがあります:「私の結果の意味は何ですか?」「私のオプションは何ですか?」「どのようなライフスタイルの変更が有帮助ですか?」「いつフォローアップすべきですか?」
Q:有帮助なライフスタイルの変更はありますか? A:ほとんどの健康状態は、基本的な対策から恩恵を受けます:バランス取れた栄養、規則的な身体活動(週150分以上)、質の良い睡眠(7〜9時間)、ストレス管理、タバコの回避。
医療免責事項
この記事は教育目的のみを目的としており、医学的アドバイス,构成するものではありません。健康、治療、ケアに関する決定する前に、常に資格のある医療提供者と相談してください。個々の状況は異なり、1人に適切なものが別の人に適切でない場合があります。
、医学的緊急事態が発生した場合は、直ちに119(またはあなたの地域の緊急番号)に連絡してください。