RideMatch1/A.E.G.I.S
GitHub: RideMatch1/A.E.G.I.S
一个针对 Next.js/Supabase/React 技术栈的自动化安全审计套件,专注于发现框架特有的安全漏洞。
Stars: 16 | Forks: 5
# A.E.G.I.S
**您的 vibe-coded 应用理应配备的偏执型审计工具。**



[](https://www.npmjs.com/package/@aegis-scan/cli)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/ci.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/codeql.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/scorecard.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/gitleaks.yml)
[](./ROADMAP.md)
针对 **Next.js + Supabase + React** 的栈特定安全扫描器。91 个默认启用的扫描器(内置检查器 + 外部工具包装器,包括 19 个传统 SAST/DAST 工具 + 1 个被动子域名侦察 + 3 个 LLM 代理渗透测试框架:Strix、PTAI、Pentest-Swarm-AI),外加 5 个可选的主动攻击探针、基于 AST 的跨文件污点分析、0-1000 分评分及 `FORTRESS → CRITICAL` 等级。最佳使用方式是**配合** Semgrep / CodeQL —— 而非替代它们。提供 CLI、MCP 服务器以及用于 CI 集成的 GitHub-Actions 配方。
## 什么是 AEGIS?
AEGIS (Automated Enterprise-Grade Inspection Suite) 能够发现通用 SAST 工具因缺乏框架特定规则而遗漏的漏洞。AEGIS 覆盖了 Next.js / Supabase / React 的缺口 —— 多租户隔离、RLS 绕过、服务器组件数据泄露、Zod 强制校验、`.rpc()` SQLi、批量赋值、认证防护缺口 —— 而 Semgrep / CodeQL 则覆盖通用 SAST 领域。
引擎的独特之处在于:AEGIS 追踪代码中的 **数据流** —— 在单个文件内**以及**跨模块边界:
```
// Same-file taint:
const id = req.body.id; // source: user input
const trimmed = id.trim(); // propagates through method call
const query = `SELECT * WHERE id = ${trimmed}`; // propagates through template
db.query(query); // sink: SQL Injection (CWE-89, CRITICAL)
// Cross-file taint:
// lib/db.ts — export function runQuery(sql: string) { db.query(sql); }
// api/route.ts — import { runQuery } from '../lib/db';
// runQuery(req.body.q); // AEGIS traces the sink across the boundary
```
按 CWE 的清理器感知:`parseInt()` 阻止 SQL 注入但不阻止 XSS,`DOMPurify.sanitize()` 阻止 XSS 但不阻止 SQL 注入,`encodeURIComponent()` 阻止 SSRF 但不阻止路径遍历(框架在文件系统访问前会解码)。
套件组成:静态分析管线中的 **91 个默认启用扫描器**(内置正则 + AST 污点分析器 + RPC 特定 SQLi 扫描器 + 16 个外部工具包装器:Semgrep、Gitleaks、ZAP、Trivy、Nuclei、Bearer、Checkov、Hadolint、TruffleHog、OSV-Scanner、testssl.sh、React Doctor、Lighthouse、Axe……),**5** 个可选的实时攻击探针(需使用 `--confirm` 参数的 `aegis siege` / `pentest`),**4** 个合规性框架(GDPR / SOC 2 / ISO 27001 / PCI-DSS),一个供 AI 代理使用的 MCP 服务器,以及一个可复用的 GitHub-Actions 配方(位于 `ci/github-action/`),用于在 PR 中发布评分和主要发现结果。
## 架构
```
┌──────────────────┐
│ aegis.config.json│ ← user config (optional)
└────────┬─────────┘
│
┌────────▼─────────┐
│ ConfigLoader │ (@aegis-scan/core)
│ (Zod-strict) │
└────────┬─────────┘
│
┌────────▼─────────┐
│ Orchestrator │ walkFiles → per-scanner dispatch
└────────┬─────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌────────────┐ ┌──────────────────┐
│ Built-in scanners│ │ Taint │ │ External wrappers│
│ (41 regex rules)│ │ Analyzer │ │ (Semgrep, ZAP, …│
│ │ │ (AST + │ │ auto-skip when │
│ │ │ TS │ │ not installed) │
│ │ │ Compiler)│ │ │
└─────────┬────────┘ └─────┬──────┘ └────────┬─────────┘
│ │ │
└─────────────┬────┴──────────────────┘
▼
┌──────────────────┐
│ Findings │
└─────────┬────────┘
│
┌─────────▼──────────┐
│ Suppression filter │ ← inline + config suppressions
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ Score / Grade / │ ← 0-1000, blocker override
│ Badge / Confidence│
└─────────┬──────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
Terminal JSON SARIF 2.1.0
(colour) (machine) (GH Code
Scanning)
│
▼
HTML / Markdown
(dashboards, PR comments)
```
**污点分析器**是正则扫描器的跨组件对应物:它使用 TypeScript 编译器 API 解析每个文件,遍历 AST 以查找源 → 汇数据流,咨询模块图 + 函数摘要缓存以进行跨文件传播,并将发现结果输出到同一个管线。每个扫描器从 `@aegis-scan/core` 读取数据并写入共享的 `Finding[]` 数组;编排器负责调度,评分聚合器负责最终判定。
## 快速开始
```
npx @aegis-scan/cli scan .
```
```
# 或全局安装
npm install -g @aegis-scan/cli
aegis scan .
# 使用所有扫描器进行完整审计
aegis audit .
# 生成配置
aegis init .
```
## 脚手架创建新项目
正在启动一个 Next.js + Supabase 项目?跳过安全改造阶段 —— 让 AEGIS 从提交 0 开始就奠定一个生产就绪的基础。
```
aegis new my-saas
```
脚手架包含:
- **11 个洁净室安全原语** —— `secureApiRouteWithTenant`,
`requireRole`(RBAC),速率限制(感知 X-Forwarded-For),SSRF 安全
`fetch`,AES-256-GCM 加密,Zod 严格模式模式,PII 清洗日志
记录器(50+ 种编辑模式),AppError 层次结构。
- **RLS 引导迁移** —— 带有严格策略 + 注册时自动创建 Profile 触发器的 `tenants` + `profiles` 表。
- **加固的中间件** —— CSRF + 9 个安全头
(包括 COEP / COOP / CORP)+ 速率限制。
- **示例 API 路由**(59 行代码)组合了所有 6 个原语 —— 大规模地教授
组合模式,并带有正确的错误映射
(`ForbiddenError` → 403,`ZodError` / `SyntaxError` → 400)。
- **GitHub Action PR 门禁**,使用 `mode: audit` + 预装的 Semgrep /
OSV-Scanner / Gitleaks / TruffleHog(SHA-256 验证)。
- **AI 安全规则**(`CLAUDE.md`)供 AI 编码助手使用。
- **Husky 预推送钩子**,运行 `aegis scan --fail-on-blocker`。
**基线:** 一个新的脚手架评分为 **997/A HARDENED**,包含
**0 BLOCKER**(经验验证 —— `npm install` + `aegis scan`
端到端)。5 个 MEDIUM 基线发现 —— 2 个扫描器误报(计划在 v0.13 扫描器修复中解决)+ 3 个 Next.js 生态系统固有的供应链项目 —— 在脚手架自身的 README 的“已知基线发现”部分有文档记录:属于教学性质,而非抑制。
**改造现有项目:**
```
aegis init
```
将 `aegis.config.json` + `.github/workflows/aegis.yml` +
`CLAUDE.md` + `.husky/pre-push` 写入当前目录。
默认跳过已存在文件(绝不覆盖用户文件)。使用 `--force`
统一覆盖这三个扩展文件,或使用 `--skip-ci` /
`--skip-claude` / `--skip-husky` 逐个文件选择退出。部分写入
安全:成功的写入会保留在磁盘上,即使后续写入失败 —— 该
命令修改用户的项目,因此它从不回滚。
请参阅 [v0.12 脚手架转向设计规范](./docs/design/2026-04-18-v0.12-scaffolding-pivot.md)
了解模板结构、原语来源策略和退出标准。
## AEGIS 是一个三层安全工具包
AEGIS 提供三个协同包,覆盖完整的发货前安全生命周期。专业的安全团队会同时使用这三者。
| 包 | 角色 | 快速开始 |
|---|---|---|
| [`@aegis-wizard/cli`](https://www.npmjs.com/package/@aegis-wizard/cli) | **构建** —— 交互式脚手架 + Next.js + Supabase + shadcn SaaS 的代理简报生成器 | `npx -y @aegis-wizard/cli new my-saas --interactive` |
| [`@aegis-scan/cli`](https://www.npmjs.com/package/@aegis-scan/cli) | **扫描** —— 防御性 SAST 扫描器(五包家族)。91 个默认启用的扫描器(内置检查器 + 19 个 SAST/DAST 包装器 + 1 个被动子域名侦察 + 3 个 LLM 代理渗透测试框架)外加 5 个可选的主动攻击探针,基于 AST 的跨文件污点分析。 | `npx -y @aegis-scan/cli scan ./my-saas` |
| [`@aegis-scan/skills`](https://www.npmjs.com/package/@aegis-scan/skills) | **测试** —— 面向 Claude Code 和兼容 AI 代理的可选红队技能库。为您的代理注入攻击类方法论,以便在发货前对构建内容进行压力测试。 | `npm i -g @aegis-scan/skills && aegis-skills install` |
用向导构建。扫描您构建的内容。以红队风格测试它。完整生命周期,一个工具链,一个符合归因要求的开源许可栈。这三个包独立发布(`wizard-v*`、`v*` 和 `skills-v*` 标签命名空间),因此互不阻塞 —— 但它们在架构假设上协同校准:一个由向导脚手架创建的项目在扫描评分中低于 960 分被视为模式缺陷,而在技能库下运行的代理可以获取扫描器在防御中检测到的攻击类。
```
# 一次性完整剧本工作流
npx -y @aegis-wizard/cli new my-saas --interactive # build
npx -y @aegis-scan/cli scan ./my-saas # scan
npm i -g @aegis-scan/skills && aegis-skills install # equip agent for test
```
有关完整文档,请参阅各个包的 README:
- [`packages/wizard-cli/README.md`](./packages/wizard-cli/README.md)
- [`packages/README.md`](./packages/skills/README.md)
- [`docs/patterns/index.md`](./docs/patterns/index.md) 了解向导捆绑的模式目录
`@aegis-scan/skills` 的负责任使用在本仓库的 `SECURITY.md` 中有文档记录 —— 攻击方法论库仅限授权测试使用。
## 通用 SAST 工具遗漏而 AEGIS 能发现的内容
这些是 Next.js + Supabase 应用程序中的**栈特定**漏洞。通用工具没有针对它们的规则,因为它们是框架特定的模式:
| 漏洞 | 类别 |
|---|---|
| 缺少 `tenant_id` 过滤器 —— 跨租户数据泄露 | 多租户 |
| API 路由中的 `service_role` RLS 绕过 | Supabase |
| 通过 `.rpc()` 模板插值在函数名中注入 SQL | Supabase |
| 批量赋值 —— 未验证的 `request.json()` 传入 `.insert()` | Supabase |
| 敏感端点缺少速率限制 | Next.js API |
| API 路由缺少认证防护 | Next.js API |
| 服务器组件将完整数据库记录传递给客户端 (CWE-200) | React Server Components |
| 提示注入 —— LLM 提示中的用户输入 | AI / LLM |
| 突变模式缺少 Zod `.strict()` | 验证 |
| 数据库查询没有分页 | 性能 / DoS |
AEGIS 不是 Semgrep 的替代品 —— 它是 **Semgrep 的倍增器**。当 Semgrep 已安装时,AEGIS 会自动包装它,您将同时获得两者的效果。
## 真实世界语料库
AEGIS 针对一个包含 8 个项目的公共源代码语料库进行了调优。每个发现都经过人工标注 TP/FP,重复出现的 FP 模式被固定为回归测试。以下是 **冻结的 v0.11.2 基线** 分数 —— 在 v0.17 线上运行新鲜语料库计划在下个次要版本进行。方法论、FP 分类严谨性和调优姿态未变;绝对数值可能因 v0.11.2 后的精度改进(现场报告子类 1-4,扫描器系列自用驱动的修复贯穿 v0.16.x)而略有变动。
| 项目 | 技术栈 | v0.9.5 | v0.10.0 | v0.11.0 | v0.11.1 | v0.11.2 |
|---|---|---|---|---|---|---|
| shadcn/taxonomy | Next.js + next-auth | 985 A | 984 A | 984 A | 984 A | 984 A |
| formbricks | Next.js + Prisma | 968 A | 967 A | 967 A | 966 A | 966 A |
| midday | Next.js + Supabase | 957 A | 958 A | 957 A | 954 A | 954 A |
| dub | Next.js + Prisma | 956 A | 951 A | 950 A | 950 A | 950 A |
| documenso | Next.js + Prisma | 956 A | 956 A | 956 A | 956 A | 956 A |
| trigger.dev | Next.js + Prisma | 953 A | 953 A | 952 A | 952 A | 952 A |
| cal.com | Next.js + Prisma | 947 A | 947 A | 947 A | 947 A | 947 A |
| supabase-studio | Next.js + Supabase | 0 F* | 0 F* | 0 F* | 0 F* | 0 F* |
**v0.11.2 与 v0.11.1 的变动:`|Δ|` 最大 = 0 分,0 次等级变动。**
变更集是一个狭窄的扫描器精度修复(租户隔离检查器注释散文剥离 + 召回率拓宽 + URL 参数范围抑制)。抑制分支仅在这些项目中不存在的特定 AST 形状上触发 —— 语料库分数严格不变。驱动本次发布的自用项目:8 个 `tenant-isolation-checker` FP → 0。
**v0.11.1 与 v0.11.0 的变动:`|Δ|` 最大 = 3 分,0 次等级变动。**
变更集由自用驱动 —— 一次真实的 Next.js+Supabase 扫描
暴露了 5 个不同的 auth-enforcer + ssrf-checker FP 类,这些不在
v0.11 推测性路线图上。自用项目本身从
940/A 移动到 946/A,消除了 6 个误报发现。midday 的微小漂移(-3)是由于 ssrf
排放减少带来的类别上限算术 —— 属于噪声级别,等级不变。
**v0.11.0 与 v0.10.0 的变动:`|Δ|` 最大 = 1 分,0 次等级变动。**
同一变更集关闭了 **+4 个合成召回率金丝雀测试**,首次使
27 个金丝雀测试套件达到 **27/27 全绿**。
解读:真实世界语料库的精度保持稳定,同时
在有文档记录的 CWE / 扫描器缺口上的召回率有所提高。双重视角是有意的 —— 仅看精度会认为工具因未改变分数而“良好”,这是循环论证。
*\*supabase-studio 保留了两个 BLOCKER 发现,涉及发货源代码中合法的 SQL
字符串拼接(`Reports.constants.ts` 和
`Logs.utils.ts`)。这些不是误报 —— 一个具有不同于面向客户应用威胁模型的 Supabase 内部管理仪表板,但按字面意思,这些发现是准确的。*
v0.11.0 中的语料库驱动修复(analyzer-core 消费者端对称性 +
新扫描器 + 精度调整;详情见
[CHANGELOG.md](./CHANGELOG.md#0110--2026-04-17--recall-honesty-part-2)):
- 新模块 `ast/guard-flow.ts` —— 在函数摘要(v0.9.1 构建端)和污点追踪器(v0.11 消费者端)之间共享支配者遍历。通过一个连接到三个汇排放调用点的 `isSinkGuardedByKnownPredicate`,关闭了 D4(命名函数 URL 守护)+ D5(startsWith-字面量守护)+ Z3(跨文件消费者端守护对称性)。
- 新扫描器 `middleware-auth-checker` —— 通过 `x-middleware-subrequest` 头进行 Next.js 中间件认证绕过(CVE-2025-29927)。
将内置扫描器数量从 40 提升到 41。
- `ssrf-checker` 针对用户定义类型化 URL 守护(名称标记 + `: boolean` 返回)的结构性 SAFE_PATTERN。在 D4 形状的允许列表辅助函数上静默 ssrf-checker —— 两个扫描器现在在同一结构信号上协同静默。
- `ssrf-checker` 库包装器启发式 (Z4) —— 导出的 fetch-
包装器中,URL 作为参数不再在包装器位置发出 CWE-918。
- `timing-safe-checker` 的 UPPERCASE 环境变量名称允许列表扩大,以覆盖常见的 `process.env.SECRET` 形状。
- **基于金丝雀的召回率测量** —— `packages/benchmark/canary-
fixtures/` 是一个 27 个金丝雀测试套件,覆盖 5 个套件验证 + 10 个延迟项目目标 + 12 个盲点压力测试。v0.10 后 23/27 通过;剩余 4 个(D4 / D5 污点分析器守护流、S1 CVE-2025-29927 中间件绕过、S12 时间安全变量名称允许列表)是明确的 v0.11 范围。
## 诚实的局限性
运行安全工具是一个信任练习。以下是 AEGIS **不擅长** —— 或根本做不到的事情 —— 提前文档记录,以便您决定 AEGIS 在您的技术栈中适合哪个位置:
- **跨文件污点精度在大规模下未经测量。** 当前的自用语料库(6 个生产级 Next.js 代码库)具有太少的跨文件排放,无法产生统计有效的精度数字。因此,跨文件发现以 `confidence: 'medium'` 而非默认值发布。单文件污点由基准测试(30/30 严格)测量,并且是引擎的主要优势。
- **不是通用 SAST 替代品。** AEGIS 是栈特定的。在 Python / Go / Rust / Java 上它毫无用处。在非 Next.js 的 Node 上,它仍然覆盖通用类(SQLi、SSRF、路径遍历、提示注入、加密误用),但跳过框架特定规则。请配合 Semgrep / CodeQL / njsscan 使用,切勿替代。
- **合规性检查是基于模式的规则,而非审计级别。** `gdpr-engine`、`soc2-checker`、`iso27001-checker`、`pci-dss-checker` 覆盖了数十种最常见的模式级控制(例如,GDPR:隐私页面、同意、PII 处理、自托管字体、双重选择加入、保留)。它们**不是**认证审计员的替代品。
- **仅限 TypeScript / JavaScript。** 不支持 Python / Go / Rust / Java / C# / Ruby / PHP。
- **外部工具包装器要求该工具位于 PATH 上。** 当底层二进制文件缺失时,Semgrep / Gitleaks / Trivy / ZAP / OSV-Scanner / …… 集成会自动跳过。CLI 报告 `Confidence: LOW` 并附带 "Missing: …" 说明,并且当没有可用的安全焦点外部工具时,CI PR 评论徽章会获得 `[LOW-CONFIDENCE]` 前缀。
- **单维护者项目。** CONTRIBUTING / SECURITY / CODE_OF_CONDUCT / CODEOWNERS / issue 模板均已就位;欢迎贡献和审查帮助。
## OWASP-APTS 合规姿态
AEGIS 发布了一份公开的 **OWASP 自主渗透测试标准 (APTS) Tier-1 就绪性评估** —— 这是第一个拥有已发布 APTS 合规姿态的开源渗透测试平台。
这是一个**透明的差距声明**,而非合规性声明。APTS 禁止部分加分;Tier-1 合规性声明要求 100% 满足所有 72 项 Tier-1 要求。AEGIS 目前满足 72 项 Tier-1 要求中的 57 项(79% —— 阶段 1 基线 + 阶段 2 集群 1 + 2 + 3 + 4 + 5 + 6 已交付,拥有**三个完全满足的域(SE 9/9、MR 13/13、RP 3/3)和人机监督 11/13**),并且就绪性评估诚实地说明了剩余 15 个差距在哪里,并为每个差距制定了具体的关闭计划(阶段 2.5 和阶段 3)。
- [Tier-1 就绪性评估](./docs/compliance/owasp-apts/CONFORMANCE-CLAIM.md)
- [差距总结 (TL;DR)](./docs/compliance/owasp-apts/gap-summary.md)
- [机器可读声明 (`conformance.json`)](./docs/compliance/owasp-apts/conformance.json)
- [证据清单](./docs/compliance/owasp-apts/EVIDENCE-MANIFEST.md)
- [基础模型披露 (BYOM)](./docs/compliance/owasp-apts/FOUNDATION-MODEL-DISCLOSURE.md)
阶段 2(Tier-1 完全合规声明 —— 关闭所有 Tier-1 差距):8-12 周。阶段 3(Tier-2 攀升):阶段 2 之后。
合规姿态涵盖 **AEGIS 自主渗透测试层**(`aegis siege` + LLM 渗透测试包装器 Strix/PTAI/Pentest-Swarm-AI + CLI 编排)。确定性 SAST 扫描器、`@aegis-scan/skills` 方法论包和 `@aegis-wizard/cli` 脚手架是支持组件,并且明确超出此合规姿态的范围。
## 污点分析引擎
基于 AST 的污点追踪器使用 TypeScript 编译器 API 跟踪用户输入在代码中的流动 —— 在单个文件内以及跨模块边界。
**按 CWE 的清理器感知:**
| 清理器 | 阻止 SQLi | 阻止 XSS | 阻止 SSRF | 阻止 CmdInj |
|---|---|---|---|---|
| `parseInt()` | 是 | 否 | 是 | 是 |
| `DOMPurify.sanitize()` | 否 | 是 | 否 | 否 |
| `encodeURIComponent()` | 否 | 是 | 是 | 否 |
| `z.parse()` (Zod) | 是 | 是 | 是 | 是 |
**跨文件传播** —— 一个函数摘要缓存允许追踪器跟踪污点进入导入的函数,检查任何参数是否到达汇点(以及使用哪个 CWE),并在调用者文件中发出发现,同时带有指向原始文件的 `relatedLocations` 指针。支持的模式:
- 裸标识符被调用方:`import { runQuery } from './lib'; runQuery(tainted);`
- 箭头函数变量导出:`export const fn = (x) => sink(x);`
- 默认导出:`export default function (x) { sink(x); }`
- 声明式导出:`export { foo };` / `export { foo as bar };`
- 深度达 5 的桶形重新导出。
- HOC / 柯里化绑定位置(`withAuth((cmd) => exec(cmd))`)在绑定行发出。
- 泛型透传返回污点(`identity(x: T): T`)。
- 方法调用跨文件被调用方(`import { db }; db.query(tainted)`)通过 TypeChecker 解析。
- 条件导入降级 —— 当被调用方模块是三元 / if-else 动态导入时,`confidence: 'medium'`。
- 跨文件清理器识别 —— 对其参数执行 `parseInt()` / `z.parse()` 等操作的导入包装器会抑制发现。
- 正则守护过滤器 —— 在 SSRF 汇点之前的 `if (!regex.test(x)) return;` 会降低 CWE-918。
- SSRF URL 位置检查 —— 仅第一个 `fetch(url, …)` 参数计入;`headers`/`body` 中的被污染值不计入。
## 扫描模式
三层模型 —— 每层都是前一层的严格超集:
| 模式 | 命令 | 静态 SAST | DAST 扫描器 | 主动探针 | 实时 HTTP 流量 |
|------|---------|:-----------:|:-------------:|:-------------:|:-----------------:|
| **scan** | `aegis scan .` | ✓ | – | – | 否 |
| **audit** | `aegis audit .` | ✓ | – | – | 否 |
| **pentest** ⚠ | `aegis pentest . --target URL --confirm` | ✓ | ✓ | – | 是 |
| **siege** ⚠ | `aegis siege . --target URL --confirm` | ✓ | ✓ | ✓ | 是 |
| **fix** | `aegis fix .` | – | – | – | 否 |
| **history** | `aegis history . --blame` | – | – | – | 否 |
| **diff** | `aegis scan . --diff main` | ✓(仅限已更改文件) | – | – | 否 |
| **diff-deps** | `aegis diff-deps --since=HEAD~1` | – | – | – | 否 |
- **静态 SAST**:约 50 个扫描器覆盖安全 / 依赖项 / 质量 / 合规性 —— 纯本地代码分析,不向任何目标发送流量。`scan` 和 `audit` 使用相同的扫描器集(当外部工具的 CLI 已安装时,`audit` 会应用更深入的外部包装器调用)。
- **DAST 扫描器**:ZAP / Nuclei / Strix / PTAI / Pentest-Swarm。向 `--target` URL 发送实时 HTTP 探针 / 请求。模式在 `mode === 'pentest' || 'siege'` 时门控 —— 即使设置了 `--target`,`audit` 和 `scan` 命令也无法调用它们(在这些命令上设置 `--target` 对 DAST 是空操作)。
- **主动探针**:来自 `getAttackScanners()` 的 5 元组 `auth-probe` / `header-probe` / `rate-limit-probe` / `privesc-probe` / `race-probe`。仅 `siege` 调用它们。
## 扫描器(共 67 个)
### 内置(91 个默认启用扫描器 + 5 个可选主动攻击探针 + 扫描器→技能链接)
| 扫描器 | 类别 | CWE(s) |内容 |
|---------|----------|--------|----------------|
| `taint-analyzer` | 安全 | 22, 78, 79, 89, 94, 601, 918, 1321 | **基于 AST 的数据流分析** —— 使用按 CWE 的清理器感知和跨文件传播跟踪用户输入从源到汇 |
| `auth-enforcer` | 安全 | 285, 306 | 缺少认证防护、未保护的路由、RBAC 缺口 |
| `middleware-auth-checker` | 安全 | 285 | Next.js 中间件认证绕过(CVE-2025-29927,`x-middleware-subrequest` 头) |
| `tenant-isolation-checker` | 安全 | 639 | Supabase 查询缺少 `tenant_id` 过滤器 —— 跨租户数据泄露检测 |
| `rls-bypass-checker` | 安全 | 863 | Supabase `.rpc()` 和 `service_role` 使用绕过行级安全 |
| `crypto-auditor` | 安全 | 326, 327, 338, 798 | 弱算法、硬编码密钥、不安全的 RNG、eval() 注入 |
| `zod-enforcer` | 安全 | 20 | 突变路由缺少 Zod 验证,缺少 `.strict()` |
| `sql-concat-checker` | 安全 | 89 | 通过字符串拼接而非参数化查询构建 SQL |
| `template-sql-checker` | 安全 | 89 | 通过 `.rpc()` / `.execute()` / `.query()` / `.$queryRawUnsafe()` / `.$executeRawUnsafe()` / `.raw()` 进行模板字面量 SQL 注入(Supabase、Prisma-raw、knex/mysql2/mongoose/sequelize 汇点)。v0.15.3 扩展了汇点列表 |
| `xss-checker` | 安全 | 79 | HTML 响应中未清理的用户输入 |
| `ssrf-checker` | 安全 | 918 | 服务器端请求伪造模式 |
| `csrf-checker` | 安全 | 352 | 突变处理程序缺少 CSRF 保护 |
| `rate-limit-checker` | 安全 | 770 | 敏感路由缺少速率限制 |
| `path-traversal-checker` | 安全 | 22 | 用户输入流入文件系统操作 |
| `prompt-injection-checker` | 安全 | 77 | LLM 提示中未经清理的用户输入 |
| `redos-checker` | 安全 | 1333 | 灾难性回溯模式 |
| `rsc-data-checker` | 安全 | 200 | 服务器组件将完整数据库记录传递给客户端 |
| `mass-assignment-checker` | 安全 | 915 | 未验证的请求体写入数据库 |
| `open-redirect-checker` | 安全 | 601 | 使用未验证用户输入的重定向 |
| `cors-checker` | 安全 | 346 | CORS 配置错误(通配符 / 反射来源) |
| `header-checker` | 安全 | 693 | 缺少安全头(CSP、HSTS、COOP……) |
| `config-auditor` | 安全 | 16 | Docker、Next.js、Firebase 配置错误 |
| `cookie-checker` | 安全 | 614, 1004 | 缺少 `Secure` / `HttpOnly` / `SameSite` 标志 |
| `entropy-scanner` | 安全 | 798 | 通过香农熵检测高熵字符串(泄露的秘密) |
| `timing-safe-checker` | 安全 | 208 | 使用 `===` 而非常量时间进行秘密比较 |
| `upload-validator` | 安全 | 434 | 文件上传缺少 magic-byte 验证 |
| `error-leakage-checker` | 安全 | 209 | 堆栈跟踪泄露给客户端响应 |
| `env-validation-checker` | 安全 | 16 | 缺少集中式环境变量验证 |
| `http-timeout-checker` | 安全 | 400 | HTTP 调用没有超时 |
| `next-public-leak` | 安全 | 200, 798 | 秘密意外带有 `NEXT_PUBLIC_*` 前缀或在 `'use client'` 文件中读取 |
| `jwt-checker` | 质量 | 327, 345 | JWT 实现问题、弱签名、'none' 算法 |
| `jwt-detector` | 安全 | 798 | 硬编码 JWT 格式凭据检测(`eyJ...`)—— 捕获字面量服务角色令牌和源码中运送的演示令牌。通过 `stripComments` 感知注释。v0.15.2+ |
| `logging-checker` | 质量 | 778 | 缺少结构化日志 —— 自动跳过 CLI 工具项目(检测根目录或工作区子目录中的 `bin` 字段);v0.15.4 也跳过空项目(0 个源文件) |
| `console-checker` | 质量 | 532 | 生产代码中的调试工件(`console.log`、`debugger;`、TODO/FIXME) |
| `gdpr-engine` | 合规性 | — | GDPR/DSGVO:隐私页面、同意、PII、Google 字体、双重选择加入 |
| `soc2-checker` | 合规性 | — | SOC 2 Type II 控制缺口 |
| `iso27001-checker` | 合规性 | — | ISO 27001 控制映射 |
| `pci-dss-checker` | 合规性 | — | PCI DSS 持卡人数据暴露 |
| `pagination-checker` | 安全 | 770 | 数据库查询没有行限制 |
| `i18n-quality` | 国际化 | — | 硬编码的 UI 字符串、缺少区域设置键 |
| `supply-chain` | 依赖项 | 829, 1357 | 依赖混淆、拼写错误抢注、锁文件完整性、monorepo 感知的幻影依赖检测(处理 TS 路径别名 + pnpm/npm/yarn 工作空间 + 子包依赖) |
| `dep-confusion-checker` | 依赖项 | 1357 | 作用域包没有私有注册表映射 |
### 外部包装器(20 个扫描器,未安装时自动跳过)
| 扫描器 | 安装方式 | 类别 |
|---------|---------|----------|
| Semgrep | `brew install semgrep` | SAST |
| Bearer | `brew install bearer` | SAST |
| Gitleaks | `brew install gitleaks` | 密钥 |
| TruffleHog | `brew install trufflehog` | 密钥 |
| OSV-Scanner | `brew install osv-scanner` | 依赖项 |
| npm audit | 内置于 npm | 依赖项 |
| license-checker | `npm i -g license-checker` | 依赖项 |
| Nuclei | `brew install nuclei` | DAST |
| OWASP ZAP | 需要 Docker | DAST |
| Trivy | `brew install trivy` | 基础设施 |
| Hadolint | `brew install hadolint` | 基础设施 |
| Checkov | `pip install checkov` | 基础设施 |
| testssl.sh | `brew install testssl` | TLS |
| React Doctor | `npx react-doctor@latest .` | 质量 |
| axe / Lighthouse | 需要 Chromium | 可访问性 |
| Lighthouse Performance | 需要 Chromium | 性能 |
| Subfinder | `brew install subfinder` | 侦察(被动子域名 —— 仅限 pentest 模式) |
| Strix | `pip install strix`(或沙箱镜像) | LLM 代理渗透测试 |
| PTAI | `pip install ptai`(或沙箱镜像) | LLM 代理渗透测试 |
| Pentest-Swarm-AI | `go install github.com/Armur-Ai/Pentest-Swarm-AI/cmd/pentestswarm@latest`(或沙箱镜像) | LLM 代理渗透测试 |
### 攻击探针(5 个,仅限 siege 模式)
`auth-probe`、`header-probe`、`rate-limit-probe`、`privesc-probe`、`race-probe`
## 评分
| 分数 | 等级 | 徽章 |
|-------|-------|-------|
| 950-1000 | S | FORTRESS |
| 850-949 | A | HARDENED |
| 700-849 | B | SOLID |
| 500-699 | C | NEEDS_WORK |
| 300-499 | D | AT_RISK |
| 0-299 | F | CRITICAL |
**BLOCKER** 和 **CRITICAL** 严重性在语义上是等价的 —— 两者都代表最高严重性等级,并且无论其他发现如何,都会立即将分数强制设为 0 / 等级 F。扫描器可以发出任一标签;评分引擎将它们同等对待(在外部审查暴露扫描在表格中悄悄埋有关键发现却返回等级 S 后,这在 v0.15.1 中统一了)。属于此等级的发现示例:eval 注入、硬编码密钥、未认证的管理路由、服务角色密钥误用、未限定范围查询上的 SQL 注入。
## MCP 服务器 —— 在任何 AI 编码代理中使用 AEGIS
AEGIS 提供了一个模型上下文协议服务器,以便 AI 编码代理(Claude Code、Cursor、Continue、Zed……)可以直接从对话中运行扫描、查询发现和检查合规性姿态。本地安装,然后在代理的 MCP 配置中注册服务器。
**安装:**
```
npm install -D @aegis-scan/mcp-server
```
**注册(Claude Code** — `~/.config/claude-code/mcp.json`**,Cursor** — `.cursor/mcp.json`**,等等):**
```
{
"mcpServers": {
"aegis": {
"command": "npx",
"args": ["-y", "@aegis-scan/mcp-server"]
}
}
}
```
**暴露的工具**(可从代理调用,无需离开聊天):
| 工具 | 目的 |
|------|---------|
| `aegis_scan` | 对项目路径运行扫描;返回发现结果 + 评分 |
| `aegis_findings` | 过滤/查询最近一次扫描的发现结果 |
| `aegis_score` | 已扫描项目的 0-1000 分 + 等级 + 徽章 |
| `aegis_compliance` | GDPR / SOC 2 / ISO 27001 / PCI-DSS 姿态总结 |
| `aegis_fix_suggestion` | 获取特定发现的修复建议 |
对于已经运行 Claude Code / Cursor 的开发者来说,摩擦很小 —— 您的助手现在可以在无需切换上下文的情况下进行扫描和分类。
## CI/CD — GitHub Action
即插即用的安全门禁,适用于任何 GitHub Actions 工作流。发布包含评分、严重性表和主要发现结果的 PR 评论;当分数降至可配置阈值以下时使构建失败。
**分发说明:** 该操作位于仓库内的 `ci/github-action/action.yml`(未发布到 GitHub Marketplace)。使用者通过 `uses: RideMatch1/a.e.g.i.s/ci/github-action@` 引用它,固定到已发布的标签(例如 `v0.16.6`)。
```
name: Security
on: [push, pull_request]
jobs:
aegis:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: RideMatch1/a.e.g.i.s/ci/github-action@v0.16.6 # pin to a specific release tag
with:
mode: scan # 'scan' (quick) or 'audit' (full)
path: . # project to scan (default: '.')
fail-below: 700 # set to 0 to never fail the build
comment-on-pr: true # post PR comment with findings table
```
**输入参数:** `mode`、`path`、`fail-below`、`comment-on-pr`、`upload-sarif`、`diff-against`、`aegis-version`。完整架构见 `ci/github-action/action.yml`。务必固定到特定发布标签(`@v0.16.6`)而不是 `@main` —— 浮动引用可能在 AEGIS 自身更新时悄悄破坏 CI。
## 贡献
开发设置、工作流和范围边界请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md)。安全问题:[SECURITY.md](./SECURITY.md)。
欢迎通过 [GitHub Issues](https://github.com/RideMatch1/a.e.g.i.s/issues) 提交错误报告和功能请求;更广泛的设计问题请通过 [Discussions](https://github.com/RideMatch1/a.e.g.i.s/discussions)。
## 致谢
集成工具和灵感的完整归属请参阅 [CREDITS.md](./CREDITS.md)。
## 许可证
MIT
**您的 vibe-coded 应用理应配备的偏执型审计工具。**



[](https://www.npmjs.com/package/@aegis-scan/cli)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/ci.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/codeql.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/scorecard.yml)
[](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/gitleaks.yml)
[](./ROADMAP.md)
针对 **Next.js + Supabase + React** 的栈特定安全扫描器。91 个默认启用的扫描器(内置检查器 + 外部工具包装器,包括 19 个传统 SAST/DAST 工具 + 1 个被动子域名侦察 + 3 个 LLM 代理渗透测试框架:Strix、PTAI、Pentest-Swarm-AI),外加 5 个可选的主动攻击探针、基于 AST 的跨文件污点分析、0-1000 分评分及 `FORTRESS → CRITICAL` 等级。最佳使用方式是**配合** Semgrep / CodeQL —— 而非替代它们。提供 CLI、MCP 服务器以及用于 CI 集成的 GitHub-Actions 配方。
## 什么是 AEGIS?
AEGIS (Automated Enterprise-Grade Inspection Suite) 能够发现通用 SAST 工具因缺乏框架特定规则而遗漏的漏洞。AEGIS 覆盖了 Next.js / Supabase / React 的缺口 —— 多租户隔离、RLS 绕过、服务器组件数据泄露、Zod 强制校验、`.rpc()` SQLi、批量赋值、认证防护缺口 —— 而 Semgrep / CodeQL 则覆盖通用 SAST 领域。
引擎的独特之处在于:AEGIS 追踪代码中的 **数据流** —— 在单个文件内**以及**跨模块边界:
```
// Same-file taint:
const id = req.body.id; // source: user input
const trimmed = id.trim(); // propagates through method call
const query = `SELECT * WHERE id = ${trimmed}`; // propagates through template
db.query(query); // sink: SQL Injection (CWE-89, CRITICAL)
// Cross-file taint:
// lib/db.ts — export function runQuery(sql: string) { db.query(sql); }
// api/route.ts — import { runQuery } from '../lib/db';
// runQuery(req.body.q); // AEGIS traces the sink across the boundary
```
按 CWE 的清理器感知:`parseInt()` 阻止 SQL 注入但不阻止 XSS,`DOMPurify.sanitize()` 阻止 XSS 但不阻止 SQL 注入,`encodeURIComponent()` 阻止 SSRF 但不阻止路径遍历(框架在文件系统访问前会解码)。
套件组成:静态分析管线中的 **91 个默认启用扫描器**(内置正则 + AST 污点分析器 + RPC 特定 SQLi 扫描器 + 16 个外部工具包装器:Semgrep、Gitleaks、ZAP、Trivy、Nuclei、Bearer、Checkov、Hadolint、TruffleHog、OSV-Scanner、testssl.sh、React Doctor、Lighthouse、Axe……),**5** 个可选的实时攻击探针(需使用 `--confirm` 参数的 `aegis siege` / `pentest`),**4** 个合规性框架(GDPR / SOC 2 / ISO 27001 / PCI-DSS),一个供 AI 代理使用的 MCP 服务器,以及一个可复用的 GitHub-Actions 配方(位于 `ci/github-action/`),用于在 PR 中发布评分和主要发现结果。
## 架构
```
┌──────────────────┐
│ aegis.config.json│ ← user config (optional)
└────────┬─────────┘
│
┌────────▼─────────┐
│ ConfigLoader │ (@aegis-scan/core)
│ (Zod-strict) │
└────────┬─────────┘
│
┌────────▼─────────┐
│ Orchestrator │ walkFiles → per-scanner dispatch
└────────┬─────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌────────────┐ ┌──────────────────┐
│ Built-in scanners│ │ Taint │ │ External wrappers│
│ (41 regex rules)│ │ Analyzer │ │ (Semgrep, ZAP, …│
│ │ │ (AST + │ │ auto-skip when │
│ │ │ TS │ │ not installed) │
│ │ │ Compiler)│ │ │
└─────────┬────────┘ └─────┬──────┘ └────────┬─────────┘
│ │ │
└─────────────┬────┴──────────────────┘
▼
┌──────────────────┐
│ Findings │
└─────────┬────────┘
│
┌─────────▼──────────┐
│ Suppression filter │ ← inline + config suppressions
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ Score / Grade / │ ← 0-1000, blocker override
│ Badge / Confidence│
└─────────┬──────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
Terminal JSON SARIF 2.1.0
(colour) (machine) (GH Code
Scanning)
│
▼
HTML / Markdown
(dashboards, PR comments)
```
**污点分析器**是正则扫描器的跨组件对应物:它使用 TypeScript 编译器 API 解析每个文件,遍历 AST 以查找源 → 汇数据流,咨询模块图 + 函数摘要缓存以进行跨文件传播,并将发现结果输出到同一个管线。每个扫描器从 `@aegis-scan/core` 读取数据并写入共享的 `Finding[]` 数组;编排器负责调度,评分聚合器负责最终判定。
## 快速开始
```
npx @aegis-scan/cli scan .
```
```
# 或全局安装
npm install -g @aegis-scan/cli
aegis scan .
# 使用所有扫描器进行完整审计
aegis audit .
# 生成配置
aegis init .
```
## 脚手架创建新项目
正在启动一个 Next.js + Supabase 项目?跳过安全改造阶段 —— 让 AEGIS 从提交 0 开始就奠定一个生产就绪的基础。
```
aegis new my-saas
```
脚手架包含:
- **11 个洁净室安全原语** —— `secureApiRouteWithTenant`,
`requireRole`(RBAC),速率限制(感知 X-Forwarded-For),SSRF 安全
`fetch`,AES-256-GCM 加密,Zod 严格模式模式,PII 清洗日志
记录器(50+ 种编辑模式),AppError 层次结构。
- **RLS 引导迁移** —— 带有严格策略 + 注册时自动创建 Profile 触发器的 `tenants` + `profiles` 表。
- **加固的中间件** —— CSRF + 9 个安全头
(包括 COEP / COOP / CORP)+ 速率限制。
- **示例 API 路由**(59 行代码)组合了所有 6 个原语 —— 大规模地教授
组合模式,并带有正确的错误映射
(`ForbiddenError` → 403,`ZodError` / `SyntaxError` → 400)。
- **GitHub Action PR 门禁**,使用 `mode: audit` + 预装的 Semgrep /
OSV-Scanner / Gitleaks / TruffleHog(SHA-256 验证)。
- **AI 安全规则**(`CLAUDE.md`)供 AI 编码助手使用。
- **Husky 预推送钩子**,运行 `aegis scan --fail-on-blocker`。
**基线:** 一个新的脚手架评分为 **997/A HARDENED**,包含
**0 BLOCKER**(经验验证 —— `npm install` + `aegis scan`
端到端)。5 个 MEDIUM 基线发现 —— 2 个扫描器误报(计划在 v0.13 扫描器修复中解决)+ 3 个 Next.js 生态系统固有的供应链项目 —— 在脚手架自身的 README 的“已知基线发现”部分有文档记录:属于教学性质,而非抑制。
**改造现有项目:**
```
aegis init
```
将 `aegis.config.json` + `.github/workflows/aegis.yml` +
`CLAUDE.md` + `.husky/pre-push` 写入当前目录。
默认跳过已存在文件(绝不覆盖用户文件)。使用 `--force`
统一覆盖这三个扩展文件,或使用 `--skip-ci` /
`--skip-claude` / `--skip-husky` 逐个文件选择退出。部分写入
安全:成功的写入会保留在磁盘上,即使后续写入失败 —— 该
命令修改用户的项目,因此它从不回滚。
请参阅 [v0.12 脚手架转向设计规范](./docs/design/2026-04-18-v0.12-scaffolding-pivot.md)
了解模板结构、原语来源策略和退出标准。
## AEGIS 是一个三层安全工具包
AEGIS 提供三个协同包,覆盖完整的发货前安全生命周期。专业的安全团队会同时使用这三者。
| 包 | 角色 | 快速开始 |
|---|---|---|
| [`@aegis-wizard/cli`](https://www.npmjs.com/package/@aegis-wizard/cli) | **构建** —— 交互式脚手架 + Next.js + Supabase + shadcn SaaS 的代理简报生成器 | `npx -y @aegis-wizard/cli new my-saas --interactive` |
| [`@aegis-scan/cli`](https://www.npmjs.com/package/@aegis-scan/cli) | **扫描** —— 防御性 SAST 扫描器(五包家族)。91 个默认启用的扫描器(内置检查器 + 19 个 SAST/DAST 包装器 + 1 个被动子域名侦察 + 3 个 LLM 代理渗透测试框架)外加 5 个可选的主动攻击探针,基于 AST 的跨文件污点分析。 | `npx -y @aegis-scan/cli scan ./my-saas` |
| [`@aegis-scan/skills`](https://www.npmjs.com/package/@aegis-scan/skills) | **测试** —— 面向 Claude Code 和兼容 AI 代理的可选红队技能库。为您的代理注入攻击类方法论,以便在发货前对构建内容进行压力测试。 | `npm i -g @aegis-scan/skills && aegis-skills install` |
用向导构建。扫描您构建的内容。以红队风格测试它。完整生命周期,一个工具链,一个符合归因要求的开源许可栈。这三个包独立发布(`wizard-v*`、`v*` 和 `skills-v*` 标签命名空间),因此互不阻塞 —— 但它们在架构假设上协同校准:一个由向导脚手架创建的项目在扫描评分中低于 960 分被视为模式缺陷,而在技能库下运行的代理可以获取扫描器在防御中检测到的攻击类。
```
# 一次性完整剧本工作流
npx -y @aegis-wizard/cli new my-saas --interactive # build
npx -y @aegis-scan/cli scan ./my-saas # scan
npm i -g @aegis-scan/skills && aegis-skills install # equip agent for test
```
有关完整文档,请参阅各个包的 README:
- [`packages/wizard-cli/README.md`](./packages/wizard-cli/README.md)
- [`packages/README.md`](./packages/skills/README.md)
- [`docs/patterns/index.md`](./docs/patterns/index.md) 了解向导捆绑的模式目录
`@aegis-scan/skills` 的负责任使用在本仓库的 `SECURITY.md` 中有文档记录 —— 攻击方法论库仅限授权测试使用。
## 通用 SAST 工具遗漏而 AEGIS 能发现的内容
这些是 Next.js + Supabase 应用程序中的**栈特定**漏洞。通用工具没有针对它们的规则,因为它们是框架特定的模式:
| 漏洞 | 类别 |
|---|---|
| 缺少 `tenant_id` 过滤器 —— 跨租户数据泄露 | 多租户 |
| API 路由中的 `service_role` RLS 绕过 | Supabase |
| 通过 `.rpc()` 模板插值在函数名中注入 SQL | Supabase |
| 批量赋值 —— 未验证的 `request.json()` 传入 `.insert()` | Supabase |
| 敏感端点缺少速率限制 | Next.js API |
| API 路由缺少认证防护 | Next.js API |
| 服务器组件将完整数据库记录传递给客户端 (CWE-200) | React Server Components |
| 提示注入 —— LLM 提示中的用户输入 | AI / LLM |
| 突变模式缺少 Zod `.strict()` | 验证 |
| 数据库查询没有分页 | 性能 / DoS |
AEGIS 不是 Semgrep 的替代品 —— 它是 **Semgrep 的倍增器**。当 Semgrep 已安装时,AEGIS 会自动包装它,您将同时获得两者的效果。
## 真实世界语料库
AEGIS 针对一个包含 8 个项目的公共源代码语料库进行了调优。每个发现都经过人工标注 TP/FP,重复出现的 FP 模式被固定为回归测试。以下是 **冻结的 v0.11.2 基线** 分数 —— 在 v0.17 线上运行新鲜语料库计划在下个次要版本进行。方法论、FP 分类严谨性和调优姿态未变;绝对数值可能因 v0.11.2 后的精度改进(现场报告子类 1-4,扫描器系列自用驱动的修复贯穿 v0.16.x)而略有变动。
| 项目 | 技术栈 | v0.9.5 | v0.10.0 | v0.11.0 | v0.11.1 | v0.11.2 |
|---|---|---|---|---|---|---|
| shadcn/taxonomy | Next.js + next-auth | 985 A | 984 A | 984 A | 984 A | 984 A |
| formbricks | Next.js + Prisma | 968 A | 967 A | 967 A | 966 A | 966 A |
| midday | Next.js + Supabase | 957 A | 958 A | 957 A | 954 A | 954 A |
| dub | Next.js + Prisma | 956 A | 951 A | 950 A | 950 A | 950 A |
| documenso | Next.js + Prisma | 956 A | 956 A | 956 A | 956 A | 956 A |
| trigger.dev | Next.js + Prisma | 953 A | 953 A | 952 A | 952 A | 952 A |
| cal.com | Next.js + Prisma | 947 A | 947 A | 947 A | 947 A | 947 A |
| supabase-studio | Next.js + Supabase | 0 F* | 0 F* | 0 F* | 0 F* | 0 F* |
**v0.11.2 与 v0.11.1 的变动:`|Δ|` 最大 = 0 分,0 次等级变动。**
变更集是一个狭窄的扫描器精度修复(租户隔离检查器注释散文剥离 + 召回率拓宽 + URL 参数范围抑制)。抑制分支仅在这些项目中不存在的特定 AST 形状上触发 —— 语料库分数严格不变。驱动本次发布的自用项目:8 个 `tenant-isolation-checker` FP → 0。
**v0.11.1 与 v0.11.0 的变动:`|Δ|` 最大 = 3 分,0 次等级变动。**
变更集由自用驱动 —— 一次真实的 Next.js+Supabase 扫描
暴露了 5 个不同的 auth-enforcer + ssrf-checker FP 类,这些不在
v0.11 推测性路线图上。自用项目本身从
940/A 移动到 946/A,消除了 6 个误报发现。midday 的微小漂移(-3)是由于 ssrf
排放减少带来的类别上限算术 —— 属于噪声级别,等级不变。
**v0.11.0 与 v0.10.0 的变动:`|Δ|` 最大 = 1 分,0 次等级变动。**
同一变更集关闭了 **+4 个合成召回率金丝雀测试**,首次使
27 个金丝雀测试套件达到 **27/27 全绿**。
解读:真实世界语料库的精度保持稳定,同时
在有文档记录的 CWE / 扫描器缺口上的召回率有所提高。双重视角是有意的 —— 仅看精度会认为工具因未改变分数而“良好”,这是循环论证。
*\*supabase-studio 保留了两个 BLOCKER 发现,涉及发货源代码中合法的 SQL
字符串拼接(`Reports.constants.ts` 和
`Logs.utils.ts`)。这些不是误报 —— 一个具有不同于面向客户应用威胁模型的 Supabase 内部管理仪表板,但按字面意思,这些发现是准确的。*
v0.11.0 中的语料库驱动修复(analyzer-core 消费者端对称性 +
新扫描器 + 精度调整;详情见
[CHANGELOG.md](./CHANGELOG.md#0110--2026-04-17--recall-honesty-part-2)):
- 新模块 `ast/guard-flow.ts` —— 在函数摘要(v0.9.1 构建端)和污点追踪器(v0.11 消费者端)之间共享支配者遍历。通过一个连接到三个汇排放调用点的 `isSinkGuardedByKnownPredicate`,关闭了 D4(命名函数 URL 守护)+ D5(startsWith-字面量守护)+ Z3(跨文件消费者端守护对称性)。
- 新扫描器 `middleware-auth-checker` —— 通过 `x-middleware-subrequest` 头进行 Next.js 中间件认证绕过(CVE-2025-29927)。
将内置扫描器数量从 40 提升到 41。
- `ssrf-checker` 针对用户定义类型化 URL 守护(名称标记 + `: boolean` 返回)的结构性 SAFE_PATTERN。在 D4 形状的允许列表辅助函数上静默 ssrf-checker —— 两个扫描器现在在同一结构信号上协同静默。
- `ssrf-checker` 库包装器启发式 (Z4) —— 导出的 fetch-
包装器中,URL 作为参数不再在包装器位置发出 CWE-918。
- `timing-safe-checker` 的 UPPERCASE 环境变量名称允许列表扩大,以覆盖常见的 `process.env.SECRET` 形状。
- **基于金丝雀的召回率测量** —— `packages/benchmark/canary-
fixtures/` 是一个 27 个金丝雀测试套件,覆盖 5 个套件验证 + 10 个延迟项目目标 + 12 个盲点压力测试。v0.10 后 23/27 通过;剩余 4 个(D4 / D5 污点分析器守护流、S1 CVE-2025-29927 中间件绕过、S12 时间安全变量名称允许列表)是明确的 v0.11 范围。
## 诚实的局限性
运行安全工具是一个信任练习。以下是 AEGIS **不擅长** —— 或根本做不到的事情 —— 提前文档记录,以便您决定 AEGIS 在您的技术栈中适合哪个位置:
- **跨文件污点精度在大规模下未经测量。** 当前的自用语料库(6 个生产级 Next.js 代码库)具有太少的跨文件排放,无法产生统计有效的精度数字。因此,跨文件发现以 `confidence: 'medium'` 而非默认值发布。单文件污点由基准测试(30/30 严格)测量,并且是引擎的主要优势。
- **不是通用 SAST 替代品。** AEGIS 是栈特定的。在 Python / Go / Rust / Java 上它毫无用处。在非 Next.js 的 Node 上,它仍然覆盖通用类(SQLi、SSRF、路径遍历、提示注入、加密误用),但跳过框架特定规则。请配合 Semgrep / CodeQL / njsscan 使用,切勿替代。
- **合规性检查是基于模式的规则,而非审计级别。** `gdpr-engine`、`soc2-checker`、`iso27001-checker`、`pci-dss-checker` 覆盖了数十种最常见的模式级控制(例如,GDPR:隐私页面、同意、PII 处理、自托管字体、双重选择加入、保留)。它们**不是**认证审计员的替代品。
- **仅限 TypeScript / JavaScript。** 不支持 Python / Go / Rust / Java / C# / Ruby / PHP。
- **外部工具包装器要求该工具位于 PATH 上。** 当底层二进制文件缺失时,Semgrep / Gitleaks / Trivy / ZAP / OSV-Scanner / …… 集成会自动跳过。CLI 报告 `Confidence: LOW` 并附带 "Missing: …" 说明,并且当没有可用的安全焦点外部工具时,CI PR 评论徽章会获得 `[LOW-CONFIDENCE]` 前缀。
- **单维护者项目。** CONTRIBUTING / SECURITY / CODE_OF_CONDUCT / CODEOWNERS / issue 模板均已就位;欢迎贡献和审查帮助。
## OWASP-APTS 合规姿态
AEGIS 发布了一份公开的 **OWASP 自主渗透测试标准 (APTS) Tier-1 就绪性评估** —— 这是第一个拥有已发布 APTS 合规姿态的开源渗透测试平台。
这是一个**透明的差距声明**,而非合规性声明。APTS 禁止部分加分;Tier-1 合规性声明要求 100% 满足所有 72 项 Tier-1 要求。AEGIS 目前满足 72 项 Tier-1 要求中的 57 项(79% —— 阶段 1 基线 + 阶段 2 集群 1 + 2 + 3 + 4 + 5 + 6 已交付,拥有**三个完全满足的域(SE 9/9、MR 13/13、RP 3/3)和人机监督 11/13**),并且就绪性评估诚实地说明了剩余 15 个差距在哪里,并为每个差距制定了具体的关闭计划(阶段 2.5 和阶段 3)。
- [Tier-1 就绪性评估](./docs/compliance/owasp-apts/CONFORMANCE-CLAIM.md)
- [差距总结 (TL;DR)](./docs/compliance/owasp-apts/gap-summary.md)
- [机器可读声明 (`conformance.json`)](./docs/compliance/owasp-apts/conformance.json)
- [证据清单](./docs/compliance/owasp-apts/EVIDENCE-MANIFEST.md)
- [基础模型披露 (BYOM)](./docs/compliance/owasp-apts/FOUNDATION-MODEL-DISCLOSURE.md)
阶段 2(Tier-1 完全合规声明 —— 关闭所有 Tier-1 差距):8-12 周。阶段 3(Tier-2 攀升):阶段 2 之后。
合规姿态涵盖 **AEGIS 自主渗透测试层**(`aegis siege` + LLM 渗透测试包装器 Strix/PTAI/Pentest-Swarm-AI + CLI 编排)。确定性 SAST 扫描器、`@aegis-scan/skills` 方法论包和 `@aegis-wizard/cli` 脚手架是支持组件,并且明确超出此合规姿态的范围。
## 污点分析引擎
基于 AST 的污点追踪器使用 TypeScript 编译器 API 跟踪用户输入在代码中的流动 —— 在单个文件内以及跨模块边界。
**按 CWE 的清理器感知:**
| 清理器 | 阻止 SQLi | 阻止 XSS | 阻止 SSRF | 阻止 CmdInj |
|---|---|---|---|---|
| `parseInt()` | 是 | 否 | 是 | 是 |
| `DOMPurify.sanitize()` | 否 | 是 | 否 | 否 |
| `encodeURIComponent()` | 否 | 是 | 是 | 否 |
| `z.parse()` (Zod) | 是 | 是 | 是 | 是 |
**跨文件传播** —— 一个函数摘要缓存允许追踪器跟踪污点进入导入的函数,检查任何参数是否到达汇点(以及使用哪个 CWE),并在调用者文件中发出发现,同时带有指向原始文件的 `relatedLocations` 指针。支持的模式:
- 裸标识符被调用方:`import { runQuery } from './lib'; runQuery(tainted);`
- 箭头函数变量导出:`export const fn = (x) => sink(x);`
- 默认导出:`export default function (x) { sink(x); }`
- 声明式导出:`export { foo };` / `export { foo as bar };`
- 深度达 5 的桶形重新导出。
- HOC / 柯里化绑定位置(`withAuth((cmd) => exec(cmd))`)在绑定行发出。
- 泛型透传返回污点(`identity标签:DAST工具, GitHub Actions, LLM代理测试, MITM代理, Next.js安全, Node.js应用, React安全, SAST工具, Supabase安全, TypeScript开发, 云安全监控, 人工智能安全, 代码安全, 企业级安全, 合规性, 子域名侦察, 安全扫描, 安全评分, 对称加密, 开源框架, 持续集成, 时序注入, 漏洞分析, 漏洞枚举, 自动化payload嵌入, 自动化审计, 自动化攻击, 自动笔记, 路径探测, 静态分析