ShyamNayak27/Codebase-Vulnerability-Scanner

GitHub: ShyamNayak27/Codebase-Vulnerability-Scanner

一款开发者优先的代码库漏洞扫描器,结合静态 AST 分析与 Docker 动态攻击验证,在代码发布前自动检测 SQL 注入、XSS、硬编码密钥和脆弱依赖项,提供低误报的可操作安全发现。

Stars: 2 | Forks: 0

# 🛡️ Codebase 漏洞扫描器 **一款在代码发布前捕捉真实漏洞的预检安全扫描器。** [![Node.js 20+](https://img.shields.io/badge/Node.js-20%2B-green?style=flat-square&logo=node.js)](https://nodejs.org) [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org) [![Python 3.8+](https://img.shields.io/badge/Python-3.8%2B-yellow?style=flat-square&logo=python)](https://python.org) [![License: MIT](https://img.shields.io/badge/License-MIT-purple?style=flat-square)](./LICENSE) [![VS Code](https://img.shields.io/badge/VS%20Code-Extension-007ACC?style=flat-square&logo=visual-studio-code)](https://code.visualstudio.com) *静态分析 · 动态验证 · 密钥检测 · 依赖审计 —— 集于一身。*
## 这是什么? **Codebase Vulnerability Scanner (CVS)** 是一款开发者优先的安全工具,介于代码编辑器和 CI 流水线之间。它将四个独立的扫描引擎整合为一次统一的扫描——为您提供经过确认且具有可操作性的结果,而不是一大堆嘈杂的误报。 它有两种工作模式: - **VS Code 扩展** —— 只需一条命令即可扫描您打开的项目,并在功能丰富的侧边栏面板中内联查看结果 - **CLI** —— 通过 `node packages/cli/dist/index.js scan ./your-project` 集成到任何构建流水线中 与仅进行静态分析的传统 SAST 工具不同,此扫描器通过以下方式**证明**漏洞是真实的: 1. 通过 AST 遍历检测可疑代码模式(静态) 2. 在 Docker 中启动您的应用 3. 向运行中的应用发送真实的攻击 payload 4. 只有在应用实际响应出被利用的证据时,才将结果标记为 `confirmed` ## 目录 - [它能检测什么](#-what-it-catches) - [支持的语言与框架](#-supported-languages-and-frameworks) - [工作原理 —— 详解](#-how-it-works--in-detail) - [第 1 阶段:插件检测](#stage-1-plugin-detection) - [第 2 阶段:静态分析 —— AST 污染追踪](#stage-2-static-analysis--ast-taint-tracking) - [第 3 阶段:密钥扫描器](#stage-3-secrets-scanner) - [第 4 阶段:依赖审计器](#stage-4-dependency-auditor) - [第 5 阶段:Docker 编排](#stage-5-docker-orchestration) - [第 6 阶段:动态攻击引擎](#stage-6-dynamic-attack-engine) - [第 7 阶段:结果存储与差异比对](#stage-7-findings-store-and-diffing) - [IPC 层](#ipc-layer-extension-communication) - [架构](#-architecture) - [安装说明](#-installation) - [用法](#-usage) - [VS Code 扩展](#vs-code-extension) - [CLI](#cli) - [配置参考](#configuration-reference) - [解读您的结果](#-understanding-your-results) - [常见问题](#-faq) - [许可证](#-license) - [联系方式](#-contact) ## 它能检测什么 | 漏洞 | 检测方法 | 严重程度 | |---|---|---| | **SQL 注入**(基于错误、布尔盲注、基于时间) | AST 污染追踪 → 动态攻击 | Critical | | **跨站脚本攻击 (XSS)** | AST 污染追踪 → 动态验证 | High | | **不安全的直接对象引用 (IDOR)** | 路由模式分析 → 动态探测 | High | | **硬编码的密钥和 API 密钥** | 正则表达式规则 + Shannon 熵分析 | Critical / High | | **存在漏洞的依赖项** | 查询 OSV.dev 数据库 | Critical → Low | | **安全配置错误** | 实时 HTTP 标头和路径探测 | Medium / Info | ## 支持的语言与框架 扫描器采用**插件架构** —— 每种语言/框架都有各自的插件来实现标准接口。核心引擎是与框架无关的。 | 插件 | 框架 | 检测信号 | AST 引擎 | |---|---|---|---| | `plugin-express` | Node.js + Express.js | 包含 `express` 依赖的 `package.json` | `@babel/parser` + `@babel/traverse` | | `plugin-python` | Python + Flask | `requirements.txt`, `app.py`, `pyproject.toml` | Python `ast` 模块(通过 `parser.py`) | **计划支持:** Django, FastAPI, Spring Boot, Laravel 如果没有插件与您的项目匹配,扫描器仍会运行**密钥检测**和**依赖审计** —— 依赖插件的阶段将被跳过并发出警告。 ## 工作原理 —— 详解 每次扫描都会运行由 `packages/cli/src/scanner.ts` 管理的确定性 7 阶段流水线。 ### 第 1 阶段:插件检测 ``` detectPlugin(config.projectPath) → LanguagePlugin | null ``` **插件注册中心**(`packages/cli/src/plugin-registry.ts`)会遍历所有已注册的插件,并调用每个插件的 `.detect(projectPath)` 方法。第一个识别出项目的插件将被选中。检测基于文件系统 —— 无网络调用,无猜测。 - **Express 插件**通过检查 `package.json` 依赖项中是否包含 `express` 键来进行检测 - **Python/Flask 插件**通过检查是否存在 `requirements.txt`, `app.py`, `wsgi.py`, `pyproject.toml` 或 `Pipfile` 来进行检测 ### 第 2 阶段:静态分析 —— AST 污染追踪 #### Express / Node.js Express 插件(`packages/plugin-express/src/`)分两步工作: **步骤 A —— 路由解析器**(`route-parser.ts`) 使用 `@babel/parser` 将每个 `.js` / `.ts` 源文件解析为完整的抽象语法树 (AST)。然后遍历 AST 查找 Express 路由注册: ``` app.get('/users/:id', (req, res) => { ... }) app.post('/login', handler) router.put('/profile', ...) ``` 每个发现的路由都会记录其 HTTP 方法、路径模式、源文件和行号。 **步骤 B —— 污染追踪器**(`taint-walker.ts`) 对于每个路由处理器,污染追踪器会重新遍历 AST,寻找**污染流** —— 即用户控制的输入(`req.query.*`, `req.body.*`, `req.params.*`, `req.headers.*`)未经清理直接流入敏感接收器的路径。 追踪的接收器: - **SQLi 接收器:** 数据库对象(`db`, `pool`, `connection`, `client`, `knex`, `sequelize`)上的 `.query()`, `.raw()`, `.execute()`, `.exec()`, `.prepare()` - **XSS 接收器:** 参数中包含用户输入且未使用已知清理器(`sanitize`, `escape`, `DOMPurify`, `sanitizeHtml` 等)的 `res.send()`, `res.write()`, `res.end()`, `res.render()` 当发现污染流时,追踪器会生成一个**候选项** —— 一条轻量级记录,包含漏洞类型、文件、行号、路由、HTTP 方法、参数名称和参数位置(query/body/params/header)。候选项尚不是最终的发现结果;它们会被传递给攻击引擎进行验证。 #### Python / Flask Python 插件(`packages/plugin-python/src/`)将 AST 分析委托给原生的 Python 子进程(`parser.py`)以实现准确的 Python 解析。该脚本使用 Python 内置的 `ast` 模块来: 1. 遍历项目目录中的所有 `.py` 文件 2. 识别 Flask 路由装饰器(`@app.route`, `@blueprint.route`) 3. 追踪从 `request.args`, `request.form`, `request.json`, `request.get_json()` 到 SQL 执行调用(`cursor.execute`, `db.execute`)以及响应构建的数据流 4. 生成与 Express 插件产生的相同的 `routes` + `candidates` JSON 结构 这意味着动态攻击引擎对 Flask 和 Express 的处理方式是完全相同的。 ### 第 3 阶段:密钥扫描器 ``` scanFileForSecrets(filePath, projectPath, config, scanId) → Finding[] ``` 对插件发现的每个源文件运行。它执行**两个独立的步骤**: **步骤 1 —— 基于规则的模式匹配** 从 `packages/cli/src/static/gitleaks-rules.json` 加载规则 —— 这是一组精选的正则表达式,涵盖: - AWS Access Keys 和 Secret Keys - GitHub Personal Access Tokens - Stripe API keys(正式和测试环境) - Slack Webhook URLs - 通用的 `password =` / `secret =` / `api_key =` 赋值模式 - JWT tokens - RSA 私钥标头 - Google API keys - Twilio account SIDs 每个模式都会针对文件中的每一行进行测试。在标记匹配项之前,扫描器会将其通过**误报过滤器**进行筛选,拒绝匹配常见占位符模式的值(如 `example`, `sample`, `placeholder`, `test-`, `changeme`, UUID 格式, `xxxxxxxx` 等)。 **步骤 2 —— Shannon 熵分析** 对于长度超过 20 个字符且在步骤 1 中*未*被标记的每个字符串字面量,扫描器会计算其 [Shannon 熵](https://en.wikipedia.org/wiki/Entropy_(information_theory))。熵值大于 4.5 比特/字符的字符串在统计学上不太可能是人类可读的文本,无论是否匹配已知模式,都会被标记为可能的密钥。 这可以捕获不符合任何已知模式的 API 密钥、token 和加密材料。 您可以通过 `vuln-scanner.config.json` 扩展或限制这些规则: ``` { "secrets": { "additionalPatterns": [ { "name": "Internal Token", "regex": "MYAPP_TOKEN=[A-Za-z0-9]{32}", "severity": "high" } ], "excludePatterns": ["generic-api-key"] } } ``` ### 第 4 阶段:依赖审计器 ``` auditDependencies(projectPath, config, scanId) → { findings, warning } ``` 读取 `package.json`(对于 Node.js 项目)或 `requirements.txt` / `Pipfile`(对于 Python 项目),提取所有声明的依赖项及其安装版本,并分批查询 **[OSV.dev](https://osv.dev) API**。 OSV(Open Source Vulnerabilities)是一个由 Google 维护的免费、聚合的漏洞数据库,它整合了来自 NVD、GitHub Advisory、npm advisories、PyPI advisories 等的数据。 每个易受攻击的包都会产生一个 `dependency` 类型的发现结果,其中包含: - 已安装版本与第一个修复版本 - CVE 标识符(如果有) - 指向 OSV 安全通告的直接链接 - 生态系统(`npm`, `PyPI`) 如果缺少 `package.json` 或无法访问 OSV API,将发出 `DEP_AUDIT_SKIP` 警告,扫描将继续进行。 ### 第 5 阶段:Docker 编排 ``` bootStack(config) → { success, baseUrl, warning } ``` Docker 编排器(`packages/cli/src/docker/orchestrator.ts`)会在隔离的容器中启动您的应用程序,以便攻击引擎可以向其发送真实的 HTTP 请求: 1. **运行 `docker compose up -d`**,使用配置中的 `composeFile` 路径(默认:`docker-compose.yml`) 2. **等待健康检查** —— 轮询 `http://localhost:{port}{healthCheckPath}`,采用指数退避策略,直到应用响应 200 或达到 60 秒超时 3. **返回基础 URL**(例如 `http://localhost:3000`)供攻击引擎使用 攻击引擎完成后,`teardownStack()` 会运行 `docker compose down` 进行清理,无论成功或失败。 如果 Docker 不可用或缺少 compose 文件,编排器会发出警告,所有污染候选项将成为 `static-only`(未确认)的发现结果 —— 扫描仍将成功完成。 ### 第 6 阶段:动态攻击引擎 ``` runAttackEngine(baseUrl, candidates, config, scanId) → Finding[] ``` 这是静态候选项变为已确认(或被拒绝)的发现结果的地方。引擎(`packages/cli/src/attack/engine.ts`)将每个候选项分派到相应的攻击模块。 #### SQL 注入模块(`attack/sqli.ts`) 对于每个 SQLi 候选项,运行**三层攻击序列**: | 层级 | 技术 | Payload 示例 | |---|---|---| | 1 | **基于错误** | `'`, `''`, `1' OR '1'='1`, `1'; SELECT SLEEP(0)--` | | 2 | **布尔盲注** | `1 AND 1=1` 对比 `1 AND 1=2` —— 检查响应正文长度是否出现差异 | | 3 | **基于时间的盲注** | `1'; SELECT SLEEP(3)--`, `1' AND SLEEP(3)--`, `1; pg_sleep(3)--` | 只有当某一层产生确凿证据(响应正文中包含 SQL 错误关键字、可证明的布尔差异,或在 500ms 以下的基准下测量到大于 2.5 秒的时间延迟)时,才会输出发现结果。每一层都会首先建立**基准线**,以排除偶然的差异。 #### XSS 模块(`attack/xss.ts`) 对于每个 XSS 候选项,注入一组针对上下文感知的 payload,以突破常见的 HTML 上下文: ``` "> '> javascript:alert(1) ``` 检查响应**反射** —— 如果 payload 在 HTML 响应正文中以未转义的形式出现,则确认该发现。该模块会检查 `Content-Type` 标头,以避免在 JSON API 上出现误报。 #### IDOR 模块(`attack/idor.ts`) 识别具有数字 ID 参数的路由(例如 `/users/:id`, `/orders/:id`),并探测水平访问控制漏洞: 1. 以 ID `1` 获取资源 2. 以 ID `2` 获取相同资源 3. 如果两者都返回 HTTP 200 且正文存在实质性差异,且没有身份验证挑战,则将其标记为 `probable`(可能)的 IDOR 候选项 IDOR 发现始终是 `probable` 的,永远不会是 `confirmed` 的,因为引擎无法在没有特定应用业务逻辑的情况下确定这两个资源*是否*应该可被访问。 #### 配置错误模块(`attack/misconfig.ts`) 独立探测实时应用程序(无需候选项),检查两类配置错误: **安全标头:** 向 `/` 发出 GET 请求,并标记任何缺失的标头,包括: - `X-Content-Type-Options` - `X-Frame-Options` - `Content-Security-Policy` - `Strict-Transport-Security` - `X-XSS-Protection` **敏感路径暴露:** 探测绝不应公开访问的路径: | 路径 | 风险 | |---|---| | `/.env` | 环境文件泄露 | | `/.git/config` | Git 仓库元数据泄露 | | `/config.json`, `/config.js` | 应用配置泄露 | | `/admin`, `/api/admin` | 无需身份验证的管理面板 | | `/debug`, `/api/debug` | 暴露的调试 endpoint | | `/actuator`, `/metrics` | 框架内部结构暴露 | 只有在路径返回 HTTP 200 且正文为非 HTML 且不为空(或包含 Node.js 堆栈跟踪签名的 HTML)时,才会标记该路径。 ### 第 7 阶段:结果存储与差异比对 ``` diffFindings(current, previous) → { findings, resolvedCount } persistFindings(projectPath, scanId, findings) buildSummary(...) → ScanSummary ``` 结果存储(`packages/cli/src/findings/store.ts`)将扫描结果持久化到项目目录中的 `.vuln-scanner/findings.json` 中。在随后的每次扫描中,它会将新结果与上一次扫描进行**差异比对**: - 每个发现结果都有一个稳定、确定性的 ID:`sha256(type + file + line + paramName)`,截断为 16 位十六进制字符 - 如果某个发现结果在上一次扫描中存在,则其 `previousStatus` 字段将设置为旧状态 - 如果之前的某个发现结果不再出现在新扫描中,则会计为 `resolved`(已解决) 这让您能够追踪**回退现象** —— 即已修复然后又被重新引入的漏洞 —— 并查看有意义的差异,而不是每次扫描都看到相同的结果。 ### IPC 层(扩展通信) CLI 通过 **stdout 上的换行符分隔的 JSON** 与 VS Code 扩展进行通信。每个重要事件都会发出一条消息: ``` { "type": "PROGRESS", "payload": { "stage": "static", "message": "Walking AST...", "percent": 10 } } { "type": "FINDING", "payload": { "id": "a1b2c3d4...", "type": "sqli", "severity": "critical", ... } } { "type": "SCAN_COMPLETE", "payload": { "totalFindings": 7, "confirmed": 3, ... } } ``` VS Code 扩展的 **Sidecar 管理器**(`packages/extension/src/sidecar.ts`)将 CLI 作为子进程生成,将配置通过管道传递到其 stdin,并实时从 stdout 读取这些消息 —— 随着发现结果的传入更新侧边栏树视图和状态栏,而不会阻塞编辑器。 ## 架构 ``` CVS/ ├── packages/ │ ├── cli/ # Core scanning engine │ │ └── src/ │ │ ├── scanner.ts # 7-stage pipeline orchestrator │ │ ├── config.ts # Config loader + Zod validation │ │ ├── plugin-registry.ts # Plugin auto-detection │ │ ├── index.ts # CLI entry point (commander) │ │ ├── attack/ │ │ │ ├── engine.ts # Attack coordinator │ │ │ ├── sqli.ts # SQL injection (3-tier) │ │ │ ├── xss.ts # Cross-site scripting │ │ │ ├── idor.ts # Insecure direct object reference │ │ │ ├── misconfig.ts # Header and path misconfiguration │ │ │ └── interceptor.ts # HTTP request abstraction │ │ ├── docker/ │ │ │ ├── orchestrator.ts # Docker compose + health check │ │ │ └── detector.ts # Docker availability check │ │ ├── findings/ │ │ │ ├── types.ts # All TypeScript contracts │ │ │ └── store.ts # Persist / diff / summarize │ │ ├── ipc/ │ │ │ └── emitter.ts # Stdout JSON event emitter │ │ └── static/ │ │ ├── secrets.ts # Secrets scanner (regex + entropy) │ │ ├── deps.ts # OSV dependency auditor │ │ └── gitleaks-rules.json │ │ │ ├── plugin-express/ # Express.js language plugin │ │ └── src/ │ │ ├── detector.ts # Express detection logic │ │ ├── route-parser.ts # Babel AST route discovery │ │ ├── taint-walker.ts # Babel AST taint flow analysis │ │ └── index.ts # LanguagePlugin implementation │ │ │ ├── plugin-python/ # Flask language plugin │ │ └── src/ │ │ ├── index.ts # LanguagePlugin implementation │ │ └── parser.py # Native Python AST analysis │ │ │ └── extension/ # VS Code Extension │ └── src/ │ ├── extension.ts # Activation entry point + commands │ ├── sidecar.ts # CLI child process manager │ ├── sidebar/ │ │ ├── provider.ts # TreeDataProvider for findings list │ │ └── items.ts # TreeItem definitions │ └── panel/ │ └── detail-panel.ts # Webview finding detail panel │ ├── fixtures/ │ ├── vulnerable-app/ # Intentionally vulnerable Express app │ ├── clean-app/ # Clean Express app (no vulnerabilities) │ └── partial-fix-app/ # Mixed — some fixed, some not │ └── .github/workflows/ci.yml # GitHub Actions CI pipeline ``` ## 安装说明 ### 前置条件 | 要求 | 版本 | 用途 | |---|---|---| | Node.js | 20+ | 运行 CLI 和构建包 | | npm | 9+ | 包管理(随 Node.js 一起提供) | | Docker Desktop | 最新版 | 动态分析(可选但推荐) | | Python | 3.8+ | Flask 项目扫描 | | VS Code | 1.89+ | 扩展使用 | ### 步骤 1 —— 克隆仓库 ``` git clone https://github.com/ShyamNayak27/Codebase-Vulnerability-Scanner.git cd Codebase-Vulnerability-Scanner ``` ### 步骤 2 —— 安装所有依赖项 ``` npm install ``` 这会通过 npm workspaces 为所有工作区包(`cli`, `plugin-express`, `plugin-python`, `extension`)安装依赖项。 ### 步骤 3 —— 构建所有包 ``` npm run build ``` 这会使用 [Turborepo](https://turbo.build) 构建所有包的 TypeScript 代码,并遵循依赖顺序。输出将放入每个包的 `dist/` 文件夹中。 ### 步骤 4 —— (可选)通过测试进行验证 ``` npm test ``` 运行完整的测试套件 —— 每个模块的单元测试以及针对测试固件应用的 E2E 测试。 ### 步骤 5 —— 安装 VS Code 扩展 该扩展尚未发布到应用市场。要在本地安装它: ``` # 安装 vsce 打包工具 npm install -g @vscode/vsce # 打包扩展 cd packages/extension vsce package # 在 VS Code 中:Extensions → ··· → Install from VSIX → 选择生成的 .vsix ``` 或者,在 VS Code 中打开 `packages/extension` 文件夹并按 **F5** 启动 Extension Development Host 进行开发。 ## 用法 ### VS Code 扩展 安装并激活扩展后: 1. 在 VS Code 中**打开您的项目文件夹**。 2. 打开命令面板(Windows 上为 `Ctrl+Shift+P` / Mac 上为 `Cmd+Shift+P`)。 3. 运行以下核心命令之一: | 命令 | 描述 | |---|---| | `Run Security Scan` | 运行完整流水线(静态分析 + 动态 Docker 攻击) | | `Run Security Scan (Static Only)` | 仅运行静态分析(AST 污染、密钥扫描和 OSV 依赖审计) | | `Export Security Report` | 生成独立的交互式 HTML 仪表板(`security-report.html`) | | `Clear Findings` | 清除侧边栏面板中的所有结果 | | `Open Scan Config` | 在 `vuln-scanner.config.json` 中配置扫描参数 | #### 访问发现结果与扫描报告 1. **安全发现面板:** * 打开 VS Code 的**资源管理器视图**(`Ctrl+Shift+E`)。 * 在资源管理器侧边栏底部找到可折叠的 **`SECURITY FINDINGS`** 面板。 * 发现结果会自动按严重程度分组:**Critical** 🔴, **High** 🟠, **Medium** 🟡, **Low** 🔵 和 **Info** ⚪。 2. **扫描状态:** * 观察 VS Code 底部的状态栏项目,获取执行活动扫描时的实时进度百分比和阶段状态。 #### 交互式详情面板功能 双击树视图中的任何发现结果,启动功能丰富的**漏洞详情面板**,该面板具有三个交互部分: * **漏洞:** 直接显示您的源代码并高亮显示存在漏洞的行,同时显示原始的动态证据日志(完整的 HTTP 请求和响应追踪)。 * **修复建议:** 提供并排分割的代码对比,将存在漏洞的行(已删除)显示在安全建议(已添加)旁边。点击 **⚡ Apply Patch** 按钮可自动替换磁盘上的代码。 * **构思与讨论:** 打开 **Security Copilot** 聊天界面。实时讨论发现结果,提出技术问题(例如 *“为什么这是一个漏洞?”*),并完善安全的代码解决方案。 ##### 发现漏洞的详细解释示例: Image #### 导出报告 * 将鼠标悬停在资源管理器面板的 **`SECURITY FINDINGS`** 标题栏上,点击 **Export** 图标 📤(或从命令面板运行 `Export Security Report`)。 * 这会将 `security-report.html` 写入您的工作区根目录——这是一份响应式、独立的 HTML 报告,包含仪表板图表、查询搜索栏和严重程度过滤按钮。 ### CLI CLI 是该工具的核心。可针对任何项目目录运行它: ``` # 完整扫描(静态 + 通过 Docker 进行动态扫描) node packages/cli/dist/index.js scan ./path/to/your-project # 仅静态扫描(不需要 Docker) node packages/cli/dist/index.js scan ./path/to/your-project --skip-dynamic # 覆盖你的应用监听的端口 node packages/cli/dist/index.js scan ./path/to/your-project --port 8080 # 将发现结果输出为 JSON(对 CI pipelines 很有用) node packages/cli/dist/index.js scan ./path/to/your-project --output json ``` **CI/CD 集成(GitHub Actions 示例):** ``` - name: Security Scan run: node packages/cli/dist/index.js scan . --skip-dynamic --output json > findings.json - name: Fail on Critical Findings run: | CRITICAL=$(grep -c '"severity":"critical"' findings.json || echo 0) if [ "$CRITICAL" -gt "0" ]; then echo "Critical vulnerabilities found — failing build." exit 1 fi ``` ### 配置参考 在您的**项目根目录**(而不是扫描器的根目录)中创建一个 `vuln-scanner.config.json`: ``` { "composeFile": "docker-compose.yml", "port": 3000, "healthCheckPath": "/api/health", "skipDynamic": false, "exclude": [ "node_modules/**", "dist/**", "build/**", "test/**" ], "secrets": { "additionalPatterns": [ { "name": "Internal Admin Token", "regex": "ADMIN_TOKEN=[A-Za-z0-9]{32,}", "severity": "critical" } ], "excludePatterns": [ "generic-api-key" ] } } ``` | 字段 | 默认值 | 描述 | |---|---|---| | `composeFile` | `docker-compose.yml` | Docker Compose 文件的路径(相对于项目根目录) | | `port` | `3000` | 您的应用在 Docker 内部监听的端口 | | `healthCheckPath` | `/` | 用于在攻击前确认应用已准备就绪的路径 | | `skipDynamic` | `false` | 设置为 `true` 可跳过 Docker 和攻击阶段 | | `exclude` | `["node_modules/**", ...]` | 扫描期间要跳过的文件/目录的 Glob 匹配模式 | | `secrets.additionalPatterns` | `[]` | 要添加到密钥扫描器的自定义正则表达式规则 | | `secrets.excludePatterns` | `[]` | 要禁止显示的来自 `gitleaks-rules.json` 的规则 ID | ## 解读您的结果 每个发现结果都带有**状态**和**严重程度**: ### 状态 | 状态 | 含义 | |---|---| | `confirmed` | 攻击引擎发送了 payload 并收到了确凿证据(SQL 错误、反射型 XSS、可测量的时间差异) | | `probable` | 有强有力的静态证据,但动态验证结果不确定(例如 IDOR) | | `unconfirmed` | 污染追踪器发现了可疑模式,但 Docker 不可用,无法对其进行测试 | | `static-only` | Docker 已跳过(`--skip-dynamic`);发现结果仅基于 AST 分析 | ### 严重程度 | 严重程度 | 示例 | |---|---| | `critical` | 已确认的 SQL 注入,硬编码的 AWS 密钥 | | `high` | 已确认的 XSS,带有已知漏洞利用的依赖项 | | `medium` | 暴露的管理面板,缺少 CSP 标头 | | `low` | 可能是密钥的高熵字符串 | | `info` | 缺少 `X-Frame-Options` 标头 | ### 发现结果 ID 每个发现结果都有一个**稳定、确定性的 ID**,由 `sha256(type + file + line + paramName)` 计算得出,并截断为 16 位十六进制字符。相同位置上的相同漏洞在多次扫描中始终会生成相同的 ID,从而在 CI 流水线中实现可靠的差异比对和去重。 ## 常见问题 **问:我需要 Docker 才能使用它吗?** 不需要。使用 `--skip-dynamic` 运行,扫描器仍会执行 AST 污染分析、密钥扫描和依赖审计。您将获得 `static-only` 发现结果,而不是 `confirmed` 结果。动态分析的作用是将信心从“可疑”提升到“已证实”。 **问:我的项目使用的不是 Express 或 Flask 的框架。它能用吗?** 部分可用。密钥扫描器和依赖审计器可以在任何项目上运行,而不管使用什么框架。AST 污染分析(SQLi、XSS、IDOR 检测)需要插件。如果没有匹配的插件,您将看到 `NO_PLUGIN` 警告,并且扫描仅继续输出密钥和依赖项结果。 添加新插件非常简单 —— 只需实现 `packages/cli/src/findings/types.ts` 中的 `LanguagePlugin` 接口,并在 `packages/cli/src/plugin-registry.ts` 中注册即可。 **问:它会破坏我正在运行的应用程序或影响我的数据库吗?** 不会。扫描器会为您的应用启动一个**完全隔离的 Docker 容器**。它永远不会触及您的生产环境、本地数据库或正在运行的实例。所有攻击 payload 仅发送到一次性的 Docker 容器中。 **问:我在测试文件中遇到了误报。我该如何排除它们?** 将该目录添加到 `vuln-scanner.config.json` 中的 `exclude` 数组中: ``` { "exclude": ["test/**", "**/*.spec.ts", "**/*.test.js"] } ``` **问:密钥扫描器标记了一个 UUID 或占位符值。我该如何禁止显示它?** 扫描器内置了针对常见占位符(`example`, `sample`, `changeme`, UUID 格式等)的误报过滤器。如果您的值符合其中一种模式,它会被自动禁止显示。要进行自定义禁止显示,请将规则 ID 添加到配置的 `secrets.excludePatterns` 中。 **问:一次扫描需要多长时间?** 一个包含 20-30 个源文件的典型 Node.js Express 项目: - **纯静态模式:** 5–15 秒 - **完整扫描(包含 Docker):** 30–90 秒,具体取决于 Docker 拉取时间和应用启动速度 **问:我可以在我的 GitHub Actions CI/CD 流水线中使用它吗?** 可以。在每次 pull request 时使用 `--skip-dynamic --output json` 进行快速的纯静态扫描。如果您的 CI runner 支持,可以启用 Docker 以在合并到 main 分支时进行完整的动态扫描。有关完整示例,请参见 [CLI 用法](#cli)部分。 **问:动态扫描在等待我的应用启动时超时了。我该怎么办?** 默认检查超时时间为 60 秒。确保您的 `docker-compose.yml` 正确启动了应用,并且 `healthCheckPath` 在应用准备好时返回 HTTP 200。还要验证 `port` 是否与您的应用在 Docker 中暴露的端口相匹配。 **问:我可以添加自定义漏洞规则吗?** 对于密钥,是可以的 —— 在配置中使用 `secrets.additionalPatterns`。对于 SQL 注入和 XSS,可以通过修改插件源代码来扩展 `taint-walker.ts` 中的污染接收器列表(`QUERY_METHODS`, `SANITIZERS` 等)。基于模式的规则 API 已在开发计划中。 **问:有没有办法永久禁止显示特定的发现结果?** 结果级别的禁止显示(`// vuln-scanner: ignore`)已在开发计划中。目前,最好的方法是修复底层问题 —— 结果存储将在下一次扫描中自动将其标记为 `resolved`。 ## 许可证 MIT 许可证 —— 完整文本请参见 [LICENSE](./LICENSE)。 您可以出于任何目的自由使用、修改和分发此软件。感谢但非必须注明出处。 ## 联系方式 **Shyam Narayan Nayak** - GitHub: [@ShyamNayak27](https://github.com/ShyamNayak27) - 仓库: [Codebase-Vulnerability-Scanner](https://github.com/ShyamNayak27/Codebase-Vulnerability-Scanner) - Issues: [github.com/ShyamNayak27/Codebase-Vulnerability-Scanner/issues](https://github.com/ShyamNayak27/Codebase-Vulnerability-Scanner/issues) 发现 Bug?有功能请求?欢迎提交 Issue —— 欢迎所有反馈和贡献。
*旨在交付安全的代码,而非繁杂的文档。*
标签:DOE合作, MITM代理, SOC Prime, 代码安全审计, 依赖审计, 动态应用安全测试, 开发工具, 自动化攻击, 请求拦截, 逆向工具, 静态应用安全测试