【发布时间】:2019-06-06 17:37:00
【问题描述】:
我一直在对 Android 应用进行一些安全测试。我想要解决的一件事是 API 密钥安全性。特别是谷歌地方和地图键。有很多帖子讨论了这些选项,即将密钥编译为源代码,将它们放入资源文件中,将它们编译到共享库中等。在我的特定情况下,Maps 密钥在清单文件中,而 Places 密钥在共享库中。我创建了一个签名的 APK 来测试获取和使用其中一个密钥的难度。我做了以下事情:
- 使用 apktool 对 APK 进行逆向工程,
- 打开清单并抓住地图键,
- 创建了一个虚假版本的应用程序,其包结构与原始版本相同,其中包含一个带有谷歌地图片段的活动,
- 将 Maps 密钥放入虚假清单中,
- 运行显示地图的应用程序
然后我:
- 在伪造的应用程序中创建了一个新类,其包和名称与原始应用程序相同,代码从 /data/data/[包名] 加载共享库,
- 将反向工程 APK 中的共享库复制到假应用的 /data/data/[package name] 文件夹中,
- 运行假应用程序,然后打印出 Locations API 密钥
所以最后,不费吹灰之力,我就拥有了两个密钥,然后我可以将它们用于伪造的应用程序版本。
我确定我一定错过了什么。看起来 Maps 的唯一选择是将密钥存储在清单中。是什么阻止某人做我所做的事?当然不能只是冷漠。我意识到如果有人试图使用被劫持的 API 密钥发布他们的应用程序,他们可能会被抓住。但是,有人可以创建一个应用程序并让人们侧加载它。如果公司必须在每次有人弄乱被劫持的密钥时都更改它,这将对客户造成巨大的破坏。
【问题讨论】:
标签: android google-maps google-places