diff --git a/ProjectNLD/AI_Gen_Doc/package_secret_exposure_report.md b/ProjectNLD/AI_Gen_Doc/package_secret_exposure_report.md new file mode 100644 index 00000000000..ce2a7672dc1 --- /dev/null +++ b/ProjectNLD/AI_Gen_Doc/package_secret_exposure_report.md @@ -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` 不能覆盖全部包体泄露问题。