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 A E G I S **您的 vibe-coded 应用理应配备的偏执型审计工具。** ![License: MIT](https://img.shields.io/badge/License-MIT-green.svg) ![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue) ![Node 20+](https://img.shields.io/badge/Node-20%2B-brightgreen) [![npm](https://img.shields.io/npm/v/@aegis-scan/cli?label=%40aegis-scan%2Fcli)](https://www.npmjs.com/package/@aegis-scan/cli) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7fadd56860093259.svg)](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/ci.yml) [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/badd1cb13a093300.svg)](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/codeql.yml) [![OSSF Scorecard](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/70b48acb1d093301.svg)](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/scorecard.yml) [![Gitleaks](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/dacf8635fb093302.svg)](https://github.com/RideMatch1/a.e.g.i.s/actions/workflows/gitleaks.yml) [![路线图](https://img.shields.io/badge/roadmap-public-blue)](./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
标签:DAST工具, GitHub Actions, LLM代理测试, MITM代理, Next.js安全, Node.js应用, React安全, SAST工具, Supabase安全, TypeScript开发, 云安全监控, 人工智能安全, 代码安全, 企业级安全, 合规性, 子域名侦察, 安全扫描, 安全评分, 对称加密, 开源框架, 持续集成, 时序注入, 漏洞分析, 漏洞枚举, 自动化payload嵌入, 自动化审计, 自动化攻击, 自动笔记, 路径探测, 静态分析