如何从非root电话中获取正在运行的应用程序的数据

时间:2013-03-07 10:50:31

标签: android

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

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

  1. 访问此pwd的方法是转储内存。
  2. 对于内存转储,我需要将设备设置为root。
  3. 为了设备的root,我需要解锁bootloader。
  4. 要实现解锁引导加载程序和root操作,需要至少重启一次设备。
  5. 重新启动设备后,有关密码的信息已从RAM中删除
  6. 结论:如果设备是非root用户,则无法从应用程序获取密码驻留在RAM内存中。这是对的吗?

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

1 个答案:

答案 0 :(得分:1)

虽然不是这个领域的动手内幕,但我会声称我对平均水平感兴趣,这是我的想法。但并不是说你不太可能已经知道这一点。

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

我在某种程度上扩大了原始问题的范围,但也许还有一些对你有用的东西。即使一字一句地坚持你的问题,我相信安全漏洞点确实很痛,除了我不知道任何可靠的(完全无疑的,现在和未来)的方式识别有根设备。

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