
# Frieren DAST-AI
面向安全工程师的 AI 驱动的动态应用安全测试(DAST)工具。
将 HTTPS MITM 代理与多 agent 扫描器及实时 Web dashboard 相结合。将任何浏览器或工具通过代理路由——发现的结果将自动显示。
## 维护
由 KnowBe4 InfoSec 团队维护并保持更新。欢迎贡献——随意 fork、修改或扩展它。如果你 fork 或重新分发此项目,请注明官方仓库:https://github.com/knowbe4/frieren-dast-ai
## 工作原理
```
Browser / tool (configured to use proxy :8080)
|
v
[HTTPS MITM Proxy] Intercepts all HTTP/HTTPS, TLS termination per host
|
v
[Session Store] Every request/response stored in memory
|
+---> [Passive Scanner] Zero-request checks fire on every response
| (YAML rule engine) 47 rules: headers, cookies, CORS, secrets,
| error pages, LLM endpoints, OWASP Top 10
|
+---> [Scan Queue] In-scope entries queued for active scanning
|
v
[Coordinator] LLM planner → agents → LLM validator
|
v
[VulnAgents] 10 agents run in parallel per endpoint:
| xss, sqli, ssrf, file_read, auth_bypass,
| secrets, discovery, llm_injection,
| business_logic, blazor
v
[Findings] Real-time push to dashboard via WebSocket
```
## 快速开始
```
# 1. 安装 deps、Playwright,并从模板创建 .env
make setup
# 2. 仅首次:创建 AWS SSO profile(参见下方的“AWS 设置”部分)
make sso-configure
# 3. 认证(每次会话/token 过期时必需)
make sso
# 4. 启动 proxy + dashboard
make proxy
# 5. 配置你的浏览器:HTTP proxy → 127.0.0.1:8080
# 6. 安装 CA cert:http://127.0.0.1:8088/ca.crt(一次性)
# 7. Dashboard:http://127.0.0.1:8088
```
## 桌面应用 (Electron)
相比于终端 + 独立浏览器,更喜欢一个独立窗口?在 `desktop/` 目录下提供了一个原生的 Electron 启动器。它**仅仅是一个启动器**——它会将 `uv run dast-ai proxy` 作为子进程启动,等待 dashboard 端口就绪,然后在带有托盘图标的原生窗口中渲染现有的 dashboard。所有的代理 / MITM / 扫描 / AI 行为与从终端运行后端完全一致。
```
# 仅首次运行 — 安装 Electron deps(~200MB)
make desktop-install
# 启动原生应用(自动启动 backend)
make desktop
# 端口覆盖传递给 backend
make desktop PROXY_PORT=9090 DASHBOARD_PORT=9099
```
需要 Node.js + npm。AWS 凭证(`AWS_PROFILE` / `AWS_ACCESS_KEY_ID`)从你的 shell 中继承,与 `make proxy` 相同。
### 构建可分发包
`electron-builder` 生成可双击运行的程序包(便携版 `.exe` / `.AppImage` 无需安装)。**第一阶段注意事项:**打包后的应用在运行时仍然假设存在 `uv` 和已检出的 repo——它打包的是启动器,而不是 Python 后端。
```
make desktop-dist-mac # macOS .dmg + .zip
make desktop-dist-win # Windows portable .exe + NSIS installer
make desktop-dist-linux # Linux AppImage
```
有关 Electron 安装故障排除和第二阶段(独立二进制文件)的说明,请参阅 [`desktop/README.md`](desktop/README.md)。
## Dashboard 标签页
| 标签页 | 描述 |
|-----|-------------|
| **Dashboard** | 概览:请求数量、按严重程度划分的发现数量、agent 状态、扫描引擎指标 |
| **Proxy** | HTTP 历史记录、请求 Intercept、Site map、Issues(所有发现)以及 Settings(scope 规则、CA 证书 / Setup) |
| **Discovery** | Manual Browse(通过代理路由的 headless 浏览器)、Crawl(SPA 爬虫)、Content Discovery(强制浏览)、Param Mining(隐藏参数发现) |
| **AI** | Suggestions(供审查的 AI 发现/侦查结果)和 Settings(提供商、模型层级、扫描引擎、应用上下文、威胁模型、活动日志、服务图谱、payload 清单) |
| **Scan** | 实时扫描队列 —— pending / running / completed、暂停/取消、重放 |
| **Plugins** | 启用/禁用被动扫描器和其他插件 |
| **GraphQL** | Schema Explorer + Query Builder(introspection、操作选择器、query/variables 编辑器)和 Fuzzer(变量提取 + payload 交叉组合) |
| **Repeater** | 手动编辑和重发捕获的请求,每个请求一个标签页,支持 follow-redirects 开关 |
| **Intruder** | 针对请求的 payload 位置 fuzzing |
| **Logs** | 滚动显示 500 条事件的系统日志 —— agent、插件、浏览器和爬虫事件 |
| **Extras** | H1 Validator、Code(源码感知审查)、FedRAMP、Interactions(OOB/interactsh)、Decoder/Encoder、JWT 编辑器 |
## Proxy > 设置
- **Scope 规则** —— 按协议、主机、端口、路径(glob 或 regex)包含/排除
- **Bypass 域名** —— 按原样转发,不进行拦截或记录
- **隐藏扩展名** —— 从 HTTP 历史记录中过滤掉(`.js`、`.css` 等)
- **保存 / 加载** —— 保存命名的设置快照;保存的路径显示在通知中
- **Setup** —— CA 证书下载和安装说明、AI 引擎状态
扫描引擎设置(workers、probe 并发数、被动/主动开关、LLM planner/validator 开关)位于 **AI > Settings** 子标签页中,可在 runtime 应用而无需重启。
## Agent
每个 agent 针对一类漏洞。所有 agent 在每个 endpoint 并行运行,由 LLM planner 根据 endpoint 的特征进行选择。
| Agent | 检查项 | Payload 文件 |
|-------|--------|-------------|
| `xss_agent` | 反射型/存储型 XSS、DOM XSS、bypass 变体;Playwright 浏览器确认 | `xss.yaml` |
| `sqli_agent` | 基于错误、布尔盲注、基于时间盲注的 SQLi(最长 5 秒) | `sqli.yaml` |
| `ssrf_agent` | OOB HTTP 回调、内部探测、云元数据、同级主机探测 | `ssrf.yaml` |
| `file_read_agent` | 路径遍历、LFI、PHP wrappers、空字节注入 | `lfi.yaml` |
| `auth_agent` | Auth header 剥离、每个 endpoint 9 种基于 header 的 bypass 组合 | — |
| `secrets_agent` | AWS 密钥、GitHub/Slack token、私钥、JWTs、信用卡 | — |
| `discovery_agent` | SSTI、开放重定向、CRLF 注入、HTTP 方法篡改 | `ssti.yaml` |
| `llm_injection_agent` | 提示词注入、越狱、系统提示词泄露 | `llm_injection.yaml` |
| `business_logic_agent` | 数字边界滥用、提权、工作流绕过、批量赋值 | — |
| `blazor_agent` | Blazor WASM assembly 枚举、SignalR hub 枚举、未认证 negotiate、circuit 耗尽、暴露的调试工件 | `blazor.yaml` |
## 被动扫描器规则
规则以 YAML 文件的形式存在于 `dast/passive_rules/` 中。添加新的检查只需要一个新的 YAML 文件——无需修改代码。启动时加载了 62 条规则。
```
dast/passive_rules/
├── headers/
│ ├── security_headers.yaml HSTS, CSP, X-Frame-Options, Referrer-Policy, ...
│ ├── info_disclosure.yaml Server version, debug mode, X-Powered-By
│ └── cache_control.yaml Cacheable authenticated responses
├── cookies/
│ └── cookie_flags.yaml HttpOnly, Secure, SameSite, session cookie severity
├── cors/
│ └── cors.yaml Wildcard, reflected origin, null origin
├── secrets/
│ └── sensitive_data.yaml AWS/GitHub/Slack/Stripe keys, JWTs, credit cards
├── injection/
│ └── error_pages.yaml Stack traces, SQL errors, PHP/ASP.NET error pages
├── ai/
│ └── llm_endpoints.yaml LLM endpoint detection, injection marker, prompt leak
├── frameworks/
│ └── blazor.yaml Blazor-specific checks (WASM boot, SignalR, circuit management)
├── http2/
│ └── continuation_flood.yaml HTTP/2 CONTINUATION flood probe
└── discovery/
├── directory_listing.yaml
├── open_redirect.yaml
└── clickjacking.yaml
```
## Payload 文件
初始 payload 位于 `dast/payloads/*.yaml` 中。无需修改代码即可编辑。当 probe 被阻止时,LLM mutator 会自适应地生成 WAF bypass 变体。
| 文件 | 覆盖范围 |
|------|----------|
| `xss.yaml` | 基础、DOM、混淆、bypass、blind |
| `sqli.yaml` | 基于错误、布尔盲注、基于时间、混淆、堆叠查询 |
| `ssrf.yaml` | OOB HTTP、IP 混淆、内部探测(云元数据、file://) |
| `lfi.yaml` | Unix/Windows 遍历、空字节、PHP wrappers |
| `ssti.yaml` | Jinja2、Twig、Mako、FreeMarker、Pebble 的检测 + 混淆 |
| `llm_injection.yaml` | 直接/间接注入、越狱、系统提示词泄露 |
| `cmdi.yaml` | Unix/Windows 基础、基于时间的盲注、bypass/混淆 |
| `xxe.yaml` | 文件读取、OOB DTD、通过 XXE 的 SSRF、参数实体、CDATA |
| `jwt.yaml` | alg:none、弱密钥、kid 注入、jku/jwks header 注入 |
| `nosql.yaml` | MongoDB 操作符、JS 注入、Elasticsearch、Redis CRLF |
| `prototype_pollution.yaml` | Query string、JSON body、header、检测 payload |
| `blazor.yaml` | Blazor WASM boot 端点、SignalR negotiate、调试工件 |
## 服务图谱
通过共享的 JWTs、公共父域名、相关 header(`X-Trace-ID`、`traceparent`)以及共享的 session cookie 名称+值,自动检测多个主机是否属于同一个微服务应用。agent 会自动接收同级主机上下文:SSRF probe 针对已知的内部服务;auth agent 跨主机共享 token。
可以在 AI 标签页和通过 API 进行手动合并/拆分。
## 会话
随时将当前的 HTTP 历史记录 + 代理设置保存到磁盘。保存通知会显示确切的文件路径。可以从 Sessions 面板加载、导出为 JSON 或删除会话。
```
~/.dast-ai/sessions/ Session JSON files
~/.dast-ai/ca.crt CA certificate (install once in browser/OS trust store)
~/.dast-ai/ca.key CA private key
```
## AI 提供商设置
Frieren DAST-AI 需要一个 LLM 后端,用于协调器、agent 和 red-team validator。通过 `.env` 中的 `AI_PROVIDER` 选择三个提供商之一:
### 选项 1 — AWS Bedrock(默认)
```
# 1. 创建 SSO profile — 每台机器一次性操作
make sso-configure
# 出现提示时,输入你的组织 SSO 起始 URL、区域、账户 ID 和角色。
# 2. 将 .env.example 复制到 .env(make setup 会自动执行此操作),然后设置
# AWS_PROFILE 和三个 ANTHROPIC_DEFAULT_*_MODEL ARN 为你自己的
# Bedrock application-inference-profile ID。
# 3. 认证 — 在每次 token 过期时重复(通常每天一次)
make sso
```
### 选项 2 — 直接使用 Anthropic API
```
AI_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
AI_MODEL_ID=claude-opus-4-8 # or claude-sonnet-5, claude-haiku-4-5, etc.
```
### 选项 3 — OpenAI / 兼容 OpenAI 的平台(ChatGPT、Codex、本地网关等)
```
AI_PROVIDER=openai
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.openai.com/v1 # point at any OpenAI-compatible endpoint
AI_MODEL_ID=gpt-4o
```
这三种方式也可以随时在 dashboard 的 AI 标签页中进行切换(`POST /api/scan-config`)。
### 故障排除
| 错误 | 原因 | 修复方法 |
|-------|-------|-----|
| `config profile (X) could not be found` | 尚未创建 Bedrock profile | 运行 `make sso-configure` |
| `AWS_PROFILE is not set` | 缺少 `.env` 或 `AWS_PROFILE=` 为空 | 运行 `make setup`,然后编辑 `.env` |
| `ExpiredTokenException` | Bedrock token 过期 | 再次运行 `make sso` |
| `Could not connect to Bedrock` | 模型 ARN 错误 | 使用你自己的 ARN,而不是 `us.anthropic.*` 跨区域 ID |
## 环境变量
```
# AI provider — 其中之一:bedrock(默认)、anthropic、openai
AI_PROVIDER=bedrock
# 当 AI_PROVIDER=bedrock 时必需
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=us-east-1
AWS_PROFILE= # SSO profile — credentials auto-refresh on expiry
# 当 AI_PROVIDER=anthropic 时必需
ANTHROPIC_API_KEY=
# 当 AI_PROVIDER=openai 时必需
OPENAI_API_KEY=
OPENAI_BASE_URL= # default https://api.openai.com/v1
# 可选 — 活动模型(默认为下方的 Sonnet 层级)
AI_MODEL_ID=
# 端口(也可以通过 CLI flags 设置)
PROXY_PORT=8080
DASHBOARD_PORT=8088
PARALLEL_WORKERS=4
```
## 常见任务
```
# 安装所有内容(deps + Playwright + .env)
make setup
# AWS SSO 登录
make sso
# 启动 proxy + dashboard
make proxy
# 启动原生桌面应用(Electron 启动器)
make desktop-install # first run only
make desktop
# 使用预认证会话启动
uv run dast-ai proxy \
--auth-url https://app.example.com/login \
--username admin@example.com \
--password secret
# 运行单元测试
make test
# 运行集成测试(proxy 必须正在运行)
make test-integration
# 运行 LLM 决策质量评估(opt-in — 使用 Bedrock,消耗 tokens)
make evals # planner + red-team suites
make evals SUITE=planner # one suite
make evals MIN_ACCURACY=0.9 # non-zero exit if below threshold
# 验证被动规则数量和 payload 数量
make check
# JS + Python lint
make lint
```
## 已知问题
**Playwright 未安装**
```
uv run playwright install chromium
```
**CA 证书不受信任** —— 从 `http://127.0.0.1:8088/ca.crt` 下载并添加到你的浏览器或操作系统信任库中。
**AWS token 过期** —— 设置 `AWS_PROFILE`;凭证在出现 `ExpiredTokenException` 时会自动刷新。