cinfikircom/warden

GitHub: cinfikircom/warden

Warden 是一款将代码库安全扫描、自动化修复与重新扫描验证闭环结合的游戏化安全审计工具,确保每一项修复都经实测证明而非凭空声称。

Stars: 1 | Forks: 0

# ⚔️ Warden ### 像守卫领地一样捍卫你的代码库。 **Warden 会扫描你整个系统中所有*缺失、损坏或高风险*的内容——然后武装一名骑士, 这名骑士只有在真正的重新扫描证明漏洞确实被修复后才会升级。** 没有未经证实的绿灯。没有会破坏你代码的修复。绝不在黑暗中盲目行动。 [![tests](https://img.shields.io/badge/tests-278%20passing-brightgreen)]() [![node](https://img.shields.io/badge/node-%E2%89%A522-339933)]() [![zero deps](https://img.shields.io/badge/runtime%20deps-0-brightgreen)]() [![license](https://img.shields.io/badge/license-MIT-blue)]() [![欢迎 PR](https://img.shields.io/badge/PRs-welcome-8a5cf6)](CONTRIBUTING.md) 🇹🇷 [Türkçe README](docs/README.tr.md) · 📚 [检查目录](docs/CHECKS.md) · ⚔️ [Warden 骑士仪表盘](security-knight/README.md) · 🛡️ [安全策略](SECURITY.md) Warden Knight dashboard — the whole scan as a knight that arms up
## 📜 Warden 的誓言 安全工具的价值取决于你能对它寄予多少信任。Warden 做出了**三项承诺—— 并在代码中严格执行这三项**,而不是仅仅写在 README 中: | 誓言 | 含义 | 执行方式 | |---|---|---| | **我不会声称未经证实的胜利。** | 安全态势是*测量*出来的,绝非凭空声称。一块装甲只有在真正的、干净的重新扫描证明其有效性后才会变得**坚固**——没有任何按钮、endpoint 或标志可以直接将其设置为“激活”。 | 基于内容的 `fingerprint` + 前后 `computeDelta`;Knight 桥接器仅根据真实的发现来推导状态 | | **我修复问题但绝不破坏主人的成果。** | 自动化修复以**零损害**落地:使用独立分支、你自己的测试套件、fingerprint 差异验证,并通过 PR 合并——*绝不*直接提交到 `main`。 | `packages/warden-skill/SKILL.md` 修复流程(git worktree 隔离、差异校验、PR 校验) | | **我在明处工作,绝不在暗处行动。** | 默认被动/只读;记录每个命令和请求;主动/DAST 测试**仅在**明确的授权网关后运行。 | `warden.authz.yml` 网关 · `warden-report/warden-run.log` 审计跟踪 · 在源头进行密钥遮蔽 | ## 两个部分,一位守护者 **扫描 → 修复 → 武装 → 重新扫描。** 扫描器发现弱点;Knight 将修复过程转化为角色的升级体验——没有声称/手动设置的状态,只有真正的重新扫描证明的结果。 | | 🛡️ **Warden Scan** _(引擎,此仓库根目录)_ | ⚔️ **Warden Knight** _([`security-knight/`](security-knight/README.md))_ | |---|---|---| | **内容** | 对任何代码库进行静态 + 动态安全审计 | 相同扫描安全态势的实时游戏化视图 | | **回答的问题** | “这段代码中有什么是损坏的或有风险的?” | “哪些维度真正干净了——还剩下什么?” | | **形式** | CLI / CI 扫描器 → 发现、SARIF、playbook | Web 面板 + 后端;“装备”会触发真正的重新扫描 | | **循环** | 扫描 → 修复 playbook → 重新扫描(前后差异) | 装备 → 真实发现 → 修复(你自己或通过 agent)→ 重新扫描 → 升级 |
Warden Knight
### Warden Knight 仪表盘 将你整个 Warden 扫描的安全态势(SAST、Cloud、Compliance、K8s、DAST、……)呈现为一名骑士,随着你修复真实的发现而逐步全副武装。Warden 扫描干净的维度是**坚固的**装甲;P0 维度是一个**破裂的**任务,显示的是实际的发现内容,而不是模板文本。分数是测量出来的(而非声称的)。
Warden Knight dashboard
## ⛔ 首先阅读 — 安全与授权原则(具有约束力) Warden 具有双用途能力(主动/DAST 测试)。这些规则**在代码中**强制执行: 1. **默认被动 / 只读。** 除非明确启用,否则绝不运行主动测试。 2. **授权网关。** 主动/DAST 测试*仅在*项目根目录中存在有效的 `warden.authz.yml` **且**包含以下内容时运行: - `owner_attestation: true` — “我拥有这些资产 / 我被授权测试它们” - `authorized_targets:` — 允许列表;主动测试**仅**访问这些主机/域名/IP - `authorized_by:` 和 `date:` — 审计跟踪 文件缺失或不完整 → Warden 保持**被动**状态。任何请求都不会超出允许列表的范围。 3. **非侵入性。** 即使是主动测试也受速率限制、非破坏性且低频次。 **拒绝 DoS、拒绝暴力破解、拒绝漏洞利用、拒绝绕过检测。** 4. **在源头遮蔽密钥。** 任何 token/password/URL 在写入报告时都会显示为 `***`; 完整的值**绝不**会被序列化(报告、JSON、SARIF、日志——全部遮蔽)。 5. **审计日志。** Warden 运行的每个命令/请求都会写入 `warden-report/warden-run.log`。 6. **禁止生产环境变更。** 命令保持在检查/diff/dry-run 级别——没有部署/迁移/重启。 ## 🛡️ Warden Scan — 功能说明 - **Module A — Parity & Deployment**(被动):git drift、破坏性迁移(Prisma/Django/Laravel/EF Core/Go)、runtime 时效性、**通用卷一致性引擎**、`.env` ↔ `.env.example`、备份/恢复 + TLS 过期、外部 webhook。 - **Module B — SAST**(被动):硬编码密钥(包括提供商密钥及**基于熵**的检测 + **git-history** 扫描)、易受攻击的依赖项(`npm/pnpm audit`)、弱加密算法(MD5/SHA1/ECB/CryptoJS)、localStorage 中的 JWT & **`alg:none`**、IDOR、SQL/命令/eval 注入、**SSRF · SSTI · 路径穿越 · 不安全的反序列化 · XXE · 开放重定向**、CORS、前端 XSS 注入点 + **弱 CSP / 生产环境 source-maps** — 横跨 **TS/JS、Python、PHP、C#、Go**。 - **Module Imports — external-tool orchestrator**(被动):引入任何 **SARIF 2.1.0** 报告(OpenGrep/Semgrep、Trivy、Gitleaks、Checkov、Nuclei)以及来自 `warden-imports/` 的 **OSV‑Scanner** JSON,将它们标准化为 Warden 的发现模型(自动将每项路由到正确的维度——IaC→CLOUD,K8s→K8S,DAST→C),从而让 fingerprint/delta、评分、playbook、豁免和 SARIF 重新导出同样适用于它们。使用 `WARDEN_TOOLS=all`(或逗号列表)时,Warden 会**直接运行已安装的引擎**(OpenGrep/Semgrep/Trivy/Gitleaks/Checkov;`osv-scanner` 实时 SCA),以及受网关限制的用于 DAST 的 **Nuclei**——如果未安装则优雅跳过。 - **Module D — Compliance**(被动):可观测性、密钥管理、CI/CD、数据保护,加上 **PCI‑DSS 4.0**(CVV/PAN 扫描 + 检查清单)以及 **Privacy / GDPR‑KVKK** 检查清单。 - **Module CLOUD**(被动,Terraform):公开的 S3/GCS、IAM 通配符、开放的安全组/防火墙、公开的 RDS/Cloud SQL、Azure 公开存储、Cloudflare SSL 模式。 - **Module K8S**(被动):特权/root 容器、`:latest` 镜像、明文密钥环境变量、无 TLS 的 ingress。 - **Module AI**(被动):嵌入的 LLM API 密钥、prompt 注入面、系统 prompt 泄露。 - **Module ACCESS — Access control & tenant isolation**(被动):破坏 SaaS/CRM/ERP 的 OWASP #1 漏洞——**多租户隔离**(通过客户端 id 获取对象时没有 `tenant_id`/`org_id` 作用域 → 跨租户泄露)、**缺少 endpoint 授权**(在应用其余部分进行身份验证时,没有 auth middleware 的状态更改路由)、**批量赋值 / 过度发布**(`req.body` 直接写入 model → `is_admin` 提权),以及**没有角色检查的特权/管理员操作**。多技术栈支持(Express/Nest、Django、Rails、Laravel;Prisma/Sequelize/TypeORM/Mongoose)。仅在检测到 web/API + ORM 层时运行。 - **Module AUTH — Identity & session hardening**(被动):账号盗用面——**缺少 MFA/2FA**、**可预测的密码重置 token**(`Math.random`/`Date.now`)、**不安全的 session cookie**(缺少 `httpOnly`/`secure`/`sameSite`)、**没有过期时间的 JWT**、**登录暴力破解保护**(rate-limit/lockout),以及**弱密码策略**(有哈希但无强度/pwned 检查)。缺失检查会扫描去除注释的代码。仅在检测到身份验证层时运行。 - **Module API — API security (OWASP API Top 10)**(被动):ACCESS/injection 之外的特定 API 漏洞——**过度数据暴露**(`SELECT *` / 返回每一列)、**无速率限制**、**无限制查询**(无分页的 `findMany`/`findAll` → 整张表)、**冗长的错误**(堆栈跟踪泄露给客户端),以及 **GraphQL 深度/复杂度限制**。仅在检测到 HTTP/API 层时运行。 - **Module PRIV — Data privacy & audit trail**(被动):针对持有个人数据(KVKK/GDPR)的 CRM/ERP 的合规层——**日志中的 PII**(电子邮件/电话/身份证号/IBAN)、**URL/查询字符串中的 PII**、**没有静态加密的高敏感字段**、**没有删除/被遗忘权机制**,以及**缺少谁访问/更改了敏感记录的审计跟踪**。仅在检测到 PII 字段时运行。 - **Module UPLOAD — File upload security**(被动):几乎每个 SaaS/CRM/ERP 都接受上传——这是一类经典的高影响漏洞。标记**不受限制的文件类型**(没有 `fileFilter` / 扩展名-MIME 白名单 → webshell、存储型 XSS)、**通过用户文件名进行的路径穿越**(`originalname` 进入 fs 路径而没有 `path.basename` → 写入上传目录之外)、**缺少大小限制**(缺少 `limits.fileSize` → DoS / 磁盘耗尽),以及**存储在 web-root 下的上传文件**(public/static → 上传的脚本被提供和执行)。仅在检测到上传层(multer/formidable/busboy/express-fileupload…)时运行。 - **Module EMAIL — Email security**(被动):可静态检测的邮件安全部分——**邮件头注入**(用户输入进入 `from`/`replyTo`/`headers` → CRLF、隐藏的 BCC 数据外泄、发件人欺骗)、**HTML 邮件正文中未转义的用户输入**(钓鱼 / 内容注入),以及**没有 TLS 的 SMTP**(`secure:false`、端口 25、`ignoreTLS`、`rejectUnauthorized:false` → 明文传输凭证和内容)。仅在检测到邮件工具/SMTP 层时运行。*(SPF/DKIM/DMARC 是针对实时域验证的 DNS 级记录——它们属于 DAST 层,而不是静态分析。)* - **Module FLOW — Workflow & data integrity**(被动):涉及资金、库存或状态的 CRM/ERP 的可靠性层——对 PAY-9 在支付之外的泛化。标记**没有事务的多步骤数据库写入**(中途崩溃 → 账户扣款但未收款,创建了订单但未减少库存)、计数器/余额/库存上的**非原子读-改-写**(并发请求 → 更新丢失、超卖),以及订单/转账/预订的**非幂等创建**(双击 / 重试 → 重复记录)。Handler 主体通过大括号匹配进行评估。仅在检测到 web 层时运行。 - **Module WEB — CSRF, clickjacking & security headers**(被动):Module B(CORS/XSS/CSP)和 DAST(实时 header)的静态补充——特别是**CSRF,这是其他模块未覆盖的**。标记在 cookie-session 状态更改路由上**缺少 CSRF 保护**、**缺失的安全 header**(met/X-Frame-Options/HSTS/CSP → 点击劫持、SSL 剥离、MIME 嗅探),以及**带有凭证的反射型 CORS 源**(`origin: req.origin` → 任何站点都能获得经过身份验证的访问权限)。仅在检测到 web 层时运行。 - **Module PAY — Payment security & reliability**(被动):识别支付集成(Stripe、PayPal、Braintree、Adyen、Razorpay、Mollie、iyzico、craftgate、PayU…)并审计资金流向——**webhook 签名验证**(伪造的“支付成功”)、**客户端设定的金额**(价格篡改)、**幂等性**(重试导致重复扣款)、**日志/服务器中的卡数据**(PAN/CVV)、**对账 (mutabakat) 定时任务**是否存在、**孤立/中断的支付**处理(已扣款但未履行、未捕获的授权)、**失败/异步事件**处理、**订阅催收**(失败续订恢复)、**3DS/SCA** 强制执行(旧版 Charges API 无法执行 SCA),以及**退款核算**(客户端设定的退款金额 → 过度退款)。仅在检测到支付集成时运行。 - **Module C — DAST**(主动,**授权受限**):暴露的文件(`/.env`、`/.git`、swagger)、安全 header + TLS、开放的管理面板、速率限制探测、cookie 标志、敏感端口清单。 每个发现都包含一个 **CVSS v4** 基础分数及可利用性、标准映射 (**OWASP Top 10 / ASVS / API / CIS Benchmark / ISO 27001:2022**)、证据(`file:line` 或命令)以及修复 prompt。 包含 CVE 的发现还会使用 **CISA KEV**(已知被利用)和 **EPSS**(30 天被利用概率)进行额外优先级排序, 从可选的 `warden-data/kev.json` / `warden-data/epss.json` 快照**离线**加载(无网络——默认被动), 并结合**导入级别的可达性**——不在源码 import 图中的依赖(可能是传递性的)会被降低优先级(除非它是 KEV)。 ## 架构 一个 pnpm monorepo,在 Node 22 上免构建运行(`tsx`): | Package | 职责 | |---------|----------------| | `packages/warden-core` | 技术栈无关的引擎:发现模型、授权网关、检测器、模块、报告生成器、风险引擎、密钥遮蔽、审计日志。 | | `packages/warden-cli` | `warden init · scan · pentest · report · monitor`。 | | `packages/warden-skill`| Claude Code Skill 桥接器(`SKILL.md`)。Cursor / Windsurf / VS Code / GitHub Actions 也会调用此核心。 | ## 快速开始 ``` pnpm install # Passive audit (default; never sends an active request) pnpm warden scan --target # Install Warden into a project as a Claude Code skill — also copies the Warden Knight # dashboard into that project and opens it in your browser (pass --no-launch to skip that) pnpm warden init --target # Continuous monitoring (periodic re-scan + before/after delta) pnpm warden monitor --target --interval 1800 # Active/DAST — only after opening the authorization gate cp warden.authz.example.yml warden.authz.yml # fill in owner_attestation / authorized_targets / authorized_by / date pnpm warden pentest --target ``` ### 输出(`warden-report/`) | 文件 | 内容 | |------|----------| | `report.md` | 执行摘要、记分板、前后差异、按严重程度排序的发现 | | `findings.json` | 机器可读(CI 网关);稳定的 `id` + `fingerprint`、记分板、检查清单、差异 | | `findings.sarif` | SARIF 2.1.0 → GitHub Code Scanning / Azure DevOps | | `remediation-playbook.md` | 每个 P0/P1 的复制粘贴 **Claude Code prompt**(风险 · 标准 · 位置 · 步骤 · 验收标准) | | `parity-report.md` | Module A 层表格 + **Parity Risk Score** | | `compliance-report.md` | PCI‑DSS / Privacy / OWASP ASVS / CIS / ISO 27001 检查清单(✔/⚠/✖/–) | | `history.jsonl` | 用于差异引擎的每次运行趋势 | | `warden-run.log` | 每个命令/请求的审计跟踪 | 严重程度:**P0**(生产环境阻碍 / 可被主动利用)· **P1**(在首个客户上线前解决)· **P2**(架构债务)· **P3**(规模/优化)。 ### 启动游戏化仪表盘 ``` pnpm knight # → opens the Warden Knight panel in your browser automatically ``` 首先运行一次扫描(`pnpm warden scan`),这样才有内容可以武装。从那时起,一切—— 重新扫描、装备装甲(这会触发真正的扫描并显示真实的发现)、为 agent 排队修复任务、 观看骑士升级——都可以在面板本身完成;无需再返回终端。 以上是针对**当前仓库**运行仪表盘的操作。要将这个正在运行的面板指向*另一个* 项目而无需在其中安装任何内容,请设置 `WARDEN_TARGET`: ``` WARDEN_TARGET=/abs/path/to/other-project pnpm knight ``` 如果你想在积极进行加固的项目中*内部*安装一个专用、独立的仪表盘副本 (这样它自己的 `pnpm warden scan --target .` 就不需要环境变量,且它自己的 Claude Code 会话可以运行 并行 agent 修复流程),请改用 `warden init` —— 见上文。 完整图景请参阅 [`security-knight/README.md`](security-knight/README.md)。 ## 价值闭环 ``` warden init → scan → hand remediation-playbook.md prompts to an agent → fix → re-scan │ before/after delta proves what got fixed, what's new, what remains ◀───────┘ ``` ## CI / GitHub Action Warden 提供了一个复合 action(`action.yml`),它会运行被动扫描并上传 SARIF: ``` permissions: contents: read security-events: write # required for SARIF upload jobs: warden: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: /warden@v1 with: target: "." fail-on: "P0" # fail the job on any P0 finding upload-sarif: "true" # findings.sarif → Code Scanning ``` 本地等效的网关命令:`warden scan --fail-on P0`(遇到 P0+ 时退出代码为 1)。 ### 抑制误报(`.warden-ignore.yml`) 可以通过在项目根目录下的 `.warden-ignore.yml` 中填写理由来豁免误报。 被豁免的发现将从报告和 `--fail-on` 网关中剔除,但绝不进行静默隐藏: 每个应用的豁免都会写入审计日志和 CLI 摘要中。选择器(`fingerprint` / `check` / `id`)使用 AND 语义进行匹配,并且每个条目都需要填写 `reason`: ``` waivers: - fingerprint: "a1b2c3d4e5f6..." # most stable; binds to a finding's content hash reason: "Reviewed — intentional, not a real issue." - check: "B3" # broader; all B3 findings reason: "SHA1 used only for content fingerprinting, not security." expires: "2026-12-31" # optional; past this date the waiver is inactive ``` ## 支持的技术栈 **语言/框架:** Node/TypeScript(Prisma、Drizzle、Express、Next、NestJS),Python/Django,PHP/Laravel,.NET/ASP.NET (EF Core),Go。 **基础设施:** Docker/Compose,Kubernetes 清单,Terraform (AWS/Azure/GCP/Cloudflare)。 添加一个技术栈 = 一个 `StackDetector` + 可选的 schema 分析器 + 声明式 SAST 规则。 ## 状态 正在积极开发中。278 项测试通过;19 个刻意设计为存在漏洞的 fixture + 一个刻意设计为安全的 fixture(防范误报)。 完整的单次检查状态目录请参阅 [`docs/CHECKS.md`](docs/CHECKS.md)。 欢迎提供想法、针对新技术栈的检查以及 bug 报告——请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。 发现了 *Warden 本身*的漏洞?请遵循 [`SECURITY.md`](SECURITY.md)(进行私下披露)。 ## License MIT
标签:DevSecOps, GNU通用公共许可证, MITM代理, Node.js, 上游代理, 代码安全, 子域名突变, 安全基线检查, 日志审计, 模块化设计, 漏洞枚举, 自动化修复, 自动化攻击, 逆向工具, 静态代码扫描