Author:
## 关于 Daksh SCRA
Daksh SCRA(源代码审查辅助工具)旨在提升源代码审查流程的效率,为代码审查人员提供一种结构清晰、组织有序的方法。
Daksh SCRA 不会不加区分地将所有内容标记为潜在问题,而是倡导深思熟虑的分析,鼓励对潜在问题进行深入调查和确认。这种方法减少了将每个潜在问题都标记为缺陷的慌乱,从而避免了误报带来的混乱和浪费时间。
### 首次亮相
Daksh SCRA 最初在 Black Hat USA 2022(8 月 6 日至 9 日)的一次源代码审查培训课程中推出,当时面向特定受众进行了低调展示。其正式公开亮相是在拉斯维加斯举行的 Black Hat USA 2023 上。
## 功能与特性
- **识别源代码中的关注区域:** 鼓励有针对性的调查和确认,而不是不加区分地将所有内容标记为缺陷。
- **识别文件路径中的关注区域(全球首创):** 识别文件路径中的模式,以定位需要审查的相关部分。
- **软件级侦察以识别所用技术:** 识别项目技术,使代码审查人员能够使用适当的规则进行精准扫描。
- **代码审查的自动化科学工作量估算(全球首创):** 提供一种可衡量的方法来估算代码审查所需的工作量。
- **框架感知扫描:** 当检测到项目框架时,自动应用框架特定的规则。
- **污点分析报告:** 按平台生成的 HTML 污点流报告,提供黑客模式和专家模式两种主题。
- **RDL(规则描述语言):** 通过 `rdl_ref` 引用的外部规则逻辑,由 `core/rdl_engine.py` 管道执行——支持文件感知门控、布尔表达式、项目观察结果以及报告中导出的逻辑元数据。
- **扫描状态/恢复:** 对长时间扫描进行检查点保存,并在中断后恢复。
- **抑制基线:** 生成并应用已知误报的基线,以将其从未来的报告中抑制。
- **Web UI:** 基于浏览器的扫描启动器,提供实时控制台输出和作业工件浏览器。
> 持续进行功能增强。多个新功能和改进计划在未来的版本中推出。
欢迎为更新或添加新规则以及未来的开发做出贡献。
如果您发现任何缺陷,请报告至 [[email protected]](mailto:[email protected])。
详细文档:[https://dakshlabs.com/#docs](https://dakshlabs.com/#docs)
---
## 快速开始
运行 Daksh SCRA 有两种方式——选择最适合您工作流程的一种:
| | 最适合 | 跳转至 |
|---|---|---|
| 🌐 **Web UI(Docker)** | 最简单的入门方式——一条命令、浏览器仪表盘、实时扫描进度以及报告/工件浏览器。推荐大多数用户使用。 | [Web UI(Docker)](#web-ui-docker) |
| 💻 **CLI(Python)** | 脚本编写、CI 流水线,或无需 Docker 即可运行扫描。 | [CLI 设置](#cli-setup) |
两种方式运行的是完全相同的扫描引擎——Web UI 是同一 CLI 的浏览器前端,因此无论采用哪种方式,结果都是相同的。
---
## Web UI(Docker)
运行 Daksh SCRA 最快的方式是通过其基于浏览器的 Web UI,只需一条 Docker Compose 命令即可启动。它为您提供扫描启动器、实时控制台输出以及可浏览的历史报告,无需本地 Python 环境。
Docker 设置将 Web UI 和 CLI 作为基于同一镜像构建的独立服务运行,因此您可以在同一容器中使用其中任一(或两者)。
### 启动 Web UI
前台模式(日志流式输出到您的终端):```bash
docker compose up --build
分离 / 后台模式:```bash docker compose up --build -d
然后打开 [http://localhost:8080](http://localhost:8080)。
如需使用其他端口:```bash
DAKSH_PORT=9090 docker compose up
停止该堆栈,使用以下命令:```bash docker compose down
### 登录
Web UI 需要账户。首次启动时,会根据 `DAKSH_ADMIN_USERNAME` / `DAKSH_ADMIN_PASSWORD`(在 `.env` 中设置)创建初始管理员账户;如果 `DAKSH_ADMIN_PASSWORD` 未设置,则会生成随机密码并仅打印一次到 API 的启动日志中——请保存好,因为之后无法找回。
首次登录时,系统会要求你设置自己的密码(以及可选的用户名)。管理员账户可以通过 `POST /api/v1/auth/users` API 端点创建更多账户(目前尚无专用 UI)。有关认证相关设置的完整列表(会话有效期、Cookie 安全性、CORS),请参阅 `.env.example`。
### 你能获得什么
- 响应式命令构建器,支持扫描、侦察、估算、侦察+估算、列表以及从 JSON 生成 PDF 等模式
- 执行期间实时控制台输出和按阶段实时进度显示
- 每个任务的 HTML / PDF / JSON 输出工件快照
- 浏览器内快速导航,涵盖运行表单、实时输出、工件和最近任务
- 内置目录浏览器,用于选择目标路径(支持操作系统感知:Windows、macOS、Linux / Docker)
在底层,CLI 仍然是事实来源——它负责所有扫描并生成每个 HTML / PDF / JSON 输出。Web UI 一次运行一个活动任务,并将每个已完成任务的输出快照保存到 `runtime/webui/jobs/<job-id>/artifacts/`,以便过往报告始终可访问。
### 在 Docker 中运行 CLI
使用 CLI 同样不需要本地 Python 环境——它作为独立的 Compose 服务提供,基于同一镜像构建:```bash
docker compose run --rm cli -h
docker compose run --rm cli -r auto -t /scan-targets/path/to/source
reports/ 和 runtime/ 卷关键挂载点:
环境变量(在 .env 中配置):
在运行 Docker 之前,将 .env.example 复制为 .env,并设置适合你机器的路径和凭据。
更倾向于直接用 Python 运行 Daksh SCRA?以下是本地安装方法。
requirements.txt 中列出的所有库git clone https://github.com/coffeeandsecurity/DakshSCRA.git
或者从 [https://github.com/coffeeandsecurity/DakshSCRA](https://github.com/coffeeandsecurity/DakshSCRA) 下载最新的 zip 文件并解压。
### 2. 设置虚拟环境
> 💡 虚拟环境可以创建在任何目录中——不必位于 DakshSCRA 文件夹内。
**选项 A:一步式设置(推荐)**```bash
python setup_env.py
此脚本会创建虚拟环境、安装所有依赖项,并安装 Playwright 的 Chromium 浏览器(PDF 导出所需)。
选项 B:手动设置
Windows:```bash python -m venv daksh-env .\daksh-env\Scripts\activate
macOS / Linux:```bash
python3 -m venv daksh-env
source daksh-env/bin/activate
然后安装依赖:```bash cd path/to/DakshSCRA pip install -r requirements.txt playwright install chromium
---
## CLI 用法
在虚拟环境中使用 `python`,或在虚拟环境外使用 `python3`。
### 命令行选项```
usage: dakshscra.py [-h] [-r RULES] [-f FILE_TYPES] [-v] [-t TARGET_DIR]
[-l {R,RF}] [--recon] [--rs] [--estimate]
[-rpt FORMATS] [--pdf-from-json]
[--json-input-dir PATH] [--pdf-output PATH]
[--pdf-multi-dir PATH] [--pdf-single-only]
[--skip-analysis] [--loc]
[--baseline-file PATH] [--baseline-generate] [--no-baseline]
[--review-config PATH]
[--resume-scan] [--state-file PATH] [--no-state] [--state]
-f(文件类型)为可选参数。若未指定,DakshSCRA 将使用所选平台对应的默认文件类型。```bash
python dakshscra.py -r php -t /path/to/source
python dakshscra.py -r php,java,cpp -t /path/to/source
python dakshscra.py -r auto -t /path/to/source
python dakshscra.py -r php -f dotnet -t /path/to/source
python dakshscra.py --recon -t /path/to/source
python dakshscra.py --recon -r php -t /path/to/source
python dakshscra.py --recon --rs -t /path/to/source
python dakshscra.py --estimate -t /path/to/source
python dakshscra.py -r auto -t /path/to/source -rpt html,pdf
python dakshscra.py -r php -v -t /path/to/source # default python dakshscra.py -r php -vvv -t /path/to/source # show all pattern checks
python dakshscra.py -r auto -t /path/to/source --baseline-generate
python dakshscra.py -r auto -t /path/to/source --baseline-file config/suppressions.json
python dakshscra.py -r auto -t /path/to/source --no-baseline
python dakshscra.py -r auto -t /path/to/source --review-config config/review.json
python dakshscra.py -r auto -t /path/to/source --state
python dakshscra.py -r auto -t /path/to/source --resume-scan
python dakshscra.py -r auto -t /path/to/source --resume-scan --state-file runtime/scan_state.json
python dakshscra.py --pdf-from-json
python dakshscra.py --pdf-from-json --json-input-dir ./custom/reports/data
python dakshscra.py --pdf-from-json --pdf-output ./reports/scan/pdf/custom.pdf --pdf-multi-dir ./reports/scan/pdf/multi-file
python dakshscra.py --pdf-from-json --pdf-single-only
### 支持的平台规则与框架```bash
python dakshscra.py -l R # List platform rules and framework mappings
python dakshscra.py -l RF # List platform rules, framework mappings, and filetypes
当前支持的平台和框架映射:
要获取最新的受支持平台和框架,请始终运行:```bash python dakshscra.py -l R
---
## 配置参考
### `config/tool.yaml`
Daksh SCRA 运行时默认值通过 `config/tool.yaml` 进行控制。```yaml
state_management:
enabled: false
resume_mode: manual
persist_after_seconds: 300
persist_interval_seconds: 30
default_state_file: runtime/scan_state.json
cleanup_on_success: false
analysis:
run_by_default: true
include_frameworks: true
report_theme: hacker_mode
分析器配置选项:
analysis.run_by_default
true:分析器在扫描期间自动运行false:分析器被禁用,除非在配置中或通过 CLI 重新启用analysis.include_frameworks
true:在存在框架检测的情况下,包含框架级别的分析器条目false:仅输出平台级别的分析器结果analysis.report_theme
hacker_mode:深色高对比度现代分析器主题(默认)professional_mode:浅色现代分析器主题both:同时生成两种主题变体并排显示RDL(规则描述语言)是 DakshSCRA 外部化的规则逻辑层。在当前架构中:
name、regex、描述以及可选的 scan_config。core/rdl_engine.py 执行。rules/scanning/logic/... 下,并通过 XML 中的 <rdl_ref> 引用。rdl_ref 值相对于 rules/scanning/ 解析,例如:
logic/php/core/some_rule.rdl -> rules/scanning/logic/php/core/some_rule.rdllogic_engine、logic_source、
logic_reason、、 和 。旧的 <rdl> 内联形式不再是当前架构,不应再用于新规则。
XML rule -> regex / exclude / scan_config / descriptions -> rdl_ref -> rules/scanning/logic///.rdl -> core/rdl_engine.py -> pass / fail -> reason / fail_reason -> trace / consulted_files / outcome
#### 扫描顺序
对于源规则,DakshSCRA 按以下顺序评估逻辑:
1. Recon 选择匹配的平台和框架。
2. 从 `rules/scanning/platform/...` 加载 XML 规则。
3. 当存在时,`regex` 查找候选行或整文件匹配。
4. 当存在时,`exclude` 移除该规则的明显噪声。
5. 根据当前文件文本、当前文件路径和项目根目录,评估来自 `rdl_ref` 的外部 `.rdl` 文件。
6. 如果 RDL 脚本通过,DakshSCRA 保留发现结果,并将导出的逻辑元数据合并到报告输出中。
7. 如果 RDL 脚本失败,则抑制该匹配,并附带 RDL 失败原因和决策跟踪元数据。
对于 `filepaths.xml` 中的文件路径规则,适用相同的 `rdl_ref` 模型,但匹配对象是
规范化后的相对路径,而非源代码文本。在该模式下,RDL 接收相对路径
字符串作为当前文件文本和路径上下文。
#### 当前规则结构```xml
<rule>
<name>Rule Name</name>
<regex><![CDATA[regex_to_match]]></regex>
<rdl_ref>logic/common/core/insecure_sql_query_unsafe_string_concatenation.rdl</rdl_ref>
<exclude><![CDATA[pattern_to_exclude_lines]]></exclude> <!-- optional -->
<scan_config>...</scan_config> <!-- optional -->
<rule_desc>Short description of what the rule detects.</rule_desc>
<vuln_desc>Why the pattern matters.</vuln_desc>
<developer>Fix guidance for developers.</developer>
<reviewer>Manual confirmation guidance for reviewers.</reviewer>
</rule>
.rdl 结构```textVERSION 1 WHEN PRESENT /\b(?:mysql_query|mysqli_query|->query)\s*\(/i WHEN EXPR PRESENT:\$_(GET|POST|REQUEST|COOKIE) && MISSING:\b(?:prepare|bindParam|bindValue|PDO::prepare)\b REPORT AS area_of_interest REASON SQL query execution appears reachable without parameterisation in this file. FAIL_REASON Matching query API was found, but the file also contains prepared-statement indicators. TRACE SQLi gate: input source present and mitigation missing.
#### 当前布局```text
rules/
└── scanning/
├── platform/
│ ├── php/php.xml
│ ├── java/java.xml
│ └── ...
└── logic/
├── common/core/
├── php/core/
├── php/framework/laravel/
├── mobile/android/core/
├── filepaths/core/
└── ...
WHEN PRESENT、WHEN MISSING 和 WHEN CURRENT_FILE_MATCHES 针对当前文件文本进行评估。WHEN FILE_NAME_IS 和 WHEN FILE_PATH_MATCHES 针对当前文件路径上下文进行评估。WHEN EXPR 支持基于 PRESENT:、MISSING: 和 EXISTS: 谓词的布尔逻辑。OBSERVE PROJECT_HAS_GLOB ... AS ... 不会对发现结果进行门控;它仅将相关项目文件记录到跟踪元数据中。REPORT AS、REASON、FAIL_REASON 和 TRACE 控制导出的报告元数据。WHEN EXPR 中的布尔表达式支持:
PRESENT:<regex>MISSING:<regex>EXISTS:<regex>&&、||、! 以及括号XML 规则:```xml Possible SQL Injection in Query Execution query)\s*\(]]> <rdl_ref>logic/common/core/insecure_sql_query_unsafe_string_concatenation.rdl</rdl_ref> <rule_desc>...</rule_desc>
外部RDL:```text
VERSION 1
WHEN PRESENT /\b(?:mysql_query|mysqli_query|->query)\s*\(/i
WHEN EXPR PRESENT:\$_(GET|POST|REQUEST|COOKIE) && MISSING:\b(?:prepare|bindParam|bindValue|PDO::prepare)\b
REPORT AS area_of_interest
REASON Query execution appears to rely on direct input without parameterisation.
FAIL_REASON Query API matched, but parameterised query indicators were also found in the file.
XML 规则:```xml Exported Components Without Permission activity|service|receiver|provider)\s[^>]*android:name="(?P[^"]+)"[^>]*android:exported="true"[^>]*(?:/>|>)]]> <rdl_ref>logic/mobile/android/core/exported_components.rdl</rdl_ref> <scan_config>...</scan_config>
外部 RDL:```text
VERSION 1
WHEN FILE_NAME_IS AndroidManifest.xml
WHEN CURRENT_FILE_MATCHES /android:exported\s*=\s*"true"/i
WHEN MISSING /android:permission\s*=\s*"/i
REPORT AS area_of_interest
REASON Exported component appears reachable without a permission guard.
XML 规则:```xml Admin Section File Path <rdl_ref>logic/filepaths/core/admin_section.rdl</rdl_ref>
外部 RDL:```text
VERSION 1
WHEN CURRENT_FILE_MATCHES /(^|\/)(admin|administrator|root)(\/|$)/i
UNLESS CURRENT_FILE_MATCHES /(^|\/)(tests?|docs?|samples?|examples?)(\/|$)/i
REPORT AS area_of_interest
REASON File path suggests privileged application functionality.
FAIL_REASON Path matched an excluded documentation or sample location.
regex 足够宽泛以捕获候选对象,然后使用 RDL 过滤上下文。rdl_ref 处理所有规则逻辑,并将 .rdl 文件放在相应的平台/框架逻辑树旁边。<rdl> 块。WHEN PRESENT / WHEN MISSING,仅当逻辑确实为布尔型时才使用 WHEN EXPR。REASON 中,将抑制说明放在 FAIL_REASON 中。PRESENT 和 MISSING 视为整个文件级别的检查。文件中任何位置的缓解措施都可以抑制该文件中的所有匹配项。OBSERVE PROJECT_HAS_GLOB 来丰富带有项目上下文的发现结果,而不是作为通过/失败门控。logic/... 路径稳定且限定在平台范围内,以便 XML 规则保持精简,逻辑层保持可复用。所有输出均写入 reports/ 目录下:```
reports/
├── scan/
│ ├── html/
│ │ ├── report.html # Single-file HTML scan report
│ │ └── multi-file/ # Per-platform HTML report set
│ ├── pdf/
│ │ ├── report.pdf # Single-file PDF scan report
│ │ └── multi-file/ # Per-platform PDF report set
│ ├── recon/
│ │ └── reconnaissance.html # Reconnaissance HTML report
│ └── estimate/
│ └── estimation.html # Effort estimation HTML report
├── analysis/
│ └── /
│ ├── analysis.html # Taint analysis report (default theme)
│ ├── analysis_professional.html # Professional theme (if theme=both)
│ ├── analysis_xref.html # Cross-reference report
│ └── analysis.json # Structured analysis data
└── data/
├── areas_of_interest.json # AoI findings
├── filepaths_aoi.json # File path AoI findings
├── summary.json # Scan summary
├── recon.json # Recon summary
└── analysis.json # Analyzer output
运行时文件(扫描状态、日志、清单)写入 `runtime/` 目录下。
通过 Web UI 运行时,每个任务的输出还会额外快照保存到 `runtime/webui/jobs/<job-id>/artifacts/` 目录下(参见 [Web UI (Docker)](#web-ui-docker))。
---
## 作者
| | |
|---|---|
| 网站 | [coffeeandsecurity.com](https://www.coffeeandsecurity.com) |
| 邮箱 | [email protected] |
| Twitter / X | [@coffeensecurity](https://x.com/coffeensecurity) |
| 源码 | [github.com/coffeeandsecurity/DakshSCRA](https://github.com/coffeeandsecurity/DakshSCRA) |
| 许可证 | GNU 通用公共许可证 v3.0 (GPL-3.0) |
如果 DakshSCRA 帮助您的团队节省了大量时间、精力或成本,减少了对昂贵商业工具的依赖,提升了审查覆盖率,或让代码审查更加结构化、高效,欢迎随时联系我分享您的使用体验。我一直乐于接受深思熟虑的反馈和有趣的交流。
发现 Bug 或想贡献代码?请在 GitHub 上提交 Issue 或 Pull Request。
| 挂载 | 容器内路径 |
|---|
| 项目源代码 | /app |
| 默认扫描根目录 | /scan-targets |
| 主机驱动器别名 | /host、/host/c、/host/d |
| WSL 挂载 | /mnt、/run/desktop/mnt/host |
| 变量 | 描述 |
|---|
DAKSH_PORT | Web UI 端口(默认:8080) |
DAKSH_SCAN_ROOT | 容器内的默认目标目录 |
DAKSH_HOST_SOURCE | 挂载为 /scan-targets 的主机路径(默认:/tmp) |
DAKSH_HOST_MOUNT | 额外的主机挂载根目录 |
DAKSH_HOST_C | Windows C: 驱动器路径(WSL) |
DAKSH_HOST_D | Windows D: 驱动器路径(WSL) |
DAKSH_DESKTOP_MOUNT | WSL 桌面挂载路径 |
DAKSH_BROWSE_ROOTS | 覆盖目录浏览器根目录(逗号分隔) |
DAKSH_ADMIN_USERNAME | 初始管理员用户名(默认:admin) |
DAKSH_ADMIN_PASSWORD | 初始管理员密码——强烈建议显式设置 |
| 选项 | 描述 |
|---|
-r RULES | 平台规则(例如 php、java、php,java)或 auto 用于自动检测 |
-f FILE_TYPES | 覆盖扫描所用的默认文件类型 |
-v | 详细程度级别(-v、-vv、-vvv) |
-t TARGET_DIR | 目标源代码目录 |
-l {R,RF} | 列出平台规则 + 框架 [R] 或包含文件类型 [RF] |
--recon | 运行侦察(平台 / 框架 / 语言检测) |
--rs, --recon-strict | 严格侦察:仅高置信度检测(与 --recon 配合使用) |
--estimate | 根据代码库规模估算代码审查工作量 |
-rpt, --report FORMATS | 报告格式:html、pdf 或 html,pdf(默认:html) |
--pdf-from-json | 从现有 JSON 输出生成 PDF 报告,无需重新扫描 |
--json-input-dir PATH | JSON 报告目录(默认:./reports/data) |
--pdf-output PATH | 单个 PDF 输出路径(默认:./reports/scan/pdf/report.pdf) |
--pdf-multi-dir PATH | 多文件 PDF 输出目录(默认:./reports/scan/pdf/multi-file) |
--pdf-single-only | 仅生成合并后的单文件 PDF;跳过按平台生成的多文件集合 |
--skip-analysis | 本次运行禁用分析器阶段 |
--loc | 统计有效代码行数 |
--baseline-file PATH | 抑制基线文件(JSON) |
--baseline-generate | 根据当前发现生成抑制基线 |
--no-baseline | 本次运行禁用基线抑制 |
--review-config PATH | 发现结果分类文件(JSON);从报告中抑制先前已审查的误报 |
--resume-scan | 从状态文件恢复先前中断的扫描 |
--state-file PATH | 自定义扫描状态 / 检查点文件路径 |
--no-state | 本次运行禁用扫描状态检查点 |
--state | 本次运行强制启用扫描状态检查点 |
| 平台 | 框架 |
|---|
| dotnet | aspnetcore, entityframework |
| php | codeigniter, drupal, laravel, symfony, wordpress |
| java | hibernate, spring, springboot |
| javascript | angular, express, nestjs, nextjs, react, vue |
| kotlin | ktor, springkotlin |
| python | django, fastapi, flask |
| go | echo, fiber, gin |
| c | freertos |
| cpp | boost, qt |
| android | cordova-android, flutter-android, ionic-android, jetpack, nativescript-android, reactnative-android, xamarin-android |
| ios | cordova-ios, flutter-ios, ionic-ios, nativescript-ios, reactnative-ios, swiftui, uikit, xamarin-ios |
| reactnative | reactnative |
| flutter | flutter |
| xamarin | xamarin |
| ionic | ionic |
| nativescript | nativescript |
| cordova | cordova |
| ruby | rails, sinatra |
| rust | actix, axum, rocket |
| common | - |
logic_tracelogic_consulted_fileslogic_outcome/pattern/flags 形式,支持 i、m 和 s 标志。| 命令 | 行为 | 典型用途 |
|---|
WHEN PRESENT <regex> | 要求当前文件文本中存在某个模式 | 要求同时出现风险 API 或敏感字段 |
WHEN MISSING <regex> | 要求当前文件文本中不存在某个模式 | 当缓解措施已存在时抑制发现 |
WHEN EXPR <expr> | 使用 PRESENT: / MISSING: / EXISTS: 结合 &&、` | |
WHEN CURRENT_FILE_MATCHES <regex> | 针对完整当前文件文本进行匹配 | 重新检查复杂的整文件条件 |
WHEN FILE_NAME_IS <name> | 要求当前文件名完全匹配 | 限制 plist / manifest / 配置文件规则 |
WHEN FILE_PATH_MATCHES <glob> | 要求当前相对路径匹配某个 glob | 缩小框架/配置文件路径规则范围 |
UNLESS CURRENT_FILE_MATCHES <regex> | 当整个文件匹配排除模式时判定失败 | 阻止已知安全的特定结构情况 |
OBSERVE PROJECT_HAS_GLOB <glob> AS <label> | 将相关项目文件记录到跟踪元数据中 | 展示支持性配置或伴随文件 |
REPORT AS <outcome> | 设置规则结果,通常为 area_of_interest | 为未来明确结果做准备 |
REASON <text> | 规则通过时显示的原因 | 解释为何发现结果保持可见 |
FAIL_REASON <text> | 规则抑制匹配时显示的原因 | 解释为何命中被过滤 |
TRACE <text> | 添加调试/决策跟踪行 | 迁移/调试支持 |