日志日期 · 周三
Android 生产构建去符号后,内存结构依然可解析
一篇 arXiv 研究对比 Android 8 至 15 的 libart.so,发现符号被大量去除,但内存结构基本未变。
当天发生了什么
2026-07-15(UTC 13:29),Jayasimha Nannapaneni 与 Sneha Sudhakaran 在 arXiv 提交了关于 Android 内存取证可行性的论文(2607.13821,v1)。作者对比了 Pixel 出厂镜像中 Android 8 到 15 的未去符号开发构建与生产构建:静态符号从 20,495 个降到 0,动态符号减少约 60%,源文件引用消失;Android 15 的二进制中有一个压缩的后备段,可恢复数千个函数名,但不含结构布局。源码审查和内存映射比较显示,堆空间、垃圾回收基础设施和分配位图在 Android 8 与 15 之间基本未变。在已 root、完全去符号的 Pixel 7 上,运行时入口仍可通过动态符号表找到,按版本匹配的开发构建得到的结构偏移在生产内存中仍指向有效指针。
对保护应用逻辑意味着什么
这项研究面向取证,但它对应用开发者有两个直接启示。第一,去除符号会降低分析的便利性,却不会改变数据结构本身;只要能拿到版本匹配的参考构建,结构信息就可能被重新对应。这和应用自身的原生库一样:strip 是必要的卫生措施,而不是保护边界。第二,论文开头提到,内存取证可以恢复从未写入磁盘的证据,例如解密后的消息、会话凭证和应用的实时状态。对于在已 root 设备上运行的应用,应当假设进程内存中的明文数据和凭证是可以被读取的。研究的结论限定在作者测试的 Pixel 构建和版本上,不应过度推广。
可以在自己的应用上做的检查
第一,发布前确认原生库已去除调试符号,并把带符号的版本私下保存用于崩溃分析,但不要把这一步当作逻辑保护。第二,缩短敏感数据在内存中的停留时间:用完即清理缓冲区,避免长期缓存解密后的内容。第三,凭证使用短时效、可撤销、权限范围最小的令牌,由服务端控制刷新和失效。第四,需要在设备上保存的密钥尽量交给 Android Keystore 管理,使密钥材料不直接暴露给应用进程。第五,在风险评估中把“已 root 设备上的内存可读”作为默认前提,并据此决定哪些数据根本不应下发到客户端。
行动清单
- 原生库去符号,带符号版本私下保存
- 敏感数据用完即清理,避免长期缓存明文
- 使用短时效、可撤销的最小权限令牌
- 设备端密钥交给 Android Keystore 管理
原始资料
- arXiv: Assessing the Forensic Viability of Android Memory Analysis Across Production Builds (2607.13821) · 资料日期 2026-07-15 · 核对于 2026-10-12