关于 FSV — website security scanner
FSV 是用于授权安全评估的网站扫描器,提供命令行、仪表盘、CI 步骤和 MCP 服务。它检查 DNS 接管风险、暴露的秘密和易受攻击的依赖等问题,并将发现关联为攻击路径,提供修复建议。
主要功能
- 01扫描 DNS、云存储、脚本和网站配置
- 02将发现关联为攻击路径
- 03生成修复建议和修复配置包
- 04提供持久化分类和扫描对比
- 05导出 Markdown、JSON、HTML、SARIF 和 CSV 报告
- 06支持 CI 基线和授权检查
适用场景
- 01评估自有网站的安全问题
- 02审阅扫描结果并确定关联攻击路径的优先级
- 03根据新增发现阻止 CI 构建
- 04通过 MCP 向 AI 助手提供发现结果和修复建议
MCP 相关
FSV 提供 MCP 服务,包含扫描、快速检查、报告、分类、对比和所有权验证工具,以及 `security_review` 提示词。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 | 否 |
详细介绍
用于发现那些无人关注的问题的 Web 安全扫描器 — 悬空 DNS 和子域名接管、孤立的云存储桶、遭入侵的脚本 CDN、已过期的 SPF include、未关闭的调试模式、JavaScript 中的机密信息、已停止维护的软件,以及将小问题演变为真实入侵的攻击路径。
可作为 CLI、仪表盘、供 AI Agent 使用的 MCP 服务和 CI 步骤运行。
30 秒接入 MCP · 查看运行效果 · 可发现的问题 · 攻击路径 · 安装 · 使用方法 · CI · FSV 和 ZAP · 限制 · 文档 · 联系
⚠ 仅限授权使用
FSV 是一种安全评估工具。仅可用于测试你拥有或已获得明确书面授权的系统。在大多数司法管辖区,未经许可扫描系统均属违法。每个入口(Web、CLI、MCP、CI)都要求你确认已获得授权;共享部署还可以要求你提供目标控制权的证明,之后才会发送任何载荷(docs/DEPLOYMENT.md)。
在 30 秒内连接你的 AI 助手
让 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 Registry 中列出,名称为 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 部分,让 Agent 优先展示重要内容。服务器通过 stdio 进行端到端测试
(tests/test_mcp_stdio.py)。
查看实际效果
这些输出都是真的——扫描的是本仓库附带的故意设置为存在漏洞的演示网站。一分钟即可复现:
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 查询演示网站的存储桶是否存在——这一项请求会发送到 AWS(只读)。使用 --no-external 可跳过此检查。
检查清单会漏掉的问题
很多工具会告诉你缺少某个标头。真正会给组织造成损失的事件——包括那些管理非常到位的组织——往往更隐蔽,发生在无人关注的地方。
| 问题 | FSV 如何避免误报 | 模块 | |
|---|---|---|---|
| 🪝 | DNS 记录的存续时间超过了其项目——任何人都可以认领该名称,并通过你的域名提供内容 | 显式查询 CNAME(A 记录查询会隐藏悬空别名),跟踪解析链,并且绝不会将解析器错误视为“悬空” | takeover |
| 🪣 | 页面从一个已不存在的存储桶加载脚本——创建该存储桶的人就能控制你的页面 | 仅发送一次 max-keys=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。
攻击路径
真实的入侵很少由单个漏洞造成——通常是两个或三个“中危”问题相互叠加。扫描器会分别评估每个问题,因此这些问题的组合会一直被忽略,直到有人撰写事件报告。FSV 会读取自身的发现结果(不会额外发送任何内容),并在确实存在攻击链时添加一条发现,列出各个环节、逐步说明攻击过程,并指出能打破攻击链的最省事单项修复措施。如果某个环节被标记为不处理,攻击链也会自动消失。
| 攻击链 | 组合起来为何更危险 |
|---|---|
| XSS + 不带 HttpOnly 的会话 Cookie | 一个精心构造的链接就能导致账户接管 |
| 未启用 HSTS / 未使用 HTTPS + 不带 Secure 的会话 Cookie | 在任何不可信网络上都能读取会话 |
| 可被接管的子域名 + 作用域涵盖父域名的会话 Cookie | 任何认领该子域名的人都能获取你用户的会话 |
| 悬空 SPF include + DMARC 未启用强制执行 | 可利用你的域名发送通过验证的钓鱼邮件 |
| 完全未强制执行 SPF/DMARC | 你的域名可能被伪造 |
仪表板
液态玻璃风格界面,支持实时进度(刷新页面后仍会保留)、攻击路径面板、OWASP 分类、按主机划分的风险趋势、内联分类处理、模块选择器、扫描对比,以及一键导出——可导出报告,也可导出可直接粘贴的修复方案。
功能
- 优先发现页面——除了链接,还会查找 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 code scanning 的 SARIF,以及现成的 GitHub Action。 - 持久化分类处置——可标记为误报 / 接受的风险 / 已修复 / 已确认,按稳定指纹存储在每个主机下,并应用于后续扫描,且不计入评分。比较任意两次扫描;查看每个主机的趋势。
- 依据证据,而非猜测——暴露检查会验证内容(
.git/HEAD必须符合其内容特征;对所有请求都返回 200 的 SPA 不会产生发现结果)。每项发现都包含置信度、CWE、OWASP Top 10(2021)类别、影响和修复建议。 - 如实报告失败——崩溃的模块会被计数、说明并记录;从未响应的目标会被标记,而不会被评为“安全”。
- 从设计上确保安全——在源头屏蔽机密信息;云元数据 / 链路本地地址始终无法访问,并可选择在每次查找和每次重定向时阻止回环地址 / RFC 1918 地址;仪表板具备 CSRF / DNS 重绑定防护和令牌身份验证。
- 可扩展——模块只需一个类;将文件放入
~/.fsv/plugins,或发布入口点包(文档)。也可使用自己的 JS 库安全公告和 EOL 日期。 - 快速、友好且不易被拖垮——异步引擎、带缓存的共享 HTTP 客户端、请求合并、令牌桶速率限制、重试、大小上限、时间限制并返回部分结果。端点挂起时,每次扫描只会产生一次超时,而不是每个模块都超时;每个响应正则表达式都采用线性时间。已针对恶意本地服务进行测试(重定向循环、20 MB 响应体、挂起、兜底 SPA)。
- 五种报告格式——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 code scanning;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 |
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 库 | 被动 · 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(更高的速率/并发数)。
一个引擎,四个入口。地址策略和控制权证明由引擎负责,因此每个入口都具备这些功能;请求防护和令牌身份验证则由 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 发现项,而不是产生错误发现项。 - 发现项带有置信度;暂定发现项只是提示。请对其进行分类处理,并告知我们误报情况——这类反馈最有助于报告 Bug。
文档
检测 · 架构 · 编写模块 · 安全部署 · 安全策略 · 参与贡献 · 更新日志
上方的动画 SVG 和截图由真实扫描生成:scripts/build_readme_assets.sh --screenshots。
联系方式
twayst0 (tways) — 作者和维护者
- 电子邮件:[email protected]
- Discord:.tways
- 安全问题:请私下报告(参见 SECURITY.md),不要在公开问题中披露。
欢迎通过电子邮件或 Discord 联系,交流问题、合作和许可事宜。
许可证
MIT — 任何人均可免费使用、修改和分享,包括用于商业用途。请保留版权和许可声明。Copyright © 2026 twayst0。请参阅 LICENSE。
免责声明
本软件按“原样”提供,仅供合法、经授权的安全测试使用。 作者对误用或造成的损害不承担任何责任。测试任何非自有系统前,请务必取得书面许可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。