LLM出力やAI生成コンテンツをスキャンし、ユーザー、ログ、下流システムに届く前にデータ漏えい(exfiltration)の兆候を検出します。
現代のLLMアプリケーションは、機密性の高いプロンプト、内部ドキュメント、APIレスポンス、ユーザーデータを日常的に処理します。 これにより、新たなセキュリティ境界が生まれます。それは出力レイヤーです。
EchoLeak系の攻撃(CVE-2025-32711を含む)は、隠蔽または難読化されたペイロードが生成テキストに埋め込まれ、ツール、リンク、パースチェーンを通じてデータを外部に持ち出すために利用されることを実証しました。
従来のスキャナは、ファイル、依存関係、ランタイムトラフィックに焦点を当てています。 生成されたモデル出力を専用に検査することはありません。
exfil-scan は「LLMレスポンス用ウイルススキャナ」を提供します。
| カテゴリ | 重要度 | 検出内容 |
|---|---|---|
| Hidden Text | HIGH | ペイロード隠蔽に使用されるゼロ幅文字や不可視のUnicodeシーケンス |
| Encoded Data | HIGH | エンコードされたコンテンツを含む可能性が高いBase64/hex/octal/Unicodeエスケープの連続 |
| Data-in-URL | MEDIUM | 不自然に長いクエリ文字列とエンコードされたURLパラメータのペイロード |
| Metadata Leaks | HIGH | 構造化・非構造化出力における資格情報らしきキーやトークン形式 |
| Unicode Steganography | MEDIUM | 双方向制御文字や混在スクリプトによるホモグリフ風の単語 |
| Structural Anomalies | LOW | 極端な改行/タブの連続や置換文字によるエンコーディング生成物 |
low、medium、highstdin、単一ファイル、ディレクトリからの入力text、json、markdown、html形式の出力git clone https://github.com/your-org/exfil-scan.git
cd exfil-scan
pip install -e .
pip install exfil-scan
pip install -e ".[dev]"
pytest
echo 'api_key: sk-ABCDEFGHIJKLMNOPQRSTUVWXYZ123456' | exfil-scan
exfil-scan --input output.txt
exfil-scan --directory ./model-logs --recursive
注意:
--input と --directory はどちらか一方のみ使用してください。stdin から読み取ります。1 で終了します。exfil-scan --input suspicious.txt --format text
期待される形式:
exfil-scan report
=================
Scanned targets: 1
Total findings: 2
1. [HIGH] metadata_leaks/known_token_format:openai_key
Location: suspicious.txt:1:10
Description: Matched known credential/token format (openai_key).
exfil-scan --input suspicious.txt --format json
期待される構造:
{
"finding_count": 2,
"scanned_targets": ["suspicious.txt"],
"findings": [
{
"category": "metadata_leaks",
"rule": "known_token_format:openai_key",
"severity": "HIGH",
"description": "Matched known credential/token format (openai_key).",
"location": "suspicious.txt:1:10",
"snippet": "..."
}
]
}
exfil-scan --directory ./outputs --recursive --format html --output report.html
期待される動作:
exfil-scan --input suspicious.txt --format markdown --output report.md
期待される形式:
# exfil-scan Report
- Scanned targets: 1
- Total findings: 2
リポジトリには default-config.yaml が同梱されています。--config で独自のファイルを指定できます。
感度のチューニング:
low: 誤検知が少なく、しきい値が大きいmedium: バランスの取れたデフォルトhigh: より微妙なパターンを検出CLIでの感度上書き:
exfil-scan --input out.txt --sensitivity high
独自のトークン形式やメタデータキーを追加できます:
sensitivity: medium
rules:
metadata_keys:
- api_key
- db_password
- internal_token
token_patterns:
custom_jwt: "\\beyJ[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}\\b"
corp_secret: "\\bcorp_[A-Za-z0-9]{24,}\\b"
その後、次のように実行します:
exfil-scan --input response.log --config ./my-config.yaml
モジュールの責務:
exfil_scan/cli.py: 引数解析、入力選択、出力レンダリング、終了処理exfil_scan/config.py: デフォルト値、YAML読み込み、再帰的マージ、プロファイル正規化exfil_scan/scanner.py: 6つの検出エンジン、検出結果データクラス、レポート整形tests/test_scan.py: 検出および出力形式の回帰テスト実行フロー:
| コード | 意味 |
|---|---|
0 | 検出なし(クリーン) |
1 | 検出あり |
2 | ランタイムまたは引数エラー |
これによりCI統合が簡単になります:
exfil-scan --directory ./artifacts --recursive --format json --output exfil-report.json
何らかの検出があった場合、終了コード 1 に基づいてジョブを即座に失敗させることができます。
テストを実行:
pytest
テストカバレッジには以下が含まれます:
exfil-scan はヒューリスティックスキャナです。
コンテンツの安全性を証明するのではなく、リスクを低減し、不審な出力を可視化することを目的としています。
推奨される導入パターン:
このプロジェクトはMITライセンスの下でライセンスされています。
完全な条件については LICENSE を参照してください。
貢献は歓迎します。 PRを開く際は、以下を含めてください:
| オプション | 型 | デフォルト | 説明 |
|---|
-i, --input | path | none | 1つの入力ファイルをスキャン |
-d, --directory | path | none | ディレクトリ内のサポート対象ファイルすべてをスキャン |
-r, --recursive | flag | false | --directory で入れ子のディレクトリを再帰的に処理 |
-c, --config | path | none | YAML設定ファイルのパス |
-s, --sensitivity | low|medium|high | config/default | 感度プロファイルを上書き |
-f, --format | text|json|html|markdown | text | レポート形式を指定 |
-o, --output | path | stdout | 描画されたレポートをファイルに書き出し |
--version | flag | n/a | CLIバージョンを表示 |
-h, --help | flag | n/a | 使い方と引数を表示 |