| name | trace-preauth |
| description | 从 Preauth 路由入口正向追踪调用链。读取 preauth-routes.json,对每个无需鉴权的路由使用 JetBrains 工具逐层追踪方法调用,匹配 Sink 模式,分析参数可控性。用于:Preauth 漏洞发现、正向污点分析。触发词:trace preauth、正向追踪、preauth 分析、未授权追踪、Phase 5。 |
Preauth 正向追踪 (Phase 5)
适用场景
- 对无需鉴权的路由从入口正向追踪,寻找可利用的漏洞
- 作为
java-audit Phase 5 被调度执行
不适用场景
- 还没有 preauth 路由列表 → 先执行
analyze-auth
- 需要从 Sink 反向追踪 → 使用
trace-sink
前置条件
- Serena MCP 已连接,目标项目已激活
.audit/preauth-routes.json 已存在(由 analyze-auth 生成)
.audit/sinks.json 已存在(可选,用于交叉比对)
反幻觉铁律
1. 方法体必须通过 jet_brains_find_symbol(include_body=true) 实际读取
2. 每一跳必须标注 文件路径:行号
3. 参数传递关系必须从代码确认,不得推测
4. 无法确认的链路标记为 [Hypothesis]
工作流程
Step 1: 读取 Preauth 路由列表
读取 .audit/preauth-routes.json,获取所有无需鉴权的路由端点。
Step 2: 逐个路由正向追踪
对每个 preauth 路由执行:
-
获取入口方法
- 调用
jet_brains_find_symbol(method_name, include_body=true) 获取方法完整代码
- 标注每个参数的来源(
@RequestParam、@PathVariable、@RequestBody、@RequestHeader、HttpServletRequest 等)
-
正向追踪调用链
- 识别方法体中调用的其他方法
- 对每个被调用方法,使用
jet_brains_find_symbol(include_body=true) 获取实现
- 逐层深入(最多 5 层),跟踪外部参数的传递路径
-
Sink 模式匹配
在追踪过程中检查是否调用了危险 API(参考 find-sink 的漏洞模式库):
- SQL 拼接、命令执行、文件操作、反序列化、表达式解析等
- 标注匹配到的 Sink 类型和代码位置
-
交叉验证
- 与
.audit/sinks.json 交叉比对
- 正向追踪命中已知 Sink → 确认该 Sink 的 preauth 可达性
- 正向追踪发现新 Sink → 追加记录
-
参数可控性分析
在每一跳中检查:
- 外部参数是否直接传递到下层
- 是否经过过滤/校验/转换
- 最终是否到达危险 Sink
Step 3: 输出报告
输出 .audit/trace-preauth.md:
# Preauth 正向追踪报告
## Route: GET /api/public/download
**入口**: `PublicController.download()` at `PublicController.java:15`
**参数**: `@RequestParam("file") String filename` — 完全由 HTTP 参数控制
**追踪路径**:
1. `PublicController.download(filename)` at `PublicController.java:15`
- 调用 `FileService.getFile(filename)`
↓
2. `FileService.getFile(filename)` at `FileService.java:30`
- 参数传递: `filename` → `filename` (直接传递)
- 调用 `new FileInputStream(basePath + filename)`
↓
3. [SINK] `new FileInputStream(basePath + filename)` at `FileService.java:35`
- 路径拼接无校验
**漏洞**: 任意文件读取 (arbitrary_file_read)
**参数可控性**: filename 完全由 HTTP 参数控制,无过滤
**防护措施**: 无路径遍历校验
**鉴权状态**: Preauth — 无需任何认证
**风险**: Preauth + 任意文件读取 = 严重
**状态**: [Confirmed]
---
注意事项
- 追踪深度限制 5 层
- Preauth 漏洞优先级高于 Postauth,因为无需认证即可利用
- 注意参数类型约束:
@PathVariable Long id 天然限制了注入面,但 String 类型参数需重点关注
- 如果入口方法参数为复杂对象(
@RequestBody UserDTO user),需追踪对象各字段的使用