Claude CodeにNightVisionプラグインを入れてDAST診断を回す
NightVisionの公式プラグインをClaude Codeに入れ、スキャン設定・結果のトリアージ・CI組み込みを自然文で任せる手順と、完了条件を守らせる仕組みをまとめます。
NightVisionのプラグインをClaude Codeに入れると、DASTスキャンの設定、結果のトリアージ、CIへの組み込みを自然文で頼めるようになります。入れ方は2コマンドです。難所はその先にあります。スキャンを最後まで回させる仕組みと、どの資料のどの記述を信じるかです。
DAST(Dynamic Application Security Testing)は、動いているアプリにリクエストを送って脆弱性を探す手法です。コードを読む静的解析とは見る対象が違います。NightVisionはこのDASTとAPI探索を扱う開発者向けのプラットフォームで、公式プラグインはClaude Code向けのマーケットプレイスに公開されています。
インストール: マーケットプレイス追加から有効化まで
プラグインの提供元リポジトリが示す手順は、マーケットプレイスの追加、プラグインのインストール、Claude Codeの起動の3段階です。
claude plugin marketplace add nvsecurity/claude-marketplace
claude plugin install nightvision@nvsecurity
claudeセッションの中で済ませたいときは、スラッシュコマンドで同じことができます。
/plugin marketplace add nvsecurity/claude-marketplace
/plugin install nightvision@nvsecurity提供元のREADMEには、プラグインを読み込むためにClaude Codeの再起動が必要な場合があると書かれています。起動中のセッションで入れたなら、/reload-plugins で反映する方法もあります。Claude Codeのプラグイン手引きによると、プラグインは次回起動時か /reload-plugins の実行時に読み込まれます。
マーケットプレイスを先に追加せず、ソース指定でまとめて入れる書き方もあります。
claude plugin install nightvision --marketplace nvsecurity/claude-marketplaceこの --marketplace 付きの形はClaude Code v2.1.292以降が条件で、手引きによれば、未登録のマーケットプレイスは確認なしで追加されます。組織のポリシーによる制限は marketplace add と同じ検査を通ります。READMEの2コマンドで足りるなら、そちらが読みやすいでしょう。
入れたあとに「packages are not installed」のような表示が出たときの切り分けは、「packages are not installed」と出るClaude Codeプラグインの対処にあります。
入れる前に知っておく前提
マーケットプレイスの紹介ページには、使い方としてNightVision CLIのインストールとAPIトークンでの認証が必要と書かれています。プラグインはスキルの束で、スキャンの実行主体はNightVision側です。READMEにはCLIの導入手順が載っていないため、アカウントの用意とCLIの認証はNightVisionのドキュメントで進めることになります。
紹介ページの表示では、このプラグインのインストール数は2,064です。作成元の表記は「NightVision Engineering」です。
6つのスキルが受け持つ範囲
READMEのスキル一覧は6つです。同じ内容をスラッシュコマンドで直接呼ぶこともできます。
| スキル | 受け持つ作業 | 呼び出し |
|---|---|---|
| app-security-scan | 受け持つ作業ローカル・社内・ステージングのアプリに対するDAST一式。事前確認からスキャン開始、状況確認、結果の要約、SARIF/CSV出力、マニフェスト書き出しまで | 呼び出し/app-security-scan |
| scan-configuration | 受け持つ作業ターゲット作成、認証設定、プロジェクト管理、スコープ除外、プライベートネットワーク向けの準備 | 呼び出し/scan-configuration |
| scan-triage | 受け持つ作業SARIF/CSVの読み取り、該当コードの特定、curlでの再現確認、重大度順の整理、修正案、誤検知の印付け | 呼び出し/scan-triage |
| scan-report | 受け持つ作業経営層向け要約と開発者向け詳細を持つPDFレポートの生成 | 呼び出し/scan-report |
| source-intelligence | 受け持つ作業ソースコードからのOpenAPI仕様の抽出、バージョン間の比較 | 呼び出し/source-intelligence |
| ci-cd-integration | 受け持つ作業GitHub Actions、GitLab CI、Azure DevOps、Jenkins、BitBucket、JFrogへの組み込み | 呼び出し/ci-cd-integration |
Claude Codeは、プラグインのコンポーネントをプラグイン名で名前空間化します。たとえば deploy-tools というプラグインのエージェント reviewer は deploy-tools:reviewer として現れます。NightVisionのスキルも、/plugin の画面や補完で nightvision: 付きの名前になっていることがあります。READMEの短い呼び名で通らないときは、補完候補の名前を使ってください。
紹介ページとREADMEで食い違う点
NightVisionの資料は2か所で内容が揃っていません。
- 紹介ページはスキルを「4つの中核スキル」と説明し、API探索を
/api-discoveryで呼ぶと書いています - READMEは6つのスキルを挙げ、
/api-discoveryを/source-intelligenceの旧名としています。旧名もまだ動くという記述です
READMEのディレクトリ構成には api-discovery と source-intelligence の両フォルダが並んでいます。READMEは旧名でも呼べると書いているので、紹介ページの /api-discovery もそのまま使えます。
紹介ページの4つには app-security-scan と scan-report が入っていません。スキル数を数えるときは、プラグインを入れたあとに /plugin の画面で実際の一覧を見るのが確実です。読み込みコストの測り方は、claude plugin detailsでプラグインのコンテキスト消費を測るで扱っています。
自然文で頼む: 最初の3つの依頼
READMEの使用例は、どれも自然文です。
Set up a NightVision scan for my API running on localhost:8080
Triage the results from my last scan and suggest fixes
Add NightVision to my GitHub Actions workflowREADMEの例は英語です。日本語での依頼がどこまで通るかは、READMEに記載がありません。最初は例文をそのまま使い、狙ったスキルが動くのを確かめてから言い回しを変えると切り分けやすくなります。
スキャンの対象についての記述にも触れておきます。app-security-scan の説明は「local, private, staging, and internal apps」を対象としています。動的テストは稼働中のアプリにリクエストを送る手法なので、自分で管理している環境に向けるのが前提です。
スキャン結果を渡す: SARIFとCSV
scan-triage が読むのはSARIFかCSVです。紹介ページによれば、結果はZAPとNucleiの2つのエンジンから出ます。SQLインジェクション、XSS、SSRFなどの検出について、Code Tracebackの注釈で脆弱なコードの場所を絞り込み、curlコマンドを組んで再現確認し、修正案まで出す流れです。
app-security-scan はスキャン後にSARIFとCSVを書き出せるので、手元に結果ファイルを置いた状態でトリアージを頼めます。ファイルの置き場所はプロジェクトごとに決めておくと、あとで探さずに済みます。
完了条件を守らせる: CLAUDE.mdとStopフックの二段構え
READMEの後半に、組織向けの指示ブロックが載っています。この節が一番の読みどころです。スキャンは頼まないと走りません。そこで「アプリを作ったり大きく変えたら、頼まれなくてもスキャンを走らせる」を完了条件として書いておく、という考え方です。
ブロックの骨子は次のとおりです。
- Webアプリ、API、バックエンド、ルートハンドラを作った・大きく変えたときは、NightVisionのスキャンを仕事の一部として実行する
- アプリを起動して
target_urlに渡す。起動できないなら、その理由を具体的な障害として報告する - スキャンが終端状態になるまで待つか、
wait-for-scanとget-scan-statusで状況を確認し続ける。そのうえで要約とSARIF出力まで進む - 完了とみなすのは、
.nightvision/manifest.jsonにDASTのスキャンIDがあるときか、DASTを止めた障害を明記したときだけ - 共有トークンは使わず、開発者本人のアカウントで認証する
終端状態が FAILED でも有効な検出が含まれることがあります。READMEは、失敗扱いにする前に件数を確認して要約・出力するよう促しています。
置き場所は、Claude Codeなら CLAUDE.md です。READMEには、Claude Codeは AGENTS.md を読まないので、すでに持っているなら CLAUDE.md の中に @AGENTS.md と書いて取り込む、とあります。同じ文面を2か所で保守しないための書き方です。
指示だけでは確実に動かない
READMEはこの限界を自分で認めています。指示ブロックは「ふつうのケースで高い確率で動く」ものであって、毎ターン保証されるものではありません。固く守らせたいときは、ブロックにハーネス側の関門を組み合わせるという案です。例として挙がっているのが、StopフックかCIのチェックです。
Stopフックは、Claudeが応答を終えようとするときに走ります。公式のフック資料によれば、終了コード2で返すと、Claudeは止まらず作業を続けます。標準エラーに書いた文面が、続ける理由として渡されます。
次は、.nightvision/manifest.json が無いかぎり終わらせないフックの例です。READMEの完了条件に沿った形ですが、動作確認はお手元の環境で行ってください。
#!/usr/bin/env bash
# .claude/hooks/require-nightvision-manifest.sh
input=$(cat)
# 停止フックが続行を促した直後は、無限ループを避けて通す
if echo "$input" | grep -q '"stop_hook_active": *true'; then
exit 0
fi
if [ ! -f .nightvision/manifest.json ]; then
echo "NightVisionのDASTスキャンIDが未記録です。スキャンを実行するか、止まった理由を報告してください。" >&2
exit 2
fi
exit 0.claude/settings.json には次のように登録します。
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": ".claude/hooks/require-nightvision-manifest.sh"
}
]
}
]
}
}注意点が2つあります。
落とし穴
アプリを変えていないターンでもスキャンを要求してしまう
このスクリプトはマニフェストの有無しか見ません。ドキュメントを直しただけのターンでも、マニフェストが無ければ続行を促します。対象を絞るなら、git diff --name-only の結果にアプリのソースが含まれるときだけ判定する、といった条件を足してください。
もう1つは上限です。Claude Codeには、停止フックによる連続した続行を8回で打ち切る仕組みがあります。ツールが呼ばれるたびに数え直されます。スキャンの完了待ちで何度も続行を促す設計にすると、ここに当たります。上限を変える環境変数は CLAUDE_CODE_STOP_HOOK_BLOCK_CAP です。
CIで担保する: 手元の取りこぼしを最後に拾う
フックは手元のセッションでしか効きません。Claude Codeを使わない人の変更や、フックを外した環境は拾えません。そこで担当するのが ci-cd-integration です。GitHub ActionsからJFrogまで6つのCIに対応し、SARIFとCSVの出力、APIの破壊的変更の検出を含みます。
役割の分担は次のようになります。
| 層 | 仕組み | 拾えるもの |
|---|---|---|
| 指示 | 仕組みCLAUDE.mdのブロック | 拾えるもの多くのターンで自動的にスキャンが走る |
| フック | 仕組みStopフック | 拾えるものスキャンIDが無いままの終了 |
| CI | 仕組みパイプラインの検査 | 拾えるものClaude Code以外から入る変更 |
3層のうち、READMEが明示しているのは指示とフックまたはCIの組み合わせです。層の割り当て方は、利用する組織の事情で決めてかまいません。
静的解析との使い分け
Claude Code自体にも security-review があります。こちらはコードの差分を読んで脆弱性を探す静的な見方です。NightVisionのスキャンは稼働中のアプリへのリクエストで見つけるので、見える範囲が違います。使い分けの考え方は、security-reviewとCodeQLの違いが参考になります。外部のスキャナーをMCPで繋ぐ構成は、Semgrep MCPでClaude Codeの生成コードを自動セキュリティスキャンするで扱っています。
導入済みプラグインの棚卸しには、claude plugin list --jsonで導入済みプラグインを棚卸しするが使えます。
まとめ
NightVisionのプラグインは、入れること自体は簡単です。差が出るのは、完了条件を CLAUDE.md に書き、.nightvision/manifest.json の有無をフックやCIで確かめるところまで作り込めるかどうかです。
スキル数や呼び出し名が資料によって違う点は、入れたあとの /plugin 画面を正としてください。まずはローカルで動くAPI1本に対して /app-security-scan を回し、SARIFを scan-triage に渡すところまでを試すと、全体の流れがつかめます。