
Diffセキュリティスキャナは変更の影響を見逃します。Zairoはその影響を見つけ出し、脆弱性を探します。 Zairoはコード内で変更された箇所をコンテキスト付きでスキャンし、確認用のサブグラフを作成し、選択したLLMを使用して脆弱性を発見します。

pipx install zairo
# まだコミットしていない変更をスキャン
zairo .
# PR/ブランチの差分をスキャン
zairo . --base main --target HEAD
# 高重大度のものが見つかった場合にビルドを失敗させる
zairo . --base main --target HEAD --fail-on high
複数のリポジトリを追加引数として、または--repos-fileに1行に1つずつ指定すると(両方指定した場合は1つのリストに統合されます)、自動的にマルチリポジトリモードに切り替わります。各リポジトリは個別のレポートに加え、1つの統合サマリーも生成されます。
zairo backend frontend infra --base main --fail-on high -o zairo_multi_out
--base/--target(およびその他のすべてのオプション)はリスト内のすべてのリポジトリに同じように適用されるため、マルチリポジトリモードはすべてが同じ対象(例:全員のmain)に対して差分を取る場合に最適です。規約が異なるリポジトリは個別に実行する必要があります。
スキャン対象
--base, -b (なし): 差分の基準となるref。例:mainやHEAD~3。省略した場合、zairoは未コミットの変更をスキャンします。--target, -t (なし): 差分の対象となるref。--baseが必要です。省略した場合(--baseが設定されている場合)、作業ツリーとの差分を取ります。--depth, -d (1): 各変更の周囲のインパクトグラフに取り込む呼び出し元/呼び出し先のホップ数。--language, -l (auto): Trailmarkの自動検出に任せず、言語を強制指定します。LLMスキャン
--graph-only (オフ): 脆弱性スキャンをスキップし、インパクトグラフの構築のみ行います。検出結果やreport.sarifは生成されません。--model (gemini/gemini-2.5-pro): 任意のLiteLLMモデル文字列。--concurrency, -c (5): 1つのリポジトリのスキャン内での並列LLMリクエスト数。--batch-size (1): この数のノードを1つのLLMリクエストにグループ化します(ノードごとに1回の呼び出しではなく)。リクエスト数が減り(プロバイダーのレート制限に役立ちます)、代わりに障害分離が共有されます。不正/不正形式のレスポンスは、そのバッチ内のすべてのノードを失敗させます(1つだけではありません)。キャッシュはどちらの場合もノード単位で維持されます。--max-tokens (4096): リクエストごとの出力予算。推論モデルは内部思考にもこれを消費するため、空のレスポンスが見られる場合は増やしてください。--cache / --no-cache (キャッシュオン): 前回の実行以降に変更されていないコードの再スキャンをスキップします(<output>/.llm_cache.json内のコンテンツハッシュでキャッシュ)。--tokens : スキャンが実際に使用したトークン数を表示します(キャッシュヒットは呼び出しを行わないためカウントされません)。出力とゲーティング
--output, -o (zairo_out): レポートの出力先。マルチリポジトリモード:各リポジトリは独自の<output>/<repo-slug>/に加え、ここに統合されたrollup.*も生成されます。--fail-on (なし): この重大度以上の検出結果が見つかった場合に非ゼロで終了します(low/medium/high/critical)。--graph-onlyと組み合わせるとエラーになります(ゲーティング対象がありません)。マルチリポジトリモード:全リポジトリを統合してチェックされます。CI / PRゲーティングを参照してください。--verbose, -v (オフ): 実行内容をステップごとに表示します(gitコマンド、ワークツリーのセットアップ、ノードごとのスキャン進捗)。--debug, : が表示するすべてに加え、LLMに送信された正確なプロンプトと各ノードの生のレスポンスを表示します。コンソールに表示するには多すぎるため、に書き込まれます(マルチリポジトリモードではリポジトリごと)。マルチリポジトリモードのみ
--repos-file (なし): 1行に1つのリポジトリパス(#コメント可)。直接指定されたリポジトリと統合されます。--repo-concurrency (1): 同時にスキャンするリポジトリ数。進行中のLLMリクエストの合計は--concurrency × --repo-concurrencyに達する可能性があるため、プロバイダーのレート制限に注意してください。1より大きい場合、進捗はライブのステップバイステップ詳細ではなく、完了時にリポジトリごとに1行のサマリーを表示します。--continue-on-error / --stop-on-error (continue): 1つのリポジトリが失敗した場合に、リストの残りをスキャンし続けるか、停止するかを指定します。どちらの場合も、失敗したリポジトリは全体の終了コードを失敗させます。この同じリストはいつでもCLIからzairo --helpで確認できます。
report.json (常に): 生のインパクトグラフ(ノード、エッジ、および添付された検出結果)をデータとして出力。report.html (常に): 自己完結型のインタラクティブな依存関係グラフビューア(Cytoscape.js)。ノードをクリックすると検出結果を確認できます。report.sarif (--graph-only使用時を除く): SARIF 2.1.0形式の検出結果。GitHubコードスキャニングやその他のSARIFコンシューマー向け。クリーンスキャンでも常に書き込まれます(空だが有効なログ)。これにより、スキャンUIは以前に報告されたアラートを解決済みとしてマークできます。モデルがCWEをタグ付けした場合、検出結果はCWEごとにルールにグループ化されるため、同じ種類の再発する問題は、表現のバリエーションごとに新しいルールを作成するのではなく、1つのルールにまとめられます。マルチリポジトリモードでは、リポジトリごとに同じ3つのファイルに加え、rollup.json / rollup.html / rollup.sarifが生成されます。リポジトリごとのステータスと重大度カウント、各リポジトリのレポートへのリンクを含むダッシュボードテーブル、およびすべてのリポジトリのSARIF結果を1つのマルチランログに統合したものが含まれます。
完全に削除された(編集だけでなく)関数/クラス/モジュールは、ステータスdeletedとしてreport.htmlに引き続き表示されます。破線のフェードしたノードで、以前存在した場所を示します。Trailmarkのグラフはこれを単独では表現できません(現在のツリーのみを常に反映するため)。そのためzairoは削除を個別に検出します。--base(または--baseが指定されていない場合はHEAD)時点で存在していた変更ファイルも解析し、2つのシンボルセットを差分します。削除された関数はLLMスキャナーに送信されることはありません(スキャン対象のライブコードが残っていないため)。そのため、名前、種類、以前の場所のみが含まれ、検出結果は含まれません。
--fail-on <low|medium|high|critical>は、その重大度以上の検出結果が見つかった場合に非ゼロで終了します(マルチリポジトリモードでは全リポジトリを統合して)。これにより、CIステップがマージをブロックできます。知っておくべき点がいくつかあります:
--graph-onlyと組み合わせるとエラーになります(ゲーティング対象がありません)。zairo . --base "$BASE_REF" --target HEAD --fail-on high -o zairo_out
完全なPRスキャンワークフローについては、examples/github-actions/zairo-pr-scan.ymlを参照してください。PR差分でzairoを実行し、report.sarifをGitHubのコードスキャニングにアップロードし、ゲートが失敗した場合にジョブを失敗させます。
-vv--verbose<output>/debug.log