使用 Unity 漏洞突破 VRChat

主要观点

  • 漏洞在 VRChat [2024.3.1p4]、Unity [6000.0.20f1]、[2022.3.48f1]和[2021.3.44f1]中被修复,并非所有 Unity 游戏都受影响,利用该漏洞需要比其他游戏更多的用户控制。
  • VRChat 基于用户生成内容,其脚本语言 Udon 可使用 UdonSharp 或 Udon 节点图编写,结合两者使写脚本相对容易且能沙盒化不可信用户脚本。
  • Unity 的纹理类,如 Texture2D 和 Texture3D,有不同的尺寸限制,通过创建超大纹理发现 Unity 在计算纹理大小时存在 32 位整数溢出问题,导致可绕过大小检查并产生堆越界读写原始漏洞。
  • 利用该漏洞可从堆越界读写扩展到任意内存访问,通过覆盖另一个纹理对象的数据指针实现,还可借助 Unity 基于 tlsf 的自定义堆分配器和 Spray 技术找到可访问的对象。
  • VRChat 使用 IL2CPP,为避免写 ROP 链,利用 Steam 游戏覆盖的可读写可执行内存(GameOverlayRenderer64.dll 的 trampoline 区域)来执行 shellcode 完成攻击,该区域只要覆盖启用就存在且可读可写可执行。
  • 提及 VRChat 中 Texture2D 构造函数的一个参数可通过预期的 Unity 行为读取未初始化的堆内存,但最新版本已在启用 createUninitialized 时抛出异常。

关键信息

  • VRChat 相关版本及 Unity 版本信息。
  • Udon 的两种编写环境及特点。
  • Unity 纹理类的尺寸限制及相关代码示例。
  • 纹理计算大小函数中的 32 位整数溢出漏洞及影响。
  • 利用漏洞的具体步骤及相关代码。
  • Steam 游戏覆盖的可利用区域及相关代码。
  • Texture2D 构造函数的特殊参数及相关发现。

重要细节

  • 详细展示了各种纹理类的创建、填充及应用代码,如 Texture2D 的基本 XOR 图案填充和 Texture3D 的超大尺寸创建。
  • 阐述了利用漏洞找到目标对象、构造任意读写原语及设置 ROP 链的过程,包括搜索 sprayed 纹理、修改宽度等操作。
  • 说明 Steam 游戏覆盖区域的特点及如何利用其进行攻击,还提到更新后的情况。
  • 提及 Texture2D 构造函数参数导致的未初始化堆内存读取问题及后续修复。
阅读 9
0 条评论