AISLE (https://aisle.com) による、LLMを活用した最小限のゼロデイ脆弱性スキャナー。

デモンストレーション目的の研究プロトタイプ。 これは単一ファイルのシンプルなハーネスであり、実際のゼロデイ脆弱性を検出できます。ただし、これはプロトタイプであり、C/C++のメモリ安全性バグに偏っており、誤検出を生じることに注意してください。オープンリサーチの精神に則り、現状のまま共有しています。予期せぬ動作があるかもしれません。
Nano-analyzer は、ソースコードを3段階のLLMパイプラインに送信するシンプルな単一ファイルのPythonスキャナーです:
コンテキスト生成 — モデルがファイルに関するセキュリティ概要を作成します:ファイルの機能、信頼されていないデータの流れ、存在するバッファとそのサイズなど。
脆弱性スキャン — 同じモデルがコンテキストを基に、関数ごとにゼロデイバグを探し、構造化された検出結果を出力します。
懐疑的なトリアージ — 各検出結果は、コードベースをgrepして防御策を検証(または反駁)できる懐疑的なレビュアーによって複数ラウンドで挑戦されます。裁定者が最終判断を下します。
結果は、人間によるレビューのためにMarkdownおよびJSONファイルとして保存されます。
これはv0.1プロトタイプです。以下の点にご注意ください:
C/C++への偏り プロンプト、少数例、ヒューリスティックは、C/C++のメモリ安全性の脆弱性(バッファオーバーフロー、NULLポインタ参照、整数オーバーフロー、型の混同)に大きく調整されています。他の言語もスキャンしますが、効果ははるかに低くなります。
誤検出 複数ラウンドのトリアージがあっても、詳細な検査で成立しない検出結果が含まれます。必ず手動で検証してください。
見逃し スキャナーは脆弱性のクラス全体を見逃す可能性があります — ロジックバグ、競合状態、暗号関連の問題、認証バイパスなど。スキャン結果がクリーンでもコードが安全であるとは限りません。
単一ファイル分析 各ファイルは独立してスキャンされます。コンパイル単位間の相互作用に依存するファイル間の脆弱性は見逃される可能性が高いです。
LLM依存 結果は使用するモデルによって異なります。異なるモデルは異なるものを見つけ、異なる誤検出を幻覚します。
rg)csearch/cindex)git clone https://github.com/weareaisle/nano-analyzer.git
cd nano-analyzer
# No dependency installation needed. Run directly:
python3 scan.py --help
APIキーを環境変数として設定します:
# For OpenAI models (model names without a slash, e.g. "gpt-5.4-nano"):
export OPENAI_API_KEY=sk-...
# For OpenRouter models (model names with a slash, e.g. "qwen/qwen3-32b"):
export OPENROUTER_API_KEY=sk-or-...
スキャナーはモデル名に基づいて使用するキーを決定します:モデル名に/が含まれる場合はOpenRouter経由でルーティングし、それ以外の場合はOpenAI APIを直接使用します。
# Scan a single file
python3 scan.py ./path/to/file.c
# Scan a directory recursively
python3 scan.py ./path/to/src/
# Use a different model
python3 scan.py ./src --model gpt-5.4
# Control parallelism
python3 scan.py ./src --parallel 30
# Point triage grep at the full repo root (useful when scanning a subdirectory)
python3 scan.py ./lib/crypto/ --repo-dir ./
# Only surface high-confidence findings
python3 scan.py ./src --min-confidence 0.7
# More triage rounds for higher accuracy (default: 5)
python3 scan.py ./src --triage-rounds 7
結果は ~/nano-analyzer-results/<timestamp>/(または --output-dir)に保存されます:
<timestamp>/
├── summary.json # 機械可読なスキャンサマリー
├── summary.md # 人間可読なスキャンサマリー
├── <filename>.md # ファイルごとの生のスキャナー出力
├── <filename>.context.md # ファイルごとのコンテキスト概要
├── <filename>.json # ファイルごとの完全な結果データ
├── triages/ # 詳細なトリアージ推論
│ └── T0001_<file>_<title>.md
├── findings/ # トリアージを通過した検出結果
│ └── VULN-001_<file>.md
├── triage.json # すべてのトリアージ判定
└── triage_survivors.md # 検証済み検出結果のサマリー
スキャンで中程度以上の深刻度の問題が見つかると、トリアージパイプラインが起動します:
懐疑的なレビュアーが実際のコードに対して検出結果を検証し、主張された防御策を確認または反駁するために コードベースをgrep できます。
これは複数ラウンド(デフォルト:5)繰り返され、各レビュアーは以前の議論を参照し、古い論点を繰り返すのではなく 新しい 証拠を見つけることが奨励されます。
最終的な 裁定者 が全ラウンドを読み、VALID/INVALID の判断を下します。
信頼度スコア(例:80% [VVIVV→V])は、VALIDと判断したラウンドの割合を反映しています。
トリアージを通過した検出結果は、完全な推論チェーンとともに findings/ ディレクトリに書き込まれます。
このツールは研究プロトタイプです。専門的なセキュリティ監査、手動コードレビュー、確立された静的解析ツールの代わりにはなりません。これだけを唯一のセキュリティ評価として頼らないでください。自己責任で使用してください。
Apache License 2.0
| フラグ | デフォルト | 説明 |
|---|
path | (必須) | スキャンするファイルまたはディレクトリ |
--model | gpt-5.4-nano | 全ステージ(コンテキスト、スキャン、トリアージ)のモデル |
--parallel | 50 | 同時スキャンAPI呼び出しの最大数 |
--triage-threshold | medium | この深刻度以上をトリアージ |
--triage-rounds | 5 | 検出結果あたりのトリアージラウンド数 |
--triage-parallel | 50 | 同時トリアージAPI呼び出しの最大数 |
--max-connections | parallel + triage-parallel | API呼び出しの総上限 |
--min-confidence | 0.0 | この信頼度(0.0~1.0)以上の検出結果のみ表示 |
--project | ディレクトリ名 | トリアージプロンプトで使用するプロジェクト名 |
--repo-dir | auto | grep検索のリポジトリルート(auto:ファイルの親ディレクトリ、フォルダの場合はスキャンディレクトリ) |
--output-dir | ~/nano-analyzer-results/<timestamp>/ | 結果の保存先 |
--max-chars | 200,000 | これより大きいファイルはスキップ |
--verbose-triage | off | ラウンドごとのトリアージ進捗を表示 |