>使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒-系统安全-黑吧安全网 | xxx>使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒-系统安全-黑吧安全网 – xxx
菜单

>使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒-系统安全-黑吧安全网

三月 9, 2020 - 黑吧安全网

使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒

来源:本站整理 作者:佚名 时间:2020-03-10 TAG: 我要投稿

可以利用跨进程内存泄漏的漏洞逃逸Chrome沙箱。在发起此攻击之前,仍然需要攻击者攻击Renderer。为了防止对受影响的CPU进行攻击,请确保您的微代码(microcode)是最新的,并禁用超线程(HT)。
在我的上一个博客文章“破坏数据流”中,我描述了如何利用Chrome的JavaScript引擎V8中的漏洞在Renderer进程中执行代码。为了使这种利用有效,您通常需要将其与第二个漏洞链接在一起使用,因为Chrome的沙箱会限制您对操作系统的访问,并且网站隔离技术(site-isolation)将不同网站隔离到单独的进程中,以防止您绕过Web平台的限制。
在本文中,我们将研究沙箱,尤其是当从被攻击的Renderer进程中使用RIDL和类似的硬件漏洞时所产生的影响。Chrome的IPC机制Mojo基于消息发送关键数据,泄漏的这些关键数据使我们能够将消息发送到特权接口,并执行Renderer进程不应允许执行的操作。我们将使用它来读取任意本地文件,以及在Windows上的沙箱外部执行.bat文件。在撰写本文时,Apple和Microsoft都在与Chrome安全团队合作积极致力于修复此漏洞,以防止这种攻击。
 
背景
以下是有关Chrome流程模型的简化概述:
>使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒-系统安全-黑吧安全网
Renderer进程位于单独的沙箱中,并且对内核的访问受到限制,例如,通过Linux上的seccomp过滤器或Windows上的win32k lockdown机制。但是,为了使Renderer进程执行任何有用的操作,它需要与其他进程通信以执行各种操作。例如,要加载图像,将需要使用网络服务来完成加载。
Chrome中用于进程间通信的默认机制称为Mojo,它支持消息/数据管道和共享内存。通常您会使用C++,Java或JavaScript中的高级语言之一。也就是说,您使用自定义接口定义语言(IDL)的方法创建一个接口,Mojo用您选择的语言为您生成存根(stubs),而您实现 功能。想要看代码是如何实现的,可以查看 .mojom IDL,C++实现,在Renderer中使用中的URLLoaderFactory类。
Mojo的一项显著功能是允许您通过现有通道转发IPC端点。该代码在Chrome代码库中得到了广泛使用,即,每当您在.mojom文件中看到pending_receiver或未pending_remote参数时。
>使用RIDL(Rogue In-Flight Data Load)技术逃逸Chrome沙盒-系统安全-黑吧安全网
在幕后,Mojo在进程之间或更具体地在Mojo的节点之间使用特定于平台的消息管道。由于Mojo支持消息发送机制,所以两个节点不需要彼此连接。网络中的一个节点称为代理节点(broker),该代理节点(broker)需要设置节点通道并执行沙箱所限制的某些操作。
IPC端点本身称为端口(ports)。在上面的URLLoaderFactory示例中,客户端和实现方都由端口标识。在代码中,端口如下所示:
class Port : public base::RefCountedThreadSafe
 {
 public:
  // […]
  // The current State of the Port.
  State state;
  // The Node and Port address to which events should be routed FROM this Port.
  // Note that this is NOT necessarily the address of the Port currently sending
  // events TO this Port.
  NodeName peer_node_name;
  PortName peer_port_name;
  // The next available sequence number to use for outgoing user message events
  // originating from this port.
  uint64_t next_sequence_num_to_send;
  // […]
}
上面的peer_node_name 和peer_port_name 都是用于寻址的128位随机整数。如果将消息发送到端口(port),它将首先将其转发到正确的节点,接收节点将在本地端口映射中查找端口名称,并将消息放入正确的消息队列。
当然,这意味着,如果浏览器进程中存在信息泄漏漏洞,则可以泄漏端口名称,并使用它们将消息注入特权IPC通道。实际上,这在Mojo核心文档的安全性部分中已提到:
“ […]任何节点只要知道端口和节点名称,就可以将任何消息发送到任何其他节点的任何端口。[…]因此,重要的是不要将端口名称泄漏到不应被授予相应功能的节点中。”
利用泄漏的端口号的的一个很好的例子是crbug.com/779314通过@NedWilliamson。这是blob实现中的整数溢出,它使您可以在浏览器进程中读取blob结构前面的任意数量的堆内存。该漏洞将大致如下所示:
攻击Renderer进程。
使用Blob 泄漏的堆内存。
在内存中搜索端口(有效状态+ 16个高熵字节)。
使用泄漏的端口将消息注入特权IPC连接。接下来,我们来看两件事。如何用CPU漏洞替换上面的第2步和第3步,以及如何通过特权IPC连接获得什么样的原语。
 
RIDL
为了通过硬件漏洞利用这种行为,需要找到一个跨进程边界的泄漏内存漏洞。来自MDS攻击的 RIDL 似乎是最理想的选择:它使您能够从受影响的CPU上的各种内部缓冲区泄漏数据。有关其工作原理的详细信息,请查看论文或幻灯片,因为它们比我能解释的要好得多。
已经发布了微码(microcode)和操作系统更新来解决MDS攻击。但是,如果您阅读了英特尔对该主题的深入研究,您会注意到,缓解措施在切换到特权较低的执行上下文时清除了受影响的缓冲区。如果您的CPU支持超线程,您仍然可以从物理内核上运行的第二个线程中读取泄漏数据。解决此问题的建议是禁用超线程或实现组调度程序。
你可以找到多个从2019年五月的公开的MDS漏洞的POCs在网上1,2,3,这些POCs都具有如下属性:
它们总会加载或存储数据。
有些要求从L1缓存中清除数据。
您可以控制64字节高速缓存行中的索引读取到先前的访问的数据,一个64位的值。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。

上一篇:从源码调试_int_free一次看懂how2heap之unlink返回黑吧安全网首页】【进入黑吧技术论坛
下一篇:Linux slub 分配器上的安全加固学习


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51