
ファイアウォールベンダーを検出し、19の攻撃カテゴリを高度な回避ペイロードでテストし、CLI、Cloudflare Worker、Dockerを介して色分けされたバイパス分析を提供する自動WAF評価ツール。
# WAF Checker
[](https://github.com/SecH0us3/waf-checker/releases)
[](https://github.com/SecH0us3/waf-checker/releases)
[](packages/core)
[](packages/cli)
[]()
このプロジェクトは、Web Application Firewall(WAF)が一般的なWeb攻撃から製品をどれだけ保護できているかを確認するのに役立ちます。Cloudflare Worker(インタラクティブなWeb UIを内蔵)として、またはスタンドアロンのNode.js CLIツールとして実行できます。
## 🧪 テストカバレッジとステータス
すべてのパッケージは、自動化されたユニット、統合、プロパティベース(fast-checkファジング)、ネットワーク耐性、およびリバースエンジニアリングのスイート(100%のSSRF安全性準拠、プロトコル回避手法、レポートフォーマッター)で徹底的にテストされています:
| パッケージ | 行カバレッジ | ステートメント | 関数 | テストスイート |
| :--- | :---: | :---: | :---: | :---: |
| [**`@waf-checker/core`**](https://github.com/sech0us3/waf-checker/blob/main/packages/core) | `93.0%` 🟢 | `92.6%` | `96.4%` | 🟢 282 件成功 |
| [**`@waf-checker/cli`**](https://github.com/sech0us3/waf-checker/blob/main/packages/cli) | `93.5%` 🟢 | `92.8%` | `96.7%` | 🟢 54 件成功 |
| [**`@waf-checker/worker`**](https://github.com/sech0us3/waf-checker/blob/main/packages/worker) | `成功` 🟢 | — | — | 🟢 30 件成功 |
| **モノレポ全体のスイート** | **`93.2%`** | **`92.7%`** | **`96.6%`** | **🟢 366 件のテストが成功** |
## 機能
### コアテスト
- 対象URLを入力し、HTTPメソッド(GET、POSTなど)と攻撃カテゴリを選択します。
- 攻撃ペイロードを含むリクエストを送信します(パラメータ、ヘッダー、またはファイルパスとして)。
- 色分けされたターミナルおよびWebの結果:🟢 403/BLOCKED = ブロック済み、🔴 2xx/5xx = バイパスの可能性、🟠 3xx = リダイレクト。
- 結果はフィルタリング可能なテーブルに表示され、各ペイロードの詳細を確認できます。
### 🕵️ WAFリバースエンジニアリングとCRSマトリックス(`--reverse`)
- **OWASP Core Rule Set(CRS v3/v4)マッピング**:有効なルールIDと無効なルールID(`920xxx`、`921xxx`、`930xxx`、`931xxx`、`932xxx`、`933xxx`、`934xxx`、`941xxx`、`942xxx`、`943xxx`、`944xxx`)を、Paranoiaレベル(PL1-PL4)とともに監査します。
- **検査ボディ制限の検出**:二分探索プロービング(8KB~128KB、精度約1KB)により、バッファ切り捨ての境界を特定します。
- **アノマリースコアリングモードの検出**:協調スコアリングモードと厳格な正規表現ブロッキングモードをプローブし、スコアしきい値を特定します。
- **安全なレート制限プロービング**:最大30 req/sまでの安全なランプアップを行い、HTTP 429を受信すると即座に早期終了し、`Retry-After`を抽出します。
### 🛡️ WAF仮想パッチ適用と自動修復 (`--patch` / `patch` コマンド)
- **即時緩和**: 検出されたWAFバイパス (HTTP 200) を、すぐにデプロイ可能なファイアウォールルール、リバースプロキシ設定、およびInfrastructure-as-Code (Terraform HCL / Cloud CLI) に自動変換します。
- **対応プラットフォーム (11方言)**:
- **Cloudflare WAF**: Wirefilter式 (`http.request.uri.query contains ...` / `matches ...`) および `cloudflare_ruleset` Terraform HCL。
- **AWS WAF v2**: ネイティブJSONルールステートメント (`ByteMatchStatement`、`RegexPatternSet`、`OrStatement`) および `aws_wafv2_rule_group` Terraform HCL。
- **Google Cloud Armor**: CEL式 (`request.path.matches(...)`、`request.headers[...]`)、`gcloud compute security-policies` CLIコマンド、およびTerraform `google_compute_security_policy`。
- **Azure WAF (Front Door & App Gateway)**: カスタムルールJSON定義、`az network front-door waf-policy` CLIコマンド、およびTerraform `azurerm_cdn_frontdoor_firewall_policy`。
- **ModSecurity & OWASP Coraza**: `@pm` トークン折りたたみを伴うOWASP CRS互換の `SecRule` ディレクティブ (SecLang)。`--patch modsecurity` または `--patch coraza` でサポート。
- **NGINX**: ネイティブの `location ~* \.(ext)$ { return 403; }`、`location ~ /\.(git|svn)`、および `map` 設定ブロック。
- **HAProxy**: 高性能なネイティブACL (`path_end -i`、`path_beg -i`、`query -m sub -i`、`req.hdr()`) と `http-request deny deny_status 403`。
- **Caddy Server**: 慣用的なCaddyfile名前付きマッチャー (`@waf_patch_*`) とCEL式 (`expression {http.request.uri.query}.matches(...)`) および `respond 403`。
- **Apache HTTP Server**: `httpd.conf`、`<VirtualHost>`、または `.htaccess` 向けの `mod_rewrite` ルール (`RewriteCond %{QUERY_STRING}` / `%{REQUEST_URI}` / `%{HTTP_USER_AGENT}` + `RewriteRule ^ - [F,L]`)。`--patch apache` でサポート。
- **Envoy Proxy**: route_configuration virtual_host向けに、RE2 `safe_regex` を介して `:path`/ヘッダーにマッチするルートエントリと `direct_response: 403` (またはシミュレートモードでの転送・タグ付け)。`--patch envoy` でサポート。
- **Kubernetes Ingress (K8s)**: `nginx.ingress.kubernetes.io/server-snippet` アノテーションを伴う本番対応の `kind: Ingress` YAMLマニフェスト。
- **二層防御**:
- **厳格なホットフィックス**: 即時のゼロデイインシデント対応のための、**誤検知リスク0%** の正確なトークンシグネチャ。
- **ヒューリスティックパターン**: 脆弱性クラス構造全体をカバーする汎用正規表現。
- **Web UI修復スタジオ**: 全ベンダーにわたるライブプレビュー、ワンクリックのクリップボードコピー、フォーマット切り替え、ファイルエクスポートを備えたインタラクティブなダッシュボードモーダル。
### 攻撃カテゴリ (全28種)
SQLインジェクション、XSS、コマンドインジェクション、パストラバーサル、SSRF、ローカルファイルインクルージョン、機密ファイル、オープンリダイレクト、SSTI、XXE、NoSQLインジェクション、GraphQLインジェクション、JWT攻撃 (ヘッダー)、JWT攻撃 (パラメータ)、プロトタイプ汚染 (JSONボディ)、プロトタイプ汚染 (URL/パラメータ)、LDAPインジェクション、XPathインジェクション、スプレッドシート数式インジェクション、Log4Shell (JNDI)、CRLFインジェクション、HTTPパラメータ汚染、User-Agent、IPバイパス、HTTPリクエストスマグリング、Webキャッシュポイズニング、UTF8/Unicodeバイパス、WAF検査制限バイパス (パディング)。
### WAF検出
- テスト前にWAFタイプを自動検出します (Cloudflare、AWS WAF、OWASP Coraza、BunkerWeb、ModSecurity、Akamai、Imperva、F5 BIG-IPなど)。
- 検出されたWAFに基づいて特定のバイパス手法を提案します。
- WAF固有の高度なペイロードに自動切り替えできます。
### 高度なペイロードとエンコーディング
- WAFバイパスペイロード — ダブルエンコーディング、Unicode、大文字小文字混在、コメントインジェクション、ポリグロットペイロード。
- 拡張ペイロード — 最新の回避手法。
- エンコーディングバリエーション — URL、Unicode、HTMLエンティティ、Hex、Octal、Base64エンコーディングと自動組み合わせ。
- Cloudflare、AWS WAF、ModSecurity向けのWAF固有バイパス。
### HTTPプロトコル操作
- HTTP Verb Tampering — 一般的でないHTTPメソッドをテストします。
- Parameter Pollution — クエリ/ボディ間でパラメータを重複させ、分割します。
- Content-Type Confusion — ルールを回避するために代替のコンテンツタイプを使用します。
- Request Smugglingヘッダー。
- Host Header Injectionのバリエーション。
- ヘッダー経由のHTTPメソッドオーバーライド(`X-HTTP-Method-Override`など)。
### バッチテスト
- 複数のURLを一度にテストします。
- 設定可能な同時実行数とリクエスト間の遅延。
- リアルタイムの進捗追跡。
### 🔀 リグレッション差分(`--compare` / `--fail-on-regression`)
- スキャンを以前に保存したJSONレポートと比較し、**新たなバイパス**(以前はブロックされていたが、現在はブロックされていないもの)、**新たにブロックされた**ペイロード、および追加/削除されたテストを明らかにします。
- *悪化*するWAF体制のみで失敗するCIゲート(`--fail-on-regression`)であり、結果リスト全体では失敗しません — マネージドルールセットのドリフトを検出するのに最適です。
---
## プロジェクト構成
このプロジェクトはNPM Workspacesモノレポとして構成されています:
- [**`packages/core/`**](file:///Users/alex/src/waf-checker/packages/core): コアセキュリティテストライブラリ、ペイロード定義、WAFフィンガープリンティングシグネチャ、および難読化エンコーダー。
- [**`packages/worker/`**](file:///Users/alex/src/waf-checker/packages/worker): 静的HTML/JS Web UIとJSON APIエンドポイントを提供するCloudflare Workerパッケージ。
- [**`packages/cli/`**](file:///Users/alex/src/waf-checker/packages/cli): ターミナルから直接監査を実行するためのNode.jsコマンドラインインターフェースツール。
---
## インストールとビルド
ルートディレクトリから、依存関係をインストールし、すべてのワークスペースをビルドします:
```bash
npm install
npm run build
```
## 実行方法
### 1. Web 版 (Cloudflare Worker)
Worker の開発サーバーをローカルで実行するには (Wrangler が必要):
```bash
npm run dev:worker
```
Web UI は `http://localhost:8787` でアクセスできます(8787 が使用中の場合は別のポートになります)。
Worker を Cloudflare にデプロイするには:
```bash
npx wrangler deploy --workspace=packages/worker
```
Worker には **Workers Paid** プランが必要です。スキャンおよび監査ページは、リクエストあたり 10,000 サブリクエスト向けにサイズ設定されています(`wrangler.toml` の `[limits] subrequests`、`packages/core/src/check.ts` の `WORKER_SUBREQUEST_LIMIT`)。Free プランではリクエストあたり外部サブリクエストが 50 件のみ許可されています。User-Agent バイパステスト(UI ではデフォルトで有効)を伴うスキャンページ 1 つ、またはリダイレクトを追跡する場合、それを超えてしまいます。
### 2. CLI バージョン (Node.js)
#### グローバルな `waf-checker` コマンドとしてインストールする(推奨)
リポジトリのルートで `npm install && npm run build` を実行した後、CLI をリンクして **任意のディレクトリ** から実行できるようにします — リポジトリへの `cd` も、長い `node .../dist` パスも不要です:
```bash
# Expose `waf-checker` on your PATH from the built workspace
npm link --workspace @waf-checker/cli
# …now, from anywhere:
waf-checker --help
waf-checker check https://example.com
# Uninstall later with:
npm rm -g @waf-checker/cli
```
公開パッケージにはコードが同梱されているため、リポジトリなしでパック済みビルドをグローバルにインストールすることもできます: `npm pack --workspace @waf-checker/cli` を実行し、その後 `npm i -g ./waf-checker-cli-*.tgz` を実行します。
#### シェル補完 (bash / zsh / fish)
`waf-checker completion <shell>` は補完スクリプトを出力します (`<shell>` を省略すると `$SHELL` から自動検出されます):
```bash
# bash
waf-checker completion bash | sudo tee /etc/bash_completion.d/waf-checker
# or, without root: echo 'source <(waf-checker completion bash)' >> ~/.bashrc
# zsh (into a directory on your $fpath)
waf-checker completion zsh > "${fpath[1]}/_waf-checker"
# fish
waf-checker completion fish > ~/.config/fish/completions/waf-checker.fish
```
#### グローバルインストールなしでの実行
ビルド済みのエントリポイントを直接呼び出すこともいつでも可能です:
```bash
# Print general CLI help and usage
node packages/cli/dist/index.js --help
# Print check command help (lists all methods, categories, and WAF vendors)
node packages/cli/dist/index.js check --help
# Discover detectable WAF vendors and payload categories (JSON for automation)
node packages/cli/dist/index.js list-wafs --json
node packages/cli/dist/index.js list-categories --json
```
#### WAF検出
対象URLの背後にあるWAFベンダーを検出します:
```bash
node packages/cli/dist/index.js detect <url>
```
#### 脆弱性ペイロード監査
対象URLに対して監査を実行します:
```bash
# Default check (GET method, all payload categories)
node packages/cli/dist/index.js check https://example.com
# Custom check with specific methods, categories, and WAF evasion enabled
node packages/cli/dist/index.js check https://example.com -m GET,POST -c "SQL Injection,XSS" --auto-detect-waf --encoding-variations
```
#### 一括監査
ファイルに定義されたURLのリストに対して一括監査を実行します:
```bash
node packages/cli/dist/index.js batch targets.txt --concurrency 3
```
#### レポートの生成
監査結果を **SARIF**、**JUnit XML**、**HTML**、**Markdown**、**CSV**、または **JSON** 形式で保存します:
```bash
# Generate SARIF report for GitHub Code Scanning
node packages/cli/dist/index.js check https://example.com -o results.sarif
# Generate JUnit XML for CI test reporting (GitHub Actions, GitLab CI, Jenkins)
node packages/cli/dist/index.js check https://example.com -o results.xml
# Generate interactive HTML report
node packages/cli/dist/index.js check https://example.com -o report.html
# Generate Markdown summary for CI
node packages/cli/dist/index.js check https://example.com -o summary.md
```
> レポート形式は出力ファイルの拡張子から推測されるか、`-f, --format`(`json`、`csv`、`html`、`sarif`、`markdown`、`junit`)で明示的に指定します。各攻撃ペイロードは JUnit の `<testcase>` になり、WAF のバイパスは `failure`、トランスポート/サーバーエラーは `error` として報告されるため、CI ランナー上で直接表面化します。
#### CI/CD 統合と保護しきい値
保護率が必要なしきい値を下回る場合、またはバイパスが検出された場合に CI/CD パイプラインを失敗させます:
```bash
# Fail if WAF protection rate is below 95%
node packages/cli/dist/index.js check https://example.com --threshold 95 -q
# Fail immediately on any detected bypass
node packages/cli/dist/index.js check https://example.com --fail-on-bypass -q
```
#### 🔀 リグレッション差分(スキャン対スキャン)
WAFの防御態勢は時間とともに変化します。ベンダーがマネージドルールセットの更新を出したり、CRSルールが無効化されたり、オリジンの変更で判定結果が変わったりします。毎回の実行で結果リスト全体を再トリアージする代わりに、以前に保存したJSONレポートと比較し、*悪化*のみを対象にCIをゲートします。ベースラインレポートで`blocked`だったペイロードがブロックされなくなった場合はリグレッションとみなし、新たにブロックされたペイロードは改善とみなします。照合は`(category, method, evasion technique, payload)`で行い、ネットワークエラーやオリジン側のブロックは判定不能として扱うため、誤ったリグレッションとして現れることはありません。
```bash
# Save a known-good baseline report
node packages/cli/dist/index.js check https://example.com -f json -o baseline.json -q
# Later: diff the current scan against it and print regressions/improvements
node packages/cli/dist/index.js check https://example.com --compare baseline.json -q
# Fail CI only when a previously-blocked payload is no longer blocked
node packages/cli/dist/index.js check https://example.com --compare baseline.json --fail-on-regression -q
```
#### 🛡️ 仮想パッチ適用と自動修復
サポートされている11のプラットフォーム(`cloudflare`、`aws`、`gcp`、`azure`、`modsecurity`、`nginx`、`haproxy`、`caddy`、`apache`、`envoy`、`k8s`、または`all`)すべてに対して、すぐにデプロイ可能なファイアウォールルールを自動生成します:
```bash
# Generate and save Cloudflare Terraform rules during audit
node packages/cli/dist/index.js check https://example.com --patch cloudflare --patch-output ./cloudflare-patch.tf
# Generate GCP Cloud Armor gcloud commands and Terraform
node packages/cli/dist/index.js check https://example.com --patch gcp --patch-output ./cloud-armor.sh
# Generate Azure WAF rules with simulation (Log) mode
node packages/cli/dist/index.js check https://example.com --patch azure --patch-action simulate --patch-output ./azure-rules.json
# Generate HAProxy ACLs for haproxy.cfg
node packages/cli/dist/index.js check https://example.com --patch haproxy --patch-output ./haproxy-patches.cfg
# Generate Caddyfile named matchers
node packages/cli/dist/index.js check https://example.com --patch caddy --patch-output ./patches.caddyfile
# Generate Apache mod_rewrite rules for .htaccess
node packages/cli/dist/index.js check https://example.com --patch apache --patch-output ./patches.htaccess
# Generate Kubernetes Ingress YAML manifests
node packages/cli/dist/index.js check https://example.com --patch k8s --patch-output ./ingress-patch.yaml
# Generate patches for all vendors from a saved JSON audit report file
node packages/cli/dist/index.js patch audit-report.json --waf all --output ./patches/
```
#### 🐳 ローカルDockerおよびステージング環境のテスト (`--allow-local`)
デフォルトでは、`waf-checker` はサーバーサイドリクエストフォージェリ(SSRF)を防ぐため、プライベートIP範囲(`127.0.0.1`、`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`)を厳格にブロックします。自身のローカルDockerコンテナやステージングサーバーをテストする場合は、`--allow-local` を使用してください:
```bash
# Audit a local OWASP ModSecurity Docker container and run reverse engineering
node packages/cli/dist/index.js check http://127.0.0.1:8088/ --allow-local --reverse
# Audit a local Caddy or HAProxy reverse proxy and generate patches
node packages/cli/dist/index.js check http://127.0.0.1:8089/ --allow-local --patch caddy
```
#### 🧪 自動ライブ Docker E2E スイート (`npm run test:e2e`)
ライブ Docker コンテナ(ModSecurity CRS、Caddy、HAProxy、NGINX、および Backend)に対するエンドツーエンドの統合監査を 1 つのコマンドで実行します:
```bash
npm run test:e2e
```
完全な[ローカルWAFテスト&E2E検証ガイド](https://github.com/sech0us3/waf-checker/blob/main/docs/LOCAL_WAF_TESTING.md)を参照してください。詳細なベンチマーク、アーキテクチャ図、手動での再現手順が記載されています。
---
## 🚀 GitHub Action (CI/CD)
自動化されたWAFセキュリティテストをGitHub Actionsワークフローに統合します:
```yaml
name: WAF Security Audit
on:
push:
branches: [ main ]
schedule:
- cron: '0 0 * * 1' # Weekly audit
jobs:
waf-audit:
runs-on: ubuntu-latest
permissions:
security-events: write # Required for SARIF upload
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run WAF Checker
uses: SecH0us3/waf-checker@main
with:
target-url: 'https://staging.example.com'
threshold: '95'
enhanced: 'true'
advanced: 'true'
sarif-output: 'waf-results.sarif'
html-output: 'waf-report.html'
- name: Upload SARIF to GitHub Security Tab
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'waf-results.sarif'
- name: Upload HTML Report Artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: waf-audit-report
path: waf-report.html
```
### 3. Docker バージョン
CLI は Docker を使用して実行できます。GitHub Container Registry からビルド済みイメージをプルするか、ローカルでビルドするかのいずれかの方法があります。
#### ビルド済みイメージの使用(推奨)
ビルド済みの Docker イメージは [GitHub Container Registry](https://github.com/SecH0us3/waf-checker/pkgs/container/waf-checker-cli) の `ghcr.io/sech0us3/waf-checker-cli` で利用可能です。
##### イメージをプルする
```bash
docker pull ghcr.io/sech0us3/waf-checker-cli:latest
```
##### ヘルプを表示
```bash
docker run --rm ghcr.io/sech0us3/waf-checker-cli:latest --help
```
##### チェックを実行する
```bash
docker run --rm -it ghcr.io/sech0us3/waf-checker-cli:latest check https://example.com
```
##### バッチ監査を実行する(ローカルディレクトリをマウント)
```bash
docker run --rm -it -v "$(pwd):/data" ghcr.io/sech0us3/waf-checker-cli:latest batch /data/targets.txt --concurrency 3
```
#### ローカルでのビルド
##### イメージのビルド
```bash
docker build -t waf-checker-cli .
```
##### ヘルプを表示
```bash
docker run --rm waf-checker-cli --help
```
##### チェックを実行する
```bash
docker run --rm -it waf-checker-cli check https://example.com
```
##### バッチ監査を実行する(ローカルディレクトリをマウント)
```bash
docker run --rm -it -v "$(pwd):/data" waf-checker-cli batch /data/targets.txt --concurrency 3
```
---
## 🔌 API & 統合(外部コンシューマーとファザー向け)
Cloudflare Worker は、スキャナーやファザー([swazz](https://github.com/SecH0us3/swazz) を含む)が利用する公開 REST API を提供しています。完全な OpenAPI 3.1 仕様は [`docs/openapi.yaml`](https://github.com/sech0us3/waf-checker/blob/main/docs/openapi.yaml) で入手できます。
### エンドポイント概要
| エンドポイント | メソッド | 説明 |
|---|---|---|
| `/api/waf-detect` | `GET` | WAF ベンダー、信頼スコア、推奨バイパスをフィンガープリントします。 |
| `/api/check` | `GET`, `POST` | 攻撃ペイロードでターゲットをプローブします。ページネーションとカテゴリフィルタリングをサポートします。 |
| `/api/virtual-patch` | `POST` | Cloudflare、AWS、ModSec、NGINX、Caddy、HAProxy、Coraza 向けの修復ルールを生成します。 |
| `/api/reverse-engineer` | `GET`, `POST` | OWASP CRS ルール、異常しきい値、ボディ制限をリバースエンジニアリングします。 |
| `/api/audit` | `GET`, `POST` | **統合監査**: 通常は 1 回のリクエストで検出、セキュリティチェック、仮想パッチを実行します(監査ページングを参照)。 |
### 主要な統合機能
- **ページネーションエンベロープ(`?envelope=1` または `?envelope=true`)**:
結果をページネーションメタデータ付きの構造化エンベロープでラップします:
```json
{
"results": [...],
"page": 0,
"pageSize": 50,
"total": 72,
"hasMore": true
}
```
*(デフォルトのベアJSON配列を後方互換性のために受け取るには、`?envelope=1` を省略してください)。*
- **監査ページング (`/api/audit`)**:
監査は、そのプランが1回のCloudflare Workerリクエストのサブリクエスト予算で許容される量(1658項目)を超えない限り、すべてを1つのレスポンスで返します(`hasMore: false`)。これは、WAFが検出されない場合(513項目)と、SophosまでのすべてのWAFのバイパスバリエーション(1321項目)をカバーします。Qratorで保護されたターゲット(2441項目)は2ページにわたって返され、より小さい `pageSize` を渡した監査も同様です。レスポンスには `page`、`pageSize`、`total`、`hasMore`、`detectedWAF`(見つからなかった場合は `""`)が含まれます。`hasMore` が true の間は、`page=<page + 1>&detectedWAF=<detectedWAF>` をリクエストしてください。`detectedWAF` を返すことで再検出をスキップし(`detection` は `null` になります)、ページ境界を安定させます。`patches` はそのレスポンスの結果をカバーします。複数ページにわたる1つのバンドルについては、結合した `results` を `/api/virtual-patch` に `POST` してください。
- **正規化された信頼度 (`/api/waf-detect`)**:
生の `confidence` と `confidenceThreshold`(`40`)に加えて、`confidencePercent`(0〜100)を提供します。
- **結果ごとの判定とブロックフラグ**:
すべての `AuditResultItem` には以下が含まれます:
- `blocked: boolean` — WAFがオリジンに到達する前に介入したかどうか。
- `verdict: 'blocked' | 'passed' | 'exposed'` — リーク(`exposed`)とカバレッジのギャップ(`passed`)を区別する個別の結果。
- `error: string | null` — ネットワークドロップ時の明示的なエラーカテゴリ(例: `'timeout'`、`'dns'`、`'connection_reset'`)。
- **自己スキャンの拒否 (HTTP 422)**:
サービスインフラを対象とした偶発的な自己スキャンを `{ "error": "self-scan refused", "code": "SELF_SCAN_REFUSED" }` で拒否します。
---
## テスト
ワークスペース全体のテストスイートを実行するには(Vitestを使用):
```bash
npm test
```
[yoursec.substack.com](https://yoursec.substack.com/) で私のブログを読んでください