name: sensitive-print-scan description: 通用敏感信息打印/日志/落盘 白盒安全测试。扫描源码中打印密码、密钥、Token、SessionID、MAC、IP等敏感信息的代码位置。支持ArkTS、TypeScript、JavaScript、Vue、Java、Python、Go、C/C++、C#、Swift、PHP、Ruby等多语言。当用户提到"敏感信息打印"、"日志泄露"、"打印密码"、"日志安全审计"、"敏感信息落盘"、"hilog隐私标识"、"console.log敏感"、"白盒测试打印"、"敏感信息泄露检视"时触发此skill。采用逐文件subagent独立测试+即时落盘策略,避免上下文溢出。
敏感信息打印/日志/落盘 通用白盒安全测试技能
本 skill 对源码项目执行敏感信息泄露审计:检测密码、密钥、Token 等鉴权凭据是否被打印到日志、控制台或明文写入文件/存储。
一、核心流程(4 阶段,不可跳过)
[阶段1: 向用户确认参数] → [阶段2: 生成测试计划] → [阶段3: 用户确认计划] → [阶段4: 逐文件执行测试]
二、阶段 1:参数确认(必须完成)
此阶段不可跳过,不可自行推断用户意图。
2.1 第 1 轮提问(必问)
逐一提问以下问题,每次 1~2 个:
- 请提供需要扫描的根目录路径(绝对路径)。例如:
D:\project\src\或/home/user/project/- 测试计划和结果文件输出到哪个目录?例如:
TestPlan\SensitivePrintTest\
等待用户回复后,继续第 2 轮。
2.2 第 2 轮提问(确认)
- 以下目录/文件类型将自动排除,是否需要额外排除项?
- 自动排除:
*.md、*.png、*.svg、*.jpg、*.gif、*.ico、*.css、*.scss、*.less、*.d.ts、node_modules/、dist/、build/、.git/- 是否有特定的编码规范文件(如 CLAUDE.md)需要参考?如有,请提供路径。
2.3 第 3 轮提问(可选)
- 是否仅扫描特定语言的文件?(如仅
.ets和.ts)默认:扫描所有支持的源码文件- 是否有已知的高风险文件需要重点关注?如有,请列出。
三、阶段 2:生成测试计划
参数确认完毕后,先探索目录结构,然后按以下模板生成测试计划文档。
3.1 探索目录结构
列出根目录下的所有子目录和源码文件,统计文件数量。
按语言/模块分组,优先排列高风险模块(安全模块、认证模块、网络通信模块)。
3.2 测试计划文档模板
输出文件:{输出目录}/SensitivePrintTestPlan.md
测试计划必须包含以下核心内容:
(1) 测试概述
- 测试目的:检测敏感信息打印/日志/落盘问题
- 测试范围:明确列出包含和排除的目录/文件类型
- 测试方法概述:搜索打印/日志/写文件函数 → 识别敏感变量 → 追溯变量来源 → 应用分级规则 → 输出发现
(2) 敏感信息等级定义
| 等级 | 类型 | 示例 |
|---|---|---|
| P0 致命 | 密码明文、密钥明文、Token(ak/sk)、SessionID、证书私钥、硬编码凭据 | password = "admin123" |
| P1 高危 | 加密密文、Authorization/WWW-Authenticate头、nonce/random、MAC地址、完整API请求/响应体 | Authorization: Digest ... |
| P2 中危 | IP地址、设备SN、用户名/手机号/邮箱、cameraCode、设备配置JSON | ip=192.168.1.1 |
| P3 低危 | 文件路径、端口号、HTTP方法、状态码、字符串长度 | port=8080 |
(3) 等级判定补充规则(核心防误报规则)
必须逐条检查和应用以下规则:
规则 A — 隐私标识降级规则:若代码已使用脱敏标识(如 ArkTS %{private}s、Java %mask%),P0→P1,P1→P2,P2→无发现
规则 B — Error 对象豁免规则:仅打印 err.message / e.getMessage() / str(e) 等异常消息且无敏感数据拼接的,不标记
规则 C — 禁止变量名推测规则:禁止仅凭变量名(key/result/data/url/info)判定为敏感。必须在文件内搜索追溯变量的实际赋值来源
规则 D — 不确定标记规则:无法在文件内完成追溯的,标注 [待确认] 不得给确定等级
规则 E — 响应体打印规则:打印完整 API 请求体/响应体(JSON.stringify 或等价操作)→ 无论是否脱敏,最低标记 P1
(4) 测试执行策略
明确说明以下策略:
主 Agent 循环:
对文件列表中的每个文件:
1. 创建独立 subagent,加载当前文件
2. subagent 分析完毕,返回结构化发现
3. 主 Agent 将结果追加写入结果文件
4. 释放 subagent,继续下一个文件
(5) 文件分组
按优先级将文件分为若干组:
- 第1组(高风险优先):安全模块、加密模块、认证模块
- 第2组:网络通信模块、API 调用模块
- 第3组:业务处理模块、Handler/Controller
- 第4组:服务层、工具类
- 第5组:视图层、组件(前端项目)
- 第6组(低风险快速扫描):数据模型/类型定义/枚举常量
每组标注预估文件数量和需要深度检查的重点文件。
(6) 输出格式规范
每条发现必须包含以下字段(详细模板见阶段 4 的 Subagent Prompt 模板):
- 代码片段:实际代码 + 前后各 2 行上下文
- 敏感变量追溯:变量名 → 赋值来源 → 实际类型
- 打印内容(强制):明确列出实际被打印的信息。若为请求体/响应体/对象,逐字段列出其含有的字段名和类型;若无法追溯体内容,须声明原因
- 风险描述、脱敏状态、等级调整
3.3 生成计划后暂停
生成计划后,必须暂停并提示用户:
测试计划已生成:
{输出目录}/SensitivePrintTestPlan.md。请审核计划内容,确认后我将按计划逐文件执行测试。是否继续?
四、阶段 3:用户确认计划
等待用户审核测试计划。用户可能要求修改以下内容:
- 调整扫描范围(增加/排除目录)
- 修改等级定义或判定规则
- 调整文件分组和优先级
- 补充重点关注文件
收到用户确认后,进入阶段 4。
五、阶段 4:执行测试
5.1 初始化
- 创建结果文件:
{输出目录}/SensitivePrintTestResult.md - 写入结果文件头部:
# 敏感信息打印/日志/落盘 白盒测试结果
> 测试日期: YYYY-MM-DD
> 测试引擎: [当前引擎名称]
> 测试范围: [根目录路径]
> 发现总数: [测试完成后统计]
---
- 读取测试计划,获取文件清单
5.2 逐文件测试循环
对每个文件,执行:
- 发起 subagent:创建独立上下文的 subagent,传入下述 prompt 模板
- 等待完成:主 Agent 不加载被测文件,仅收集 subagent 返回
- 追加落盘:立即将 subagent 返回追加写入
SensitivePrintTestResult.md - 释放资源:完成一个文件后释放 subagent,再处理下一个
5.3 Subagent Prompt 模板
你是白盒安全测试 agent,请对以下文件进行敏感信息打印/日志审计。
## 文件信息
- 文件路径: {文件路径}
- 编程语言: {语言}
## 测试要求
1. 读取文件全部内容,逐行审阅
2. 搜索所有打印/日志/落盘函数的调用(见下方语言模式)
3. 识别参数中的敏感变量
4. **对每个疑似敏感变量,在文件内部追溯其赋值来源**(搜索变量定义、赋值语句、函数参数)
5. **若打印内容为请求体/响应体/对象:必须追溯该对象的具体字段结构**(搜索类型定义、接口定义、构造函数),明确列出体中实际包含的敏感字段名和类型。若无法确认,显式声明"无法追溯体内容"
6. 应用等级判定规则分级,并应用调整规则 A~F
## 等级定义
P0(致命): 密码明文、密钥明文、Token(ak/sk)、SessionID、证书私钥、硬编码凭据
P1(高危): 加密密文、Authorization/WWW-Authenticate头、nonce/random、MAC、完整请求/响应体
P2(中危): IP地址、设备SN、用户名/邮箱/手机、cameraCode、设备配置JSON
P3(低危): 文件路径、端口号、HTTP方法、状态码
## 调整规则(必须逐条检查并应用)
A. 若已使用脱敏标识(如%{private}s) → P0降P1, P1降P2, P2降为无发现
B. 仅打印err.message且无敏感数据拼接 → 不标记
C. 禁止仅凭变量名判定 → 必须在文件内追溯实际赋值来源
D. 无法在文件内确认的 → 标注[待确认],不给确定等级
E. 打印完整请求/响应体(JSON.stringify) → 最低标记P1
F. 凡发现涉及请求体/响应体/对象打印的 → 必须追溯体中的具体字段。在"打印内容"中逐字段列出(如 body.password(密码明文)、body.sn(设备SN)、body.mac(MAC地址))。若类型定义为外部/跨文件无法追溯,标注"无法追溯体内容:[原因]"并降为[待确认]
## 语言模式参考
参考附件:references/language-patterns.md
## 输出格式
每个发现必须包含以下完整字段。**"打印内容"字段是强制项,必须明确列出实际被打印的信息**:
### [P等级] {文件路径}:{行号}
**代码片段**:
```语言
(实际代码,前后各2行上下文)
敏感变量追溯: 变量名 → 第X行赋值为[具体来源] → 实际类型为[密码明文/Token/IP/...] 打印内容: [明确描述实际打印/输出的信息。若为请求体/响应体/对象,必须逐字段列出:字段1(类型)、字段2(类型)...。若无法追溯体内容,必须写明原因,如"无法追溯体内容:bean定义在外部依赖中"] 风险描述: 一句话 脱敏状态: [已使用xxx脱敏 / 未脱敏] 等级调整: 原始P? → 调整后P?(原因:规则X)
无发现则输出:✅ {文件路径} — 未发现敏感打印
输出示例
### [P1] service/NvrAddCameraService.ets:586
**代码片段**:
```typescript
const body = { password: pwd, username: user, mac: device.mac }
hilog.info(DOMAIN, TAG, 'body=%{public}s', JSON.stringify(body))
敏感变量追溯: body → 第585行构造 → password来自参数pwd(密码明文), username来自参数user, mac来自device.mac 打印内容: body.password(设备密码明文)、body.username(用户名)、body.mac(MAC地址) 风险描述: 密码明文通过%{public}s打印到日志 脱敏状态: 未脱敏(使用%{public}s) 等级调整: 原始P0 → 调整后P0(规则F:body.password为密码明文,维持P0)
### 5.4 主 Agent 的职责
主 Agent 在测试执行阶段:
- **不加载被测文件内容**(防止上下文溢出)
- 调度 subagent,传递文件路径和 prompt
- 收集 subagent 返回的结构化结果
- 每收到一个结果,立即追加写入结果文件
- 跟踪进度(已完成/剩余文件数)
- 对标记 `[待确认]` 的发现,判断是否需要跨文件追溯
### 5.5 完成阶段
全部文件测试完成后,主 Agent 在结果文件末尾追加:
```markdown
## 统计汇总
| 等级 | 发现数量 |
|------|---------|
| P0 致命 | N |
| P1 高危 | N |
| P2 中危 | N |
| P3 低危 | N |
| **总计** | **N** |
- 测试文件总数: N
- 有发现文件数: N
- 无发现文件数: N
### P0致命问题清单
| 序号 | 文件 | 行号 | 问题简述 |
|------|------|------|---------|
> 测试完成时间: YYYY-MM-DD HH:MM
六、Post-Test 结果审核指南
测试完成后,主 Agent 应自行对结果执行质量审核:
- 等级合理性:扫描所有 P0,确认已应用规则 A(脱敏标识降级)
- err.message 误报:扫描是否有仅打印异常消息被标记的发现(规则 B 应排除)
- 变量名猜测:扫描是否有仅凭变量名没有追溯的发现(规则 C 违规)
- 追溯完整性:每个发现是否包含"变量 → 行号 → 赋值来源 → 实际类型"
- 代码片段:每个发现是否附带了实际代码
- 大文件覆盖:对于超过 20KB 且涉及认证/密码逻辑的文件,发现数量是否显著偏少
- 打印内容字段(新增):每个发现是否包含"打印内容"字段。对于请求体/响应体相关发现,是否追溯到了体中的具体敏感字段(规则 F);若显示"无法追溯",原因是否合理
- 体内容追溯深度(新增):扫描所有"打印请求体/响应体"类发现,检查是否仅写了"打印请求体"而未说明体中的具体字段。若体内容无法追溯,是否标注了原因
审核后,在结果文件中追加审核结论,标注需修正的发现。
七、语言模式参考
详细的语言特定打印和写文件函数模式,请读取 references/language-patterns.md。
八、注意事项
- 分步落盘是核心策略:不等待全部完成才写入,每个文件完成后立即追加
- 测试计划中明确声明:将测试细分为每个小模块,完成一个后落盘,再测试下一个
- 不关注文档文件:所有
.md及其他非源码文件不在测试范围内 - 先计划后执行:不可跳过计划阶段直接测试
- subagent 的独立性:每个 subagent 独立上下文,不依赖前一 subagent 的结果