0

我正在写一些关于 Android 设备的小型安全报告,这些报告通常与从 RAM 访问信息有关。主要条件是设备最初是无根的。

用例:用户打开 3rd-party 应用程序,在密码字段中输入一些密码。之后,该正在运行的应用程序会丢失设备。此应用程序的源代码显示此密码信息在应用程序启动并运行时在 RAM 中可用。例如在公共字符串 myPassword 中的 AllMyAppPasswords 类中。现在是关于访问此密码信息的可能方法的问题(如果我错了,请纠正我):

  1. 访问这个密码的方法是转储内存。
  2. 对于内存转储,我需要让设备植根。
  3. 为了根设备,我需要解锁引导加载程序。
  4. 要实现解锁引导加载程序和 root 操作,需要至少重新启动设备一次。
  5. 设备重新启动后,有关密码的信息从 RAM 中消失了

结论:如果设备是非 root 的,则无法从应用程序获取驻留在 RAM 内存中的密码。这是对的吗?

用例更新:我们假设用户刚刚拆箱新设备并且 100% 确定它没有被 root 并且不包含任何键盘记录应用程序。所以用户刚刚安装了我的应用程序,输入了密码,并且应用程序在运行时在内部使用这个密码来定期连接服务器(密码只有 RAM,从不存储在磁盘上)。因此,从视觉上看,编辑文本字段中没有任何内容,有关密码的信息仅在应用程序内存中供内部使用,当然不可能仅从屏幕上读取密码文本。现在用户丢失了他的手机。用户是否应该担心找到他手机的人可以从 RAM 中获取此密码信息?

4

1 回答 1

1

虽然不是该领域的亲身实践者,但我会声称我的兴趣肯定高于平均水平,以下是我的想法。不过,并不是说您可能不知道这一点。

  • 是的,Linux 保护进程内存免受其他普通用户(root 不是普通用户)的影响。
  • 我不明白为什么在您描述的场景中,找到手机的人不会简单地将有问题的应用程序带到前台并显示所有机密信息,因为您的场景已经假设找到设备的人可以成功解锁它,并且该应用程序仍在运行。
  • 但是,我怀疑(受您假设的AllMyAppPasswords类的启发)您打算构建一个类似于以下内容的参数:如果我的“密码安全”应用程序启动并识别出设备未植根,则需要重新启动才能改变这一事实,并且由于在非 root 设备上无法访问我的应用程序的内存,因此在 RAM 中保存解密的机密信息是安全的。如果这符合您的预期理由,我想请您注意以下方面。
    • 即使您应用了字节码混淆器,从您的 APK 逆向工程代码也相对容易。如果有人认为您的应用程序内存中保存的机密信息对他们来说足够重要,则尤其如此。这意味着每个人一旦获得访问权限,就可以相对容易地确定要查找的内容。
    • Linux 和 Java 虚拟机都存在安全漏洞,Android 设备厂商的更新策略在这方面并不完全透明。换句话说,即使手机没有root,也可能有一种方法,直接或结合错误,在root上下文中或使用应用程序的用户ID执行代码。
    • 一旦您的应用程序发布,root 手机的方式可能会发生变化,因此您可能无法可靠地识别已root 手机。
    • 任何加密数据和密钥必须仅存在于受信任的服务器上,否则人们只会从您的应用程序中提取密钥并访问存储在 Android 设备(如果有)上的加密数据,而不是尝试访问应用程序 RAM。
  • 如果有人拥有允许连接在线调试器的 Android 设备,那么所有的赌注都将失败,理论上这将允许在没有任何软件意识到这一点的情况下直接访问内存。我不确定这种情况的确切先决条件,我也不知道各个制造商在这方面采取了哪些预防措施。

我在一定程度上扩大了您最初问题的范围,但也许它对您仍然有用。即使一个字一个字地坚持你的问题,我相信安全漏洞点真的很痛,除了我不知道有任何可靠的(现在和将来完全没有疑问的)方法来识别根设备。

直接硬件访问可能超出您所针对的安全级别的范围,但我似乎记得我最近读过一些关于此的内容。

于 2013-03-07T11:45:23.183 回答