raccioly/websec-validator
GitHub: raccioly/websec-validator
本地化安全简报工具,为AI代理提供精确的渗透测试指导。
Stars: 1 | Forks: 0
# websec-validator
它不是一个自主扫描器,也不是一个SaaS。它是缺失的前半部分:将仓库转换成一个精确、事实为基础的安全简报的东西,一个AI代理(带有人工智能)可以采取行动——一个自动填充、仓库感知的高级渗透测试员的“这里是要测试什么以及如何测试”的交接版本。它的工作原理以及每个检查背后的推理:[`docs/METHODOLOGY.md`](docs/METHODOLOGY.md).
## 快速入门——只需将其指向您的仓库
**最简单:告诉您的AI代理。** 在Claude Code(或任何编码代理)中,打开您的项目并说:
它安装、运行,并带您查看结果。没有要托管的内容和网站——它是本地的。到达那里的四种方式,都以您的代理采取行动的相同`AGENT-BRIEFING.md`结束:
| 路径 | 单次设置 | 然后 |
|---|---|---|
| **告诉您的代理**(最简单) | — | 说上面的行 |
| **CLI**(终端) | `pipx install websec-validator` | `websec run /path/to/your/app` |
| **Claude Code插件**(斜杠) | `/plugin marketplace add raccioly/websec-validator` → `/plugin install websec-validator@websec-plugins` | 调用**security-pass**技能,或者只是询问 |
| **Docker**(无需安装) | `docker build -t websec-validator .` | `docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/scan" websec-validator run /scan --out /scan/websec-out` |
➡️ **想要了解每个检查背后的推理吗?** 阅读文档**[docs/METHODOLOGY.md](docs/METHODOLOGY.md)**——每个测试做什么以及为什么。
## 安装
```
pipx install websec-validator # from PyPI
brew install noir # OWASP Noir — the route engine (50+ frameworks); regex fallback if absent
websec --version
```
_直到第一个PyPI发布(或对于边缘版本),直接从源安装:_
`pipx install git+https://github.com/raccioly/websec-validator`(或从克隆版:`pipx install .`)。
需要**Python 3.11+**(在标准macOS上,`python3`通常是3.9——使用`pipx`,它选择一个较新的解释器,或者通过Homebrew/pyenv安装)。零Python运行时依赖:它将shell输出到扫描器(Trivy、Gitleaks、Semgrep/OpenGrep、Checkov、Prowler)和Noir(当存在时),报告缺少的内容,并且如果工具不存在,永远不会硬失败。
### 或者通过Docker运行(所有内容捆绑,零安装)
无需安装Noir或任何扫描器——镜像捆绑了所有内容(架构感知,amd64 + arm64):
```
docker build -t websec-validator .
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/scan" websec-validator run /scan --out /scan/websec-out
```
该镜像包含Noir + Trivy + Gitleaks + Semgrep + Checkov;将您的仓库挂载到`/scan`,并将生成的工件放在`/scan/websec-out`。
## 使用
```
websec run ./my-app # ← the one command: recon + stage tailored probes + emit the briefing
websec ./my-app # same thing — a bare path defaults to `run`
websec run ./my-app --scan # …and also execute the available static scanners
websec doctor ./my-app # (optional) which scanners are installed?
```
然后让您的代理指向输出:**“阅读`websec-out/AGENT-BRIEFING.md`并按照它执行。”**
## 它提取的内容(11个确定性的提取器,没有LLM)
| | 维度 | 显著输出 |
|---|---|---|
| stack | 语言、框架、数据存储 | 单一仓库感知(聚合每个清单) |
| routes | 通过**OWASP Noir**的每个端点 | 方法 · 路径 · 类型参数 · 代码路径 |
| auth | 方案 + 登录表面 | 多方案(主要jwt > passport),PyJWT/NextAuth/session感知 |
| **authz** | 访问控制映射 | 守卫覆盖率 + **没有可见守卫的写入端点** + 角色 |
| tenant | 多租户关键候选者 | BOLA边界,按频率 |
| surface | 12个用户输入门控的接收器类 | SSRF/SQLi/NoSQLi/遍历/SSTI/重定向/反序列化/XXE/协议污染/ReDoS/命令/评估 |
| schemas | 数据模型 + **特权字段** | Pydantic/SQLAlchemy/Django/Prisma/Mongoose/TypeORM/Zod → `role`/`isAdmin`/`groupId`用于批量分配目标 |
| iac_ci | IaC + CI/CD | GitHub Actions注入,未固定操作,Dockerfile-root,tfstate |
| client_exposure | 浏览器泄漏 | `NEXT_PUBLIC_*`机密,服务器秘密在客户端,源映射 |
| graphql | GraphQL表面 | 内省/游乐场/缺少深度限制 |
| integrations | 第三方 + Webhook | Webhook缺少签名验证 |
此外,还有**派生目标**——IDOR / SSRF / 开放重定向 / 上传 / 写入 / 认证端点候选者——因此探测器会指向*精确*的端点,而不是盲目地发射。
## 您获得的内容(`websec-out/`)
| 工件 | 它是什么 |
|---|---|
| `AGENT-BRIEFING.md` | **产品。** 行军命令:检测到的表面、访问控制映射、目标、发现、方法和分阶段探测器列表。 |
| `FACTS.json` | 完整的结构化重建。 |
| `findings.json` | 静态扫描器结果,**跨工具去重**和按严重程度排序(使用`--scan`)。 |
| `findings-ledger.json` / `REPORT.md` | 可追踪的账本:每个发现都有一个证据链、CWE/ASVS/OWASP-API引用、修复方案和**校准的`P(real)`**(实际漏洞率 + 95% CI + 样本大小)。 |
| `probes/` | 为*此*应用程序选择的探测器脚本和分阶段。 |
## 流程
```
🔧 websec (deterministic) 🤖 your agent + 🧑 you
───────────────────────────────── ─────────────────────────────────
1. recon → full attack surface → confirm the tenant boundary + auth model
2. run + de-dup static scanners → triage real-vs-noise
3. stage tailored probes → fill placeholders, run vs a TEST instance
4. emit AGENT-BRIEFING.md → propose fixes, re-run to confirm, report back
```
静态重建和简报只需要**代码**。*运行*探测器需要实时测试实例+测试凭据(人类提供)——工具本身永远不会接触运行中的应用程序。
## 证明工具
`websec proof`克隆了一个漏洞应用程序语料库(VAmPI、NodeGoat、DVGA)并评分是否重建表面每个应用程序的文档化攻击表面——一个确定性的、CI可追踪的代理(目前**10/10**)。
真正的杀手标准(简报是否提高了代理的漏洞发现能力与通用提示相比?)是手动A/B测试在[`corpus/PROOF-PROTOCOL.md`](corpus/PROOF-PROTOCOL.md).
## 校准信心
`websec calibrate`将账本与标记的语料库进行对比,衡量每个*(攻击类,置信度)*桶是**真实**的文档化漏洞的频率,并写入`calibration.json`(随软件分发并在运行时应用)。每个发现都携带`P(real)`以及**95% Wilson置信区间**和样本大小`n`——因此“中等”不再是感觉,而是“在语料库中大约57%的时间(CI 43–70%,n=51)”。与没有文档化的漏洞匹配的发现被视为假阳性(语料库是经过良好记录的)。**诚实的警告:**语料库是*故意有漏洞的*,因此对于干净的生成代码,这些比率是**乐观的**,并且小样本意味着**宽区间**——CI是头条新闻,而不是点估计,并且随着语料库的增长而缩小。在数据稀薄的情况下,桶会回退到每个标签的聚合,然后到明显标记的未校准先验。没有机器学习,没有依赖——二项比例 + Wilson区间;如果存在大量标记的集合,结构会升级到等调回归。
**它会自我改进。** `websec dynamic`是一个*先知*:未经身份验证执行的写入是已确认的真实漏洞,并且被重建标记的端点最终是受认证的,是已确认的假阳性。每次动态运行都会将这些已确认的标签折叠到一个**本地覆盖层**(`~/.cache/websec-validator/`,git忽略,从未分发)中,该覆盖层合并到公共表中——因此随着您运行它的次数越多,数字**个性化到您的应用程序**,无需额外步骤,也没有东西离开您的机器。要手动标记,请将一个`{attack_class, confidence, is_real}`文件提供给`websec calibrate --ingest`.
## 动态阶段(v2——目前为只读)
当您有一个*运行中的测试实例*时,`websec dynamic`会发行角色令牌并运行静态重建指向的探测器。v1是**只读的**:在组作用域的GET端点上重建的认证**跨租户BOLA**。
```
cp dynamic-config.example.json dynamic-config.json # TEST target + role creds (gitignored)
websec run ./my-app # static recon → websec-out/FACTS.json
websec dynamic --config dynamic-config.json --facts websec-out/FACTS.json
# → "14/14 cross-tenant GET reads blocked — all isolated" (or 🚨 LEAK with the exact endpoint)
```
永远不要指向生产环境。写入动词BOLA、JWT/auth攻击和ZAP/Nuclei双角色差异是下一个动态探测器(明确门控——它们会更改)。
## 验证
一个生产Next.js应用程序、一个大型Express/AWS单仓库,以及VAmPI / NodeGoat / DVGA漏洞应用程序语料库——独立地重现了手动渗透测试的结果(租户边界、SSRF、文件上传、跨租户BOLA、角色/authz差距)。
## 测试
```
python3 -m unittest discover -s tests # stdlib only, no Noir/network — 23 tests
```
## 发布(维护者)
通过**受信任发布**(OIDC)发布到PyPI。要发布:
```
# 1. bump the version in pyproject.toml (e.g. 0.2.1 → 0.2.2)
# 2. tag it and push — the tag must match pyproject's version (CI verifies):
git tag v0.2.2 && git push origin v0.2.2
# → publish.yml builds, INSTALLS + smoke-tests the wheel (version match,
# calibration ships, a real `websec run`), then publishes. A bad build fails
# CI instead of reaching PyPI — so you never have to yank after the fact.
```
一次性PyPI设置(在第一次发布之前):在pypi.org → **Account → Publishing → Add a pending publisher** with project `websec-validator`,owner `raccioly`,repo `websec-validator`,workflow `publish.yml`,environment `pypi`。项目在第一次成功发布时创建。
## 状态/路线图
**完成:** 11个提取器重建(包括schema/entity → 批量分配目标)、跨工具去重、定制探测器分阶段、代理简报、可追踪的发现账本带有**校准的信心(CJE — Wilson CI)**、证明工具、测试套件、**Docker捆绑**(所有扫描器 + Noir,架构感知)、**动态阶段v1**(认证的只读跨租户BOLA——现场验证,重现了手动渗透测试的14/14)。
**下一个:** 动态写入动词BOLA + JWT/auth探测器 + ZAP/Nuclei双角色差异(门控,它们会更改)、在手动标记的真实仓库上进行校准(更具代表性的基础率)、ASVS索引查找、可选的模型-SDK适配器以备无代理回退。
## 将其用作Claude Code技能/插件
此仓库**是**一个Claude Code插件。安装一次—
```
/plugin marketplace add raccioly/websec-validator
/plugin install websec-validator@websec-plugins
```
—并捆绑的**security-pass**技能([`skills/security-pass/SKILL.md`](skills/security-pass/SKILL.md))
让您只需用普通英语请求安全通行证:它运行`websec`,阅读简报,并与您一起处理发现。对于其他代理,通用接口保持不变:运行CLI,阅读`AGENT-BRIEFING.md`.
**安装注意事项(经过现场测试):**
- 安装ID是`plugin@marketplace`——`websec-validator@websec-plugins`(市场名称来自`.claude-plugin/marketplace.json`),**不是**`@websec-validator`(仓库)。
- 插件只提供*说明*;实际的扫描是一个**单独的Python CLI**(`websec`)。技能的步骤0会安装它(`pipx install websec-validator`),如果它缺失的话。
- **`/plugin …`仅在终端CLI中工作。** 在Claude **应用程序/代理SDK**(没有`/plugin`),在`.claude/settings.json`中配置它代替:
{
"extraKnownMarketplaces": {
"websec-plugins": { "source": { "source": "github", "repo": "raccioly/websec-validator" } }
},
"enabledPlugins": { "websec-validator@websec-plugins": true }
}
这**注册并启用**了插件,但**不会**自动获取它——第一次下载仍然需要CLI(`/plugin install websec-validator@websec-plugins`)一次。(团队的项目`.claude/settings.json`;仅您的`~/.claude/settings.json`)。
## 致谢
方法和探测器库是从真实的认证渗透测试中提炼出来的。这个工具将手写的方法定制成一个AI代理可以在任何仓库上运行的工具产品。
标签:AI辅助安全, DNS解析, Docker, Python, Web安全, 代码安全, 代码审计工具, 反取证, 安全扫描工具, 安全报告, 安全方法论, 安全漏洞检测, 安全评估, 安全防御评估, 开源项目, 无后门, 本地安全检测, 漏洞枚举, 网络安全, 蓝队分析, 请求拦截, 逆向工具, 隐私保护