加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 安全 > 正文

借助 Mojo IPC 的 UAF 漏洞逃逸 Chrome 浏览器沙箱

发布时间:2022-07-11 16:07:42 所属栏目:安全 来源:互联网
导读:0x01 分析背景 我的目标是使不熟悉Chrome浏览器开发的人可以看懂这个帖子,因此,我将从了解Chrome的安全架构和IPC设计开始。请注意,此部分的所有内容也适用于基于Chromium的Edge,默认情况下已于2020年1月15日发布。 Chrome 架构 Chrome安全体系结构的关键
   0x01 分析背景
 
  我的目标是使不熟悉Chrome浏览器开发的人可以看懂这个帖子,因此,我将从了解Chrome的安全架构和IPC设计开始。请注意,此部分的所有内容也适用于基于Chromium的Edge,默认情况下已于2020年1月15日发布。
 
  Chrome 架构
 
  Chrome安全体系结构的关键支柱是沙箱。Chrome将网络的大部分攻击面(例如DOM渲染,脚本执行,媒体解码等)限制为沙盒进程。有一个中央进程,称为浏览器进程,它不在沙盒中运行。这个图表,显示了每个进程中的攻击面以及它们之间的各种通信通道。
  
  Mojo IPC
 
  Chrome进程通过两种IPC机制相互通信:旧版IPC和Mojo。旧版IPC即将淘汰,支持Mojo,并且与该bug的讨论无关,因此我仅关注Mojo。
 
  引用Mojo文档,Mojo是运行时库的集合,这些运行时库提供了与平台无关的通用IPC原语抽象,消息IDL格式以及具有用于多种目标语言的代码生成功能的绑定库,以方便跨任意进程间和进程内边界传递方便的消息。
 
  漏洞代码的Mojo接口定义:
 
  复制
  // Represents a system application related to a particular web app.
   // See: https://www.w3.org/TR/appmanifest/#dfn-application-object
   struct RelatedApplication {
     string platform;
     // TODO(mgiuca): Change to url.mojom.Url (requires changing
     // WebRelatedApplication as well).
     string? url;
     string? id;
     string? version;
   };
    
   // Mojo service for the getInstalledRelatedApps implementation.
   // The browser process implements this service and receives calls from
   // renderers to resolve calls to navigator.getInstalledRelatedApps().
   interface InstalledAppProvider {
     // Filters |relatedApps|, keeping only those which are both installed on the
     // user's system, and related to the web origin of the requesting page.
     // Also appends the app version to the filtered apps.
     FilterInstalledApps(array related_apps, url.mojom.Url manifest_url)
         => (array installed_apps);
   };
  
  在Chrome构建过程中,此接口定义将转换为每种目标语言(例如C ++,Java甚至JavaScript)的接口和代理对象。这个特定的接口最初仅在使用Java Mojo绑定的Android上实现,但是最近对Windows的支持在C ++中实现。我的利用将使用JavaScript绑定(在受损的渲染器进程中运行)调用此C ++实现(在浏览器进程中运行)。
 
  此接口定义一种方法FilterInstalledApps。默认情况下,所有方法都是异步的(有一个[Sync]属性可以覆盖此默认值)。在生成的C ++接口中,这意味着该方法采用一个额外的参数,该参数是要使用结果调用的回调。在JavaScript中,该函数将返回一个Promise。
  
  · A Remote
 
  · A PendingReceiver
 
  · A SelfOwnedReceiver
 
  关于Mojo,还有很多其他可以说的,但是对于这篇文章来说,这是没有必要的。有关更多详细信息,建议你浏览docs。
 
  https://chromium.googlesource.com/chromium/src.git/+/master/mojo/README.md
  RenderFrameHost和Frame-Bound
 
  渲染器进程中的每个框架(例如主框架或iframe)都由浏览器进程中的RenderFrameHost来支持。请注意,一个渲染器进程可能包含多个帧,前提是它们都来自同一原点。浏览器提供的许多Mojo界面都是通过RenderFrameHost获取的。
 
  在RenderFrameHost初始化期间,BinderMap为每个暴露的Mojo接口填充一个回调:
 
  复制
  void PopulateFrameBinders(RenderFrameHostImpl* host,
                            service_manager::BinderMap* map) {
    ...
    map->Add(
        base::BindRepeating(&RenderFrameHostImpl::CreateInstalledAppProvider,
                            base::Unretained(host)));
    ...
  
  当渲染器框架请求接口时,BinderMap中的相应回调将被调用并传递PendingReceiver:
 
  复制
  void RenderFrameHostImpl::CreateInstalledAppProvider(
       mojo::PendingReceiver receiver) {
     InstalledAppProviderImpl::Create(this, std::move(receiver));
   }
  
  0x02 漏洞分析
 
  如上面描述的那样,SelfOwnedReceiver保持unique_ptr到InstalledAppProviderImpl,这意味着Impl将保持active,只要底层MessagePipe连接的停留。此外,InstalledAppProviderImpl包含指向RenderFrameHost的原始指针:
 
  复制
  InstalledAppProviderImpl::InstalledAppProviderImpl(
      RenderFrameHost* render_frame_host)
      : render_frame_host_(render_frame_host) {
    DCHECK(render_frame_host_);
  }
  1.
  2.
  3.
  4.
  5.
  FilterInstalledApps调用该方法时,将在此原始指针上进行虚函数调用:
 
  复制
  void InstalledAppProviderImpl::FilterInstalledApps(
      std::vector related_apps,
      const GURL& manifest_url,
      FilterInstalledAppsCallback callback) {
    if (render_frame_host_->GetProcess()->GetBrowserContext()->IsOffTheRecord()) {
      std::move(callback).Run(std::vector());
      return;
    }
   
    ...
  }
   因此,如果RenderFrameHost在释放之后调用此方法,则会发生UAF的情况。
 
  此提交在Chrome 81.0.4041.0中引入了此漏洞。几周后,此提交中的bug恰巧移到了命令行flag的后面。但是,此更改是在Chrome 82.0.4065.0中,因此该漏洞利用在Chrome Stable 81的所有桌面平台上都是可以实现的。
 
  0x03 漏洞利用
 
  触发漏洞
 
  尽管有可能从纯JavaScript触发该漏洞,但几乎可以肯定它不会被利用。相反,我将通过启用MojoJS绑定(--enable-blink-features=MojoJS在Chrome命令行上使用)来模拟一个受感染的渲染器进程。这些绑定将Mojo平台直接暴露给JavaScript,从而使我可以完全绕过Blink绑定。请注意,可以通过折衷的渲染器过程启用这些绑定,方法是翻转内存中的某个位,然后创建一个新的JavaScript上下文,因此,我的利用代码可以轻松地用于bug链中。
  

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读