FSV — website security scanner について
FSVは、許可を得たセキュリティ評価向けのウェブサイトスキャナーです。コマンドライン、ダッシュボード、CIステップ、MCPサーバーとして利用でき、DNS乗っ取りリスクや露出したシークレット、脆弱な依存関係などを調べ、検出事項を攻撃経路として関連付けて修正案を示します。
主な機能
- 01DNS、クラウドストレージ、スクリプト、サイト設定のスキャン
- 02検出事項を攻撃経路として関連付け
- 03修正案と修正用設定の生成
- 04継続的なトリアージとスキャン比較
- 05Markdown、JSON、HTML、SARIF、CSV形式のレポート出力
- 06CIベースラインと認可確認への対応
活用シーン
- 01所有するウェブサイトのセキュリティ評価
- 02スキャン結果を確認し、関連する攻撃経路の優先度を判断
- 03新たな検出事項を条件にCIビルドを制御
- 04MCP経由でAIアシスタントに検出結果と修正案を提供
MCP 対応
FSVは、スキャン、簡易チェック、レポート、トリアージ、比較、所有権確認のツールと、`security_review` プロンプトを備えたMCPサーバーを提供します。MCPクライアントから、許可を得た対象の評価と結果の確認に利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
12掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| crawl | boolean | いいえ | |
| depth | integer | いいえ | |
| target | string | はい | |
| cookies | any | いいえ | |
| headers | any | いいえ | |
| modules | any | いいえ | |
| profile | string | いいえ | |
| max_urls | integer | いいえ | |
| seed_urls | any | いいえ | |
| authorized | boolean | はい | |
| max_minutes | integer | いいえ | |
| use_ct_logs | boolean | いいえ | |
| exclude_paths | any | いいえ | |
| allow_external | boolean | いいえ |
詳細
誰も監視していない問題を見つけるウェブセキュリティスキャナー — DNS の設定不備やサブドメイン乗っ取り、孤立したクラウドバケット、侵害されたスクリプト CDN、期限切れの SPF include、オンのままのデバッグモード、JavaScript 内のシークレット、サポート終了ソフトウェア、そして小さな検出事項を実際の侵害につなげる攻撃経路を検出します。
CLI、ダッシュボード、AI エージェント向けのMCP サーバー、CI ステップとして動作します。
30 秒で MCP に接続 · 動作を見る · 検出できるもの · 攻撃経路 · インストール · 使い方 · CI · FSV と ZAP · 制限事項 · ドキュメント · お問い合わせ
⚠ 許可された利用のみ
FSV はセキュリティ評価ツールです。所有するシステム、またはテストすることを書面で明示的に許可されたシステムに対してのみ使用してください。許可なくシステムをスキャンすることは、ほとんどの法域で違法です。すべてのエントリーポイント(ウェブ、CLI、MCP、CI)で許可の確認が必要です。また、共有環境へのデプロイでは、ペイロードを送信する前に、対象を管理している証明を追加で求めることができます(docs/DEPLOYMENT.md)。
AI アシスタントを30秒で接続
Claude、Cursor、または VS Code を FSV に接続し、あなたのサイトをレビューするよう依頼します。アシスタントが認証を確認し、パッシブチェックを実行してからフルスキャンを行い、攻撃経路を優先して提示し、そのまま貼り付けられる修正方法を示します。
pip install fsv
fsv mcp-config --client claude-code # prints: claude mcp add fsv -- /path/to/fsv-mcp
fsv mcp-config --client claude-desktop # or cursor · vscode — prints the JSON to paste
インストールは不要です。uv を使って、任意の MCP クライアントを uvx fsv mcp に接続します({ "command": "uvx", "args": ["fsv", "mcp"] })。FSV は
公式 MCP レジストリに io.github.twayst0/fsv として掲載されています。
続いて、アシスタントに次のように指示します:「https://my-shop.example で security_review プロンプトを使ってください。ここは私が所有しています。」
MCP ツールとプロンプト
| ツール | 目的 |
|---|---|
fsv_scan | フルスキャン — プロファイル、スコープ、時間制限、seed_urls。テストアカウントを使った認証済みスキャンでは headers / cookies を指定 |
fsv_quick_check / fsv_waf_check | パッシブなセキュリティ状況のチェック / WAF-CDN 検出 |
fsv_fixes | そのまま貼り付けられる nginx / apache / caddy / express / DNS の修正方法 |
fsv_get_report | md · json · html · sarif · csv · fix-* |
fsv_triage | 誤検知 / 承認済み / 修正済みとしてマーク(ホストごとに保持) |
fsv_compare_scans · fsv_target_trend | 修正前後の比較 · 時間経過に伴うリスク |
fsv_verify_ownership | 共有デプロイメント向けの管理権限の証明(DNS TXT または HTTP ファイル) |
fsv_list_scans · fsv_scan_stats · fsv_list_modules | 履歴 · リクエスト統計 · カタログ |
プロンプト security_review(target, server) — 上記の、ガイド付きで認証を最優先するワークフローです。
スキャン結果には attack_paths セクションが含まれるため、エージェントは重要な内容を優先して提示します。サーバーは stdio 経由でエンドツーエンドのテストを受けています(tests/test_mcp_stdio.py)。
動作を確認する
この出力は実際のものです。このリポジトリに含まれる、意図的に脆弱なデモサイトをスキャンした結果です。1分で再現できます:
python examples/demo_site.py & # http://127.0.0.1:8961 — loopback only, fake secrets
fsv scan http://127.0.0.1:8961 --authorize
fsv web # open the same scan in the dashboard
cloud_storage チェックでは、デモ用バケットが存在するか Amazon S3 に問い合わせます。このリクエストは1回だけで、AWS への読み取り専用アクセスです。--no-external を使うとスキップできます。
チェックリストでは見つからない問題
多くのツールは、ヘッダーが欠けていることを教えてくれます。しかし、非常に適切に運営されている組織でさえ、実際に大きな被害をもたらすインシデントは、もっと目立たず、誰も見ていないところで起こります。
| 問題 | FSVが誤検知を避ける方法 | モジュール | |
|---|---|---|---|
| 🪝 | プロジェクト終了後もDNSレコードが残っている — 誰でもその名前を取得し、あなたのドメインからコンテンツを配信できます | CNAMEを明示的に確認します(Aレコードの検索では宙ぶらりんのエイリアスが見えません)。チェーンをたどり、リゾルバーのエラーを「宙ぶらりん」と判断することはありません | takeover |
| 🪣 | ページがすでに存在しないバケットからスクリプトを読み込んでいる — そのバケットを作成した人がページを制御できます | max-keys=1 のリクエストを1回送信します。オブジェクトは取得せず、何も作成しません | cloud_storage |
| ✉️ | 期限切れドメインのSPF include:、SPFの10回のルックアップ上限超過、512ビットのDKIMキー | ドメイン自体が名前解決できない場合は、説明を添えてDNSチェックをすべてスキップします | dns_security |
| 🗺️ | すべての訪問者に配信されるソースマップとハードコードされた認証情報 | 認証情報はマスクして報告し、テストすることはありません | js_analysis |
| 🧱 | サポート終了後のjQuery 3.3.1 / AngularJS 1.x / Vue 2とPHP 8.1 | 日付に基づくテーブルで、サポート終了日に警告します。バージョンはサードパーティのファイルをダウンロードせず、URLから読み取ります | js_libs · tech |
| ⛓️ | XSS + HttpOnly属性のないセッションCookie = アカウント乗っ取り | すべてのリンクがこのスキャンで見つかったチェーンのみを表示します | correlation |
詳細と、すべての誤検知防止策については、**docs/DETECTIONS.md**をご覧ください。
攻撃経路
実際の侵害が単一のバグで起こることはまれです。たいていは、2つか3つの「中程度」の問題が重なって発生します。スキャナーはそれぞれを個別に評価するため、インシデント報告書が書かれるまで、その組み合わせは見えません。FSVは自らの検出結果だけを読み取り、それ以外の情報は送信しません。実際にチェーンが存在する場合は、各リンクに名前を付け、手順を追って経緯を説明し、チェーンを断ち切る最小コストの単一の修正を示す検出結果を追加します。リンクがトリアージで除外されると、チェーンも自動的に表示されなくなります。
| チェーン | 組み合わさると危険性が高まる理由 |
|---|---|
| XSS + HttpOnly属性のないセッションCookie | 細工されたリンク1つでアカウントを乗っ取られます |
| HSTSなし/HTTPSなし + Secure属性のないセッションCookie | 悪意のあるネットワーク上では、どこからでもセッションを読み取られます |
| 乗っ取り可能なサブドメイン + 親ドメインにスコープされたセッションCookie | サブドメインを取得した人が、ユーザーのセッションを受け取ります |
| 宙ぶらりんのSPF include + DMARCが強制されていない | あなたのドメインを使った、完全に認証済みのフィッシングが可能になります |
| SPF/DMARCによる強制が一切ない | あなたのドメインになりすまされる可能性があります |
ダッシュボード
ライブ進捗表示(ページを再読み込みしても維持)、攻撃経路パネル、OWASPの内訳、ホストごとのリスク傾向、インラインでのトリアージ、モジュール選択、スキャン比較、ワンクリックでのエクスポートを備えたリキッドグラスUI — レポートのほか、貼り付けてすぐ使える修正案も出力できます。
機能
- まずページを見つけます — リンクに加えて、robots.txt、サイトマップ、デバッグページから漏えいしたルート、JavaScript内に記載されたAPIパスも確認します。アクションのようなパスにはリクエストを送信しません。それ以外の対象には
--seedを指定します。 - README用のバッジ —
fsv badge <scan_id>で、日付入りのグレードバッジ(FSV security | A · 2026-10-25)を作成します。CIから再生成できます。 - 修正パック — 検出結果をnginx / Apache / Caddy / Express / DNSの設定に変換します(
fsv fixes <scan> nginx)。実際に検出された内容だけを対象にし、CSPはレポート専用モードで出力されます。 - CI対応 —
fsv.toml、ベースライン(新しい検出結果のみをゲート対象にします)、--fail-on、GitHubコードスキャン用SARIF、すぐに使えるGitHub Actionを備えています。 - 継続的なトリアージ — 誤検出/許容されたリスク/修正済み/確認済みを、安定したフィンガープリントでホストごとに保存し、後続のスキャンに再適用して、スコアから除外します。任意の2つのスキャンを比較でき、ホストごとの傾向も確認できます。
- 推測ではなく証拠を重視 — 露出チェックでは内容を検証します(
.git/HEADはそれらしい内容である必要があり、すべてに200を返すSPAからは何も検出されません)。各検出結果には、信頼度、CWE、OWASP Top 10(2021)のカテゴリ、影響、修正方法が示されます。 - 失敗を正直に報告 — クラッシュしたモジュールはカウントされ、説明とログが記録されます。応答が一度もなかった対象には、問題なしの評価ではなく、警告が表示されます。
- 設計段階から安全 — シークレットは取得元でマスクされます。クラウドメタデータ/リンクローカルには到達できず、ループバック/RFC 1918はオプションでブロックできます。すべての名前解決とリダイレクトの各段階で適用されます。ダッシュボードにはCSRF/DNSリバインディング対策とトークン認証を備えています。
- 拡張可能 — モジュールは1つのクラスで構成されます。ファイルを
~/.fsv/pluginsに置くか、エントリーポイントパッケージとして配布できます(docs/WRITING_MODULES.md)。JavaScriptライブラリのアドバイザリとEOL日付は独自のものを使用できます。 - 高速かつ適切で、停止しにくい — 非同期エンジン、キャッシュ付き共有HTTPクライアント、リクエストの集約、トークンバケット方式のレート制限、リトライ、サイズ上限、部分結果を保持する時間制限を備えています。応答しないエンドポイントによるコストは、モジュールごとではなくスキャンごとにタイムアウト1回分です。すべてのレスポンス正規表現は線形時間で処理されます。敵対的なローカルサーバー(リダイレクトループ、20 MBの本文、応答停止、あらゆるパスに応答するSPA)を使ってテスト済みです。
- 5種類のレポート形式 — Markdown(OWASPのカテゴリ別)、JSON、単体で動作するHTML、SARIF 2.1、CSV。
- ローカル優先 — 結果はローカルのSQLiteファイルに保存されます。任意のサードパーティへの呼び出しは、DEPLOYMENT.mdに記載されたものだけです。
インストール
pip install fsv # Python 3.11+ · pipx install fsv keeps it isolated
fsv doctor # checks Python, dependencies, DNS, database, plugins
ソースからインストールする場合:git clone https://github.com/twayst0/fsv && cd fsv && ./install.sh(または pip install -e .)。
**Python 3.11+**が必要です。Dockerについてはdocs/DEPLOYMENT.md(docker compose up)を参照してください。
使い方
fsv scan example.com --authorize # full scan of a site you own
fsv scan example.com --authorize --profile passive # read-only: no payloads sent
fsv web # dashboard → http://127.0.0.1:7474
CLIリファレンス
# scope & tuning
fsv scan example.com --authorize --exclude "/admin/*,/logout" --max-urls 100 --max-time 900 --tag prod
fsv scan example.com --authorize --header "Authorization: Bearer X" --cookie "session=abc" # authenticated
fsv scan example.com --authorize --ct-logs # also ask Certificate Transparency (crt.sh) for subdomains*
fsv scan example.com --authorize --no-external # skip modules that contact hosts other than the target
fsv scan example.com --authorize --proxy env # behind a corporate proxy (HTTPS_PROXY); or --proxy http://host:3128
# reports & fixes
fsv scan example.com --authorize -o report.html # .md .json .html .sarif .csv
fsv report <scan_id> --format fix-nginx # or fix-apache fix-caddy fix-express fix-dns
fsv fixes <scan_id> nginx -o nginx-fixes.md
# triage, history, diff
fsv findings <scan_id>
fsv triage <scan_id> <finding_id> false_positive --note "test endpoint"
fsv list --target example.com · fsv diff <before_id> <after_id> · fsv prune --keep 50
# ownership proof (for shared deployments) # * sends the domain name to crt.sh
fsv verify example.com · fsv verify example.com --check
fsv modules · fsv doctor
CIでの使用
# fsv.toml (commit it; ${VAR} is read from the environment — never commit secrets)
[scan]
profile = "balanced"
max_urls = 100
exclude = ["/admin/*"]
max_time = 900
fail_on = "high"
baseline = ".fsv-baseline.json"
[scan.headers]
Authorization = "Bearer ${FSV_API_TOKEN}"
fsv scan staging.example.com --authorize --write-baseline .fsv-baseline.json # once: accept today's state
fsv scan staging.example.com --authorize # every build: fails only on NEW high+ findings
# .github/workflows/security.yml
- uses: twayst0/[email protected] # pin a release tag (or a commit SHA)
with:
target: https://staging.example.com
authorized: "true" # you confirm you may test this target
profile: balanced
fail-on: high
baseline: .fsv-baseline.json
SARIFはGitHubコードスキャンにアップロードされます。HTMLレポートとログはアーティファクトとして添付されます。
FSV と OWASP ZAP
アプリケーションの入力を深くテストするには、ZAP が適したツールです。ぜひ活用してください。FSV はアプリケーションの周辺を調べます。一般的な DAST スキャンでは対象にならない領域を確認できるため、両者は併用するとうまく機能します。
| 領域 | 一般的な DAST スキャン | FSV |
|---|---|---|
| プロジェクト終了後も残っている DNS(宙ぶらりんの CNAME、未登録のターゲット) | 対象外 | takeover |
| ページの読み込み元で、すでに存在しないバケット | 対象外 | cloud_storage |
| 侵害された CDN(polyfill.io 2024)や期限切れドメインからのスクリプト | 対象外 | supply_chain |
| メールのなりすまし:SPF のルックアップ制限、無効な include、DMARC、DKIM の鍵サイズ | 対象外 | dns_security |
| エラーページでしか表示されないデバッグモード(Django、Werkzeug、Ignition…) | 一部 | supply_chain |
| 侵害または放棄された CDN(polyfill.io、bootcdn、staticfile、rawgit)や、登録が解除されたドメインからのスクリプト/スタイル | パッシブ · URL · ↗ | |
debug_mode | ||
| アカウント乗っ取りにつながる複数の中程度の検出結果 | 個別に列挙 | correlation の攻撃経路 |
| サーバー設定としての修正、継続的なトリアージ、CI ベースライン、MCP | — | 組み込み |
| 詳細な入力ファジング、認証済みスパイダー、スクリプトによる認証、JS レンダリングされたアプリ | はい | 基本 |
モジュール(32)
FSV には 32 個のモジュール(パッシブ 26 個、アクティブ 6 個)が付属しています。最新の一覧は fsv modules で確認できます。
全カタログ (または fsv modules を実行)
| モジュール | 検出対象 | 種類 |
|---|---|---|
takeover | 宙ぶらりんの CNAME/未取得の SaaS リソース/未登録のターゲットドメイン | パッシブ · サイト · ↗ |
cloud_storage | サイトが参照する、孤立状態または一般公開されている S3/GCS/Azure バケット | パッシブ · URL · ↗ |
dns_security | SPF(ルックアップ上限 10 回、無効な include、+all)、DMARC、DKIM の鍵強度、MTA-STS、無効な NS/MX、CAA、DNSSEC | パッシブ · サイト |
js_analysis | ハードコードされた認証情報、公開されたソースマップ、クライアントコード内の内部/本番環境以外のホスト | パッシブ · URL |
js_libs | 既知の脆弱性がある JavaScript ライブラリ、およびサポート終了した JavaScript ライブラリ | パッシブ · URL |
supply_chain | 侵害または放棄された CDN(polyfill.io、bootcdn、staticfile、rawgit)や、登録が解除されたドメインからのスクリプト/スタイル | パッシブ · URL · ↗ |
debug_mode | 本番環境でのフレームワークのデバッグモード(Django DEBUG=True、Werkzeug コンソール、Rails、Laravel Ignition、Symfony、Express、ASP.NET)。クローラーが訪問しないエラーページで見つかる場合があります | パッシブ · サイト |
paths | コンテンツを検証する、約 100 個の公開ファイル/エンドポイント(.git、.env、actuator、pprof、tfstate、バックアップなど) | パッシブ · サイト |
tech | スタックのフィンガープリント、および日付付きのテーブルに基づくサポート終了ソフトウェア | パッシブ · サイト |
headers · csp_analyzer | セキュリティヘッダー · 詳細な CSP レビュー | パッシブ |
ssl | HTTPS、証明書の有効性、脆弱なプロトコル/暗号 | パッシブ · サイト |
cookies | Secure/HttpOnly/SameSite/親ドメインのスコープ | パッシブ |
sri · mixed_content · clickjacking · form_security · csrf | ページ単位のセキュリティ対策 | パッシブ |
info_disclosure · dir_listing · http_methods · security_txt · waf_detect · graphql_introspection · jwt_analysis · subdomain | 情報露出と偵察 | パッシブ |
xss · sqli · ssti · open_redirect · cors · host_header_injection | 反射型/エラーベース/マーカーチェック(無害なペイロード) | アクティブ |
↗ はターゲット以外のホストにも接続します(--no-external でスキップ)。passive は、細工したペイロードを送信しないことを意味します。プロファイル: passive(パッシブモジュールのみ)、balanced(デフォルト)、aggressive(高いレート/並列度)。
1 つのエンジンに、4 つの利用窓口があります。アドレスのポリシーと制御の証明はエンジンにあるため、すべての利用窓口で適用されます。リクエストガードとトークン認証は Web サーバーに属します。docs/ARCHITECTURE.md を参照してください。
設定(環境変数)
| 変数 | デフォルト | 用途 |
|---|---|---|
FSV_HOST / FSV_PORT | 127.0.0.1 / 7474 | ダッシュボードのバインドアドレス |
FSV_DB | ~/.fsv/scans.db | SQLite データベース |
FSV_TOKEN | — | すべての API / WebSocket 呼び出しで必要な共有シークレット(X-FSV-Token または ?token=) |
FSV_ALLOWED_HOSTS | — | ダッシュボードが応答する追加の Host 名(DNS リバインディング対策) |
FSV_BLOCK_PRIVATE | off | ループバック / RFC 1918 の対象を拒否します(SSRF 対策)。クラウドメタデータの範囲は常に拒否されます |
FSV_REQUIRE_VERIFICATION | off | 所有者が制御を証明したホストのみを対象に、ペイロードを送信するスキャンを実行します |
FSV_MAX_SCANS | 3 | 同時スキャン数 |
FSV_DISABLED_MODULES | — | 無効にするモジュール名(カンマ区切り) |
FSV_PLUGIN_DIR / FSV_NO_PLUGINS | ~/.fsv/plugins / off | プラグインの検出 |
FSV_ADVISORY_FILE / FSV_EOL_FILE | — | 独自の JS ライブラリアドバイザリ / サポート終了日(JSON) |
制限 — FSV が できないこと
- HTML を読み込みますが、JavaScript は実行しません。そのため、クライアント側のレンダリング後にのみ存在するコンテンツは検出されません。
- アクティブチェックは、一般的な反射型クラスを無害なマーカーで確認します。ペネトレーションテスト、SAST、SCA パイプラインの代替にはなりません。
- JS アドバイザリとサポート終了日のテーブルは、厳選されたスナップショットです。重要な項目については OSV / endoflife.date と照合し、上記のファイルで拡張してください。
- DNS チェックの精度はリゾルバー次第です(
fsv doctorでテストできます)。応答できないリゾルバーでは、誤った DNS 検出結果ではなく、DNS 検出結果が何も出ません。 - 検出結果には信頼度が付与されます。暫定的な結果はヒントです。トリアージを行い、誤検知についてお知らせください。最も役立つバグ報告になります。
ドキュメント
検出項目 · アーキテクチャ · モジュールの作成 · 安全なデプロイ · セキュリティポリシー · コントリビューション · 変更履歴
上記のアニメーション SVG とスクリーンショットは、実際のスキャンから生成されています:scripts/build_readme_assets.sh --screenshots。
お問い合わせ
twayst0 (tways) — 作成者兼メンテナー
- メール:[email protected]
- Discord:.tways
- セキュリティ上の問題:公開 issue ではなく、非公開でご報告ください(SECURITY.md を参照)。
ご質問、協業、ライセンスに関するお問い合わせは、メールまたは Discord で歓迎します。
ライセンス
MIT — 商用利用を含め、誰でも自由に使用、変更、共有できます。著作権表示とライセンス表示は残してください。Copyright © 2026 twayst0。LICENSE を参照してください。
免責事項
本ソフトウェアは「現状有姿」で提供され、合法かつ許可を得たセキュリティテストに限り使用できます。 作成者は、誤用または損害について一切責任を負いません。所有していないシステムをテストする前に、必ず書面による許可を得てください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。