【AI编码】提交AI生成文档
parent
583f29cfea
commit
63111e9a4c
|
|
@ -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` 不能覆盖全部包体泄露问题。
|
||||
Loading…
Reference in New Issue