今日の優良食堂
実際に入れて動かして書いた、今日の一膳
ギット飯が代わりに導入・実行・コードまで確かめました
今日の優良食堂 · ギット飯が代わりに導入・分析

projectdiscovery/nuclei

YAML ベースのテンプレートを使った高速脆弱性スキャナー

手元のCI/CDパイプラインに`nuclei`を組み込むだけで、YAMLテンプレート1つを書き足す作業が、そのまま脆弱性の回帰テストになります。TCP・DNS・HTTP・SSLなど複数プロトコルを並列処理とリクエストクラスタリングで一気にスキャンするので、侵入テスト中に見つけた脆弱性をその場で検証する感覚が味わえます。数千人のセキュリティ専門家が育てた最新CVEテンプレート群が標準で付いてくるため、外部攻撃対象を継続的に監視しながら、誤検知に振り回されずに新規の脅威を見つけ出す体験を、今日から自分の環境で試したくなります。

01 / 概要
何をするものか一文で言うと
ひとことでYAML ベースのテンプレートを使った高速脆弱性スキャナー

Nucleiは、YAMLベースの独自DSLでテンプレートを書いてHTTP、DNS、ネットワーク、ヘッドレスブラウザなど複数プロトコルに対して脆弱性検査を実行するスキャナーです。ProjectDiscoveryが開発し、コミュニティが提供する大量のテンプレートを使って既知のCVEや設定不備を検出します。CLIバイナリのほか、Go向けSDK(examples/以下)やHTTP API(internal/httpapi、internal/server)としても組み込めます。

02 / 構造
どう動くのか中核のしくみ
読み方動きの流れを図と一緒にほどきました。

コアはcmd/nuclei/main.goから起動し、internal/runner/runner.goがオプション解析・ターゲット読み込み・テンプレート読み込みを統括します。テンプレートはpkg/templatesのスキーマ(cmd/docgen/docgen.goがJSON Schemaを自動生成)に基づき、リクエスト定義・マッチャー・抽出子を持つYAMLとして扱われ、DSL(github.com/projectdiscovery/dsl)で条件式や変数展開を評価します。実行時にはHTTP・DNS・ネットワーク・ヘッドレス(go-rod)・JavaScript(goja)など複数プロトコルのエグゼキューターがテンプレートを解釈し、対象ホストへリクエストを送信して応答をマッチャーで判定します。cmd/generate-checksum/main.goはテンプレートディレクトリのSHA1一覧を作り、更新検知や整合性チェックに使われます。internal/serverとinternal/httpapiはスキャン結果をワーカーキュー経由でHTTP経由に公開する仕組みを提供し、internal/pdcpはProjectDiscovery Cloud Platformとの連携用ライターです。テストは internal/tests/integration と internal/tests/functional に大量に用意され、実バイナリを起動して各プロトコル・DSL・フロー(条件分岐スキャン)を検証しています。

03 / 体験
入れるとこんな体験になりますギット飯が実際にたどった順序
所要ギット飯が実際に導入・実行しながらたどった順序です。
  1. STEP 01

    `go install`または`make build`でnucleiバイナリを作成すると、cmd/nuclei/main.goがエントリポイントとしてビルドされます。

  2. STEP 02

    初回実行時にinternal/runner/templates.goのロジックによってnuclei-templatesリポジトリが自動ダウンロードされ、~/.config配下などにテンプレート群が展開されるのを確認できます。

  3. STEP 03

    `nuclei -u https://example.com -t <template>`のようにターゲットとテンプレートを指定すると、internal/runner/runner.goが読み込みからスキャン実行までを一括で行い、ターミナルに検出結果が色付きで表示されます。

  4. STEP 04

    `-jsonl`や`-o`などのフラグを付けるとinternal/pdcpやexporter系のコードが結果をファイルやクラウドへ書き出す挙動を確認できます。

  5. STEP 05

    internal/tests/integrationのテストを`go test`で回すと、DSL式やフロー(条件分岐)テンプレートが実際にどう解釈されるかをtestdata配下のYAMLファイルで確認できます。

  6. STEP 06

    Dockerイメージをビルドすると、Dockerfileの通りchromiumが同梱されるためヘッドレスプロトコルのテンプレートも動作させられます。

04 / 成果物
何が手に入るのか導入後に手元に残るもの

手元では、指定したターゲットに対して選んだテンプレート群がマッチした場合にその脆弱性名・重要度・マッチ箇所を含む結果行が得られます。JSON出力を選べば構造化データとして扱えるほか、helm/以下のChartを使えばKubernetes上でinteractsh連携込みの定期スキャン(cronジョブ)としても運用できます。SDKとして使う場合はexamples/simple、examples/advancedのコードがGoプログラムへの組み込み例を示しています。

05 / 注意
ここは先に知っておいてください先に知っておくとよいこと
正直なところ誰にでも合うとは言いにくいところです。
01

go.modが`go 1.26.0`という将来的なバージョンを要求しており、実際のビルド環境で対応するGoツールチェインが必要になる可能性があります。

02

依存パッケージが非常に多く(AWS SDK、ヘッドレスブラウザ、Kerberos関連ライブラリなど)、ビルド時間やバイナリサイズが大きくなることが予想されます。

03

functional_test.goにあるように、機能テストの一部はCI環境変数やリリース済みバイナリの存在を前提としており、ローカルでそのまま全テストが動くわけではありません。

04

スキャン対象への実際のリクエスト送信を伴うツールのため、許可されていない対象に対して実行すると法的・倫理的リスクが伴います。

06 / 結論
ギット飯の結論食べてみる価値のある一膳か
ギット飯の最終判断優良食堂

CVEスキャンや資産の脆弱性診断をYAMLテンプレートで柔軟に自動化したいセキュリティエンジニアやペンテスターに向いています。README、Dockerfile、go.mod、内部のrunner・server・testsのコード構成から、CLIツールとSDKとサーバー機能を兼ね備えた実装であることが読み取れます。ただし依存関係の規模やGoバージョン要件、CI前提のテスト構成から、実際の導入には相応のビルド・運用コストがかかる点は留意すべきです。

今日の残りの一膳
SUBSCRIBER LIBRARY
これまでに検証した優良食堂を一堂に

4 つの関門を通った優良食堂がすべてバックナンバーに集まっています。いちばん新しい一膳はどなたでも無料で読め、それより前の優良食堂の検証の根拠・詳しい解説は ギット飯 プレミアムのご購読ですでに開いています。

優良食堂バックナンバー →
リポジトリ詳細🧪 ひと言で味見する