是否可以以编程方式验证系统生成的 odex 文件的完整性/校验和?
我想知道如何检测,如果有根 Android 手机上的攻击者为应用程序安装了他自己版本的 odex 文件。
假设是,如果攻击者能够替换 .odex 文件,他们就有足够的权限来执行任何数量的其他事情。
构建生成的 odex 文件位于 /system 上的受保护目录中,该目录以只读方式挂载。任何能够修改这些文件的人都可以简单地破解虚拟机或替换系统的主要部分。
installd 生成的 odex 文件位于 /data/dalvik-cache 中,并受文件系统权限保护。任何有权修改 .odex 文件的人都可以做各种事情,例如在您不查看时重新安装应用程序。对于攻击者来说,这将是一种更好的方法,因为它可以在 OTA 更新(这会导致重新 dexopt)中幸存下来。
修改优化的 DEX 数据是可行的,但有点痛苦。这样做相对于替换应用程序的优势在于它更加微妙——要重新安装应用程序,您要么需要原始签名密钥,要么希望用户没有意识到他们现在正在运行同名但不同的签名者。
因此,.odex 文件有一个校验和,如果您怀疑文件系统的完整性,您可以查看它,但除了重新执行 dexopt 和前后比较之外,没有提供检查篡改的规定。
有关 dexopt 和 odex 的一般信息可在dalvik/docs/dexopt.html的 Android 源代码中找到;这里有一个格式很好的版本。
编辑:我应该提到 DEX 和 ODEX 文件确实在文件头中存储了校验和。这些通常被忽略,因为出于性能原因,您不希望每次启动应用程序时都扫描整个文件。dalvik.vm.check-dex-sum
您可以通过将属性设置为true
(或-Xchecksum
在命令行上传递)来启用强制校验和验证。
校验和旨在检测文件损坏,而不是故意更改。(您可以使用dexdump -c
手动扫描。)篡改文件的人可以重新计算有效的校验和并将其存储,因此您需要将已知的良好副本保存在其他地方。并且您希望使用 SHA1 或类似的而不是 adler32 来使操作二进制文件以获得相同的校验和值变得更加困难。