【AI编码】提交AI生成文档

main
刘涛 2026-03-18 15:05:47 +08:00
parent 583f29cfea
commit 63111e9a4c
1 changed files with 272 additions and 0 deletions

View File

@ -0,0 +1,272 @@
# 包体秘钥/敏感配置泄露排查报告
生成时间2026-03-18
## 排查范围
- 以“最终打出的客户端包体是否可能携带敏感信息”为核心标准。
- 不重点讨论仅在 Jenkins / Editor / 仓库内部流程中使用、且不会进入包体的配置。
- 风险分级规则:
- 明文进包:高风险
- 可逆弱保护进包:中高风险
- 仅编辑器/测试残留:低优先级,需结合实际打包结果确认
## 结论概览
当前项目中,敏感信息并非全部集中在 `LocalInfo.bytes`
已确认的包体风险点分为三类:
1. 明文资源文件进入包体
2. 弱保护/可逆方式进入包体
3. 代码中硬编码,编译后可能直接进入程序集
其中:
- `LocalInfo.bytes` 是运行时业务签名相关信息的主要承载点,但不是唯一来源。
- `CrashSightData.json`、`TalkingDataInitConfig.json`、`Adjust App Token` 均不依赖 `LocalInfo.bytes`
---
## 一、明文进包
### 1. CrashSight 配置
打包时将 CrashSight 配置直接写入 `Resources`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:693`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:709`
对应数据结构:
- `ProjectNLD/Assets/PhxhSDK/Phxh/SDKHelper/Data/CrashSightData.cs:7`
- `ProjectNLD/Assets/PhxhSDK/Phxh/SDKHelper/Data/CrashSightData.cs:8`
风险说明:
- 文件路径为 `Assets/Resources/CrashSightData.json`
- 该文件为明文 JSON
- 若其中 `id/key` 属于渠道、上报或平台鉴权字段,则可被直接提取
结论:高风险,属于“明文进包”。
### 2. TalkingData 配置
打包时直接生成:
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:723`
运行时从 `Resources` 加载:
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:61`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:69`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:86`
默认数据结构中也存在默认 appID
- `ProjectNLD/Assets/PhxhSDK/Phxh/SDKHelper/Data/TalkingDataInitTool.cs:9`
风险说明:
- 文件路径为 `Assets/Resources/TalkingDataInitConfig.json`
- 该文件为明文 JSON
- 至少包含 `appID`、`channel`
结论:高风险,属于“明文进包”。
### 3. Adjust App Token 硬编码
启动流程中直接写死:
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:133`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:134`
风险说明:
- 不经过资源文件
- 直接编译进程序集
- 反编译客户端即可得到
结论:高风险,属于“硬编码进包”。
---
## 二、弱保护/可逆方式进包
### 1. LocalInfo.bytes
#### 写入链路
打包时把敏感字段写入 `UpdateLocalInfo`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:82`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:85`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:86`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:90`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:91`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:98`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:99`
- `ProjectNLD/Assets/Editor/Common/BuildLauncher.cs:102`
结构体字段定义:
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:9`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:10`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:11`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:12`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:16`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/UpdateLocalInfo.cs:17`
#### 运行时使用链路
启动读取:
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs:37`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:227`
下游消费:
- `ProjectNLD/Assets/PhxhSDK/Phxh/PreConfig/PreConfig.cs:141`
- `ProjectNLD/Assets/PhxhSDK/Phxh/PreConfig/PreConfig.cs:142`
- `ProjectNLD/Assets/PhxhSDK/Phxh/Net/HttpHelper.cs:134`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:280`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:282`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:283`
- `ProjectNLD/Assets/PhxhSDK/Phxh/BI/BIToolinAOT.cs:685`
#### 保护方式评估
`LocalInfo.bytes` 虽然经过处理,但不是安全加密,而是固定常量派生后的 XOR
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/LocalInfoEncrypt.cs:15`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/LocalInfoEncrypt.cs:16`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/LocalInfoEncrypt.cs:35`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/LocalInfoEncrypt.cs:39`
风险说明:
- 该方式仅属于轻度混淆
- 客户端持有解密逻辑和密钥材料
- 拿到包体后可恢复明文
结论:中高风险,属于“可逆弱保护进包”。
### 2. Obfuz Secret 资源
启动时会加载静态 secret 资源:
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:40`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:46`
热更时还会加载动态 secret
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:58`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:297`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:298`
资源文件:
- `ProjectNLD/Assets/Resources/us5af47s54fsa1z90sf.bytes`
风险说明:
- 这类更偏代码保护/混淆体系用 secret不一定是业务 API key
- 但若按“所有 secret”口径统计仍属于包体内敏感材料
结论:中风险,建议纳入加固侧审计清单。
---
## 三、不是 LocalInfo.bytes 的旁路来源
以下结论已经可以确认:
- 不是所有敏感字段都写入了 `LocalInfo.bytes`
- `LocalInfo.bytes` 主要承载运行时业务签名相关字段
- `CrashSightData.json`、`TalkingDataInitConfig.json`、`Adjust App Token` 都是独立旁路
因此,如果后续整改只处理 `LocalInfo.bytes`,仍会遗漏包体中的其他敏感配置。
---
## 四、低优先级项(更偏源码/编辑器残留)
### 1. HotUpdateConfig 默认明文值
- `ProjectNLD/Assets/PhxhSDK/Phxh/Common/HotUpdateConfig.cs:14`
- `ProjectNLD/Assets/PhxhSDK/Phxh/Common/HotUpdateConfig.cs:15`
- `ProjectNLD/Assets/PhxhSDK/Phxh/Common/HotUpdateConfig.cs:19`
说明:
- 含有默认 `accessKeyId/accessKeySecret/httpKey`
- 当前检索结果显示其主要用于 `UNITY_EDITOR` / `EditorPrefs` 场景
- 更像编辑器假热更配置,不是正式包主路径
结论:低优先级,但建议清理默认值,避免误入正式构建。
### 2. PackDataInst 测试函数中的样例明文
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs:423`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs:426`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs:428`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs:432`
说明:
- 这是测试菜单逻辑中的样例值
- 不一定属于正式运行路径
- 但编译后字符串字面量可能仍出现在程序集内
结论:低优先级,建议一并清理。
---
## 五、风险分组汇总
### A. 明文进包
- `Assets/Resources/CrashSightData.json`
- `Assets/Resources/TalkingDataInitConfig.json`
- `ProjectNLD/Assets/Code/Scripts/HotUpdate/GameLauncher.cs:133` 中的 Adjust token
### B. 弱保护进包
- `Assets/Resources/LocalInfo.bytes`
- `Assets/Resources/us5af47s54fsa1z90sf.bytes`
- `Assets/Config/Obfuz/defaultDynamicSecretKey.bytes`
### C. 仅编辑器/测试残留,建议清理
- `ProjectNLD/Assets/PhxhSDK/Phxh/Common/HotUpdateConfig.cs`
- `ProjectNLD/Assets/PhxhSDK/Phxh/VersionUpdate/Data/PackDataInst.cs` 中测试样例值
---
## 六、整改建议
### P0
- 不再把长期 secret 放入客户端包体无论是明文、JSON、bytes、还是可逆“加密”形式。
- 先处理 `CrashSightData.json`、`TalkingDataInitConfig.json`、`Adjust token`、`LocalInfo.bytes` 中的长期密钥。
### P1
- `LocalInfo.bytes` 仅保留公开配置:渠道、版本、公开 URL、非敏感 app id。
- 客户端签名逻辑改为服务端签发短期票据,不让客户端持有 `secretKey/httpKey/accessKeySecret`
### P2
- 清理 `HotUpdateConfig` 默认明文值。
- 清理 `PackDataInst` 测试函数中的样例密钥常量。
- 对最终 APK/IPA 做一次解包复核,确认资源目录与程序集常量中不再存在历史残留值。
---
## 七、最终判断
本次排查确认:
- `LocalInfo.bytes` 是主要风险点,但不是唯一风险点。
- 当前包体内同时存在“明文敏感配置”和“可逆弱保护敏感配置”。
- 仅修复 `LocalInfo.bytes` 不能覆盖全部包体泄露问题。