mcpField
F
FSV — website security scanner

FSV — website security scanner

本地服务
github.com安全5今天更新

关于 FSV — website security scanner

FSV 是用于授权安全评估的网站扫描器,提供命令行、仪表盘、CI 步骤和 MCP 服务。它检查 DNS 接管风险、暴露的秘密和易受攻击的依赖等问题,并将发现关联为攻击路径,提供修复建议。

主要功能

  1. 01扫描 DNS、云存储、脚本和网站配置
  2. 02将发现关联为攻击路径
  3. 03生成修复建议和修复配置包
  4. 04提供持久化分类和扫描对比
  5. 05导出 Markdown、JSON、HTML、SARIF 和 CSV 报告
  6. 06支持 CI 基线和授权检查

适用场景

  1. 01评估自有网站的安全问题
  2. 02审阅扫描结果并确定关联攻击路径的优先级
  3. 03根据新增发现阻止 CI 构建
  4. 04通过 MCP 向 AI 助手提供发现结果和修复建议

MCP 相关

FSV 提供 MCP 服务,包含扫描、快速检查、报告、分类、对比和所有权验证工具,以及 `security_review` 提示词。MCP 客户端可用它评估获准测试的目标并审阅结果。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"twayst0-fsv": {
"command": "uvx",
"args": [
"fsv"
]
}
}
}
启动命令uvx fsv

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypifsv2.3.0

工具

12

收录的工具列表 · 更新于 今天

参数类型必填说明
crawlboolean否
depthinteger否
targetstring是
cookiesany否
headersany否
modulesany否
profilestring否
max_urlsinteger否
seed_urlsany否
authorizedboolean是
max_minutesinteger否
use_ct_logsboolean否
exclude_pathsany否
allow_externalboolean否

详细介绍

FSV — 发现清单遗漏的问题。动画雷达扫描照亮了一个悬空 CNAME、一个孤立的存储桶、一个已失效的 SPF include、一个导致会话被盗的 XSS,以及一个暴露的源映射文件。

CI Python 3.11+ 32 个模块 MCP 服务 仅检测 测试 许可证:MIT

用于发现那些无人关注的问题的 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_reportmd · 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)。

查看实际效果

动画终端回放:fsv 对演示网站进行扫描,输出风险等级 F 100/100、三个严重发现(包括硬编码的 Stripe 密钥和 XSS 攻击路径)、一个孤立存储桶、一个暴露的 actuator 端点,随后 `fsv fixes` 输出 nginx 配置。

这些输出都是真的——扫描的是本仓库附带的故意设置为存在漏洞的演示网站。一分钟即可复现:

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 可跳过此检查。

检查清单会漏掉的问题

很多工具会告诉你缺少某个标头。真正会给组织造成损失的事件——包括那些管理非常到位的组织——往往更隐蔽,发生在无人关注的地方。

六张检测卡片:悬空 DNS 记录、被用作脚本来源的孤立存储桶、包含已不存在域名的 SPF 记录、带有已遮蔽密钥的公开源映射、已到生命周期终点的 PHP 和 jQuery,以及一条 XSS 加非 HttpOnly Cookie 攻击路径。

问题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,导致账户接管。一个“+HttpOnly”标记落在第二个环节上,攻击链变为绿色:链路已断开。

攻击链组合起来为何更危险
XSS + 不带 HttpOnly 的会话 Cookie一个精心构造的链接就能导致账户接管
未启用 HSTS / 未使用 HTTPS + 不带 Secure 的会话 Cookie在任何不可信网络上都能读取会话
可被接管的子域名 + 作用域涵盖父域名的会话 Cookie任何认领该子域名的人都能获取你用户的会话
悬空 SPF include + DMARC 未启用强制执行可利用你的域名发送通过验证的钓鱼邮件
完全未强制执行 SPF/DMARC你的域名可能被伪造

仪表板

扫描演示站点后的 FSV 仪表板:风险等级 F,100/100,各严重级别的问题数量,以及一个逐步说明两条攻击链并分别给出“打破攻击链”建议的攻击路径面板。

OWASP Top 10 分类以及发现列表,其中展开了 Stripe 密钥问题:描述、已遮蔽的证据、修复方法和参考资料。

液态玻璃风格界面,支持实时进度(刷新页面后仍会保留)、攻击路径面板、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_securitySPF(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被动
sslHTTPS、证书有效性、弱协议/加密套件被动 · 站点
cookiesSecure/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(更高的速率/并发数)。

## 工作原理

Pipeline:爬取、32 个模块、按指纹聚合、关联为攻击路径、按主机进行分类处理、生成报告 — CLI、仪表板、MCP Agent 和 GitHub Action 共用。

一个引擎,四个入口。地址策略和控制权证明由引擎负责,因此每个入口都具备这些功能;请求防护和令牌身份验证则由 Web 服务器负责。请参阅 docs/ARCHITECTURE.md。

配置(环境变量)
变量默认值用途
FSV_HOST / FSV_PORT127.0.0.1 / 7474仪表板绑定地址
FSV_DB~/.fsv/scans.dbSQLite 数据库
FSV_TOKEN—每次 API / WebSocket 调用都必须提供的共享密钥(X-FSV-Token 或 ?token=)
FSV_ALLOWED_HOSTS—仪表板响应的额外 Host 名称(DNS 重绑定防护)
FSV_BLOCK_PRIVATEoff拒绝环回地址 / RFC 1918 目标(SSRF 防护)。始终拒绝云元数据地址范围
FSV_REQUIRE_VERIFICATIONoff仅对已证明控制权的主机执行发送载荷的扫描
FSV_MAX_SCANS3并发扫描数
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) — 作者和维护者

欢迎通过电子邮件或 Discord 联系,交流问题、合作和许可事宜。

许可证

MIT — 任何人均可免费使用、修改和分享,包括用于商业用途。请保留版权和许可声明。Copyright © 2026 twayst0。请参阅 LICENSE。

免责声明

本软件按“原样”提供,仅供合法、经授权的安全测试使用。 作者对误用或造成的损害不承担任何责任。测试任何非自有系统前,请务必取得书面许可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。