缓冲区溢出如何在 Android 中有害?

信息安全 安卓 缓冲区溢出
2021-08-15 01:05:35

缓冲区溢出如何在 Android 中具有潜在危险?

具体来说,如果每个应用程序都有自己的用户 ID,并且它在具有相同 ID 的 Dalvik VM 副本中运行。我以为即使发生溢出,写入应用程序的内存页面的shellcode也只会拥有与应用程序本身相同的权限?

4个回答

我们以 Stagefright 为例,用 C++ 编写的媒体库

溢出如何绕过分配的权限很简单;C代码可以直接写入内存。作为开发人员,您的工作是确保您放入的内容适合,否则它会很乐意覆盖具有相同权限的其他指令。Stagefright 有很多特权。流出缓冲区的信息可能是来自互联网的随机猫视频(然后 - 获得 - 媒体库的权限)

所以假设溢出是无害的就太天真了。Stagefright 包含缓冲区溢出,这是非常危险的。Android 开发人员通过实施(以及其他措施)地址空间布局随机化 (ASLR) 使利用变得更加困难,这使得使用的偏移量不可预测,从而导致错误而不是代码执行。但是通过将其与浏览器漏洞相结合,可以泄露有关内存页面当前位置的信息,因此仍然可以执行代码。

我建议阅读 Metaphor,一个 Stagefright 实现,包括 ASLR 旁路,论文和 PoC 代码可在线获得

让我解释一下操作员的问题:Android 有一个基于用户 ID 的应用程序隔离模型,溢出如何绕过它?

答案是你溢出了应用程序之间共享的部分:服务、系统应用程序和 Linux 内核本身。许多这些组件都是用 C/C++ 编写的,因此它们很容易受到攻击。

这就是您在所有多用户系统中进行权限提升的有效方式,Android 并没有什么特别之处。

我以为即使发生溢出,写入应用程序的内存页面的shellcode也只会拥有与应用程序本身相同的权限?

除非溢出是在内核中或在进程间通信中暴露的东西(android 提供许多东西作为服务),是的。

但是请注意,三个关键应用程序:消息传递、电子邮件和浏览器,具有相当多的权限。足以窃取一些重要的私人数据。这些应用程序也是解释不可信的外部内容的应用程序。因此,由这些应用程序来确保外部内容(如网页)不能使用它不应该使用的权限。

这些应用程序还运行许多可能易受攻击的 C 或 C++ 代码,因为解释某些内容(尤其是视频和 javascript)是 CPU 和内存密集型的,Java 和 JVM(Android JVM 不如桌面)是不能完成任务,并且在代码从其他平台重用之前。大多数严重漏洞利用的目标都是此代码中的漏洞。

我不是 Android 安全专家,但我想我可以回答这个问题,比如说 Apache/Linux 场景,我认为 Android 也存在同等威胁(让我们暂时搁置这个问题,Android 中是否可能发生缓冲区溢出)。

  1. 缓冲区溢出允许攻击者将代码注入正在运行的进程的内存中。通常,攻击者会尝试注入启动 shell(例如 /bin/bash)的代码,该 shell 将其标准输出发送到她的远程攻击框并从该框接收标准输入。结果是攻击者计算机上的终端窗口,但 shell 进程在被攻击的机器上运行。现在,正如您在 Android 中所说,该进程在用户空间中运行。对于 Linux 上的普通 Web 服务器场景也是如此。即,您将代码注入其所有者没有太多特权的进程内存中(www-data 或 apache 在 Linux 上根本不强大)。此时,您只能从攻击者的盒子远程执行用户有权在操作系统中执行的操作。在 Linux 中,这是非常有限的,正如您在 Android 中所说的那样。
  2. 攻击者的下一步目标是提权。即发现操作系统中的另一个缺陷/任何可以让您摆脱“沙盒”类型的东西的缺陷。Windows / Linux /任何允许从有限用户升级权限的错误都有数百/数千个到 root/Administrator(过去 15 年计算)。对于 Android,这意味着您需要在 Android 操作系统中找到这样的错误,以便您突破用户空间。由于这个世界上不存在完美,因此很可能存在允许这样做的错误。是否找到它们仅取决于您的时间和精力。
  3. Android中是否存在缓冲区溢出?当然,他们可以。与大多数操作系统一样,Android 是用 C 编写的。每个手机供应商都有自己的操作系统风格,那么是什么让您确定没有一个三星/LG/任何开发人员在代码中引入缺陷?在 Java 和 C 之间的接口上,C 部分仍然需要进行适当的边界检查,否则您仍然会覆盖内存。但是,作为应用程序开发人员,您不再需要担心这个问题,因为在 Java 中无法直接写入内存地址。