tomkabel/google-botguard-security-research

GitHub: tomkabel/google-botguard-security-research

这是一个绕过谷歌Botguard客户端反欺诈系统的案例研究,展示了通过自动化浏览器提取令牌来破解防御机制的方法。

Stars: 93 | Forks: 20

# Kits Kärneriks: 突破客户端欺诈防御的玻璃墙 ## 1. 目标 本仓库记录了针对谷歌登录基础设施的双重攻击。主要目标是 "Botguard",一种常被简单视为指纹识别脚本的防御机制。但事实并非如此。它是一个直接在客户端浏览器中运行的、充满敌意的、混淆的虚拟机。 2021年,我们证明了该系统可以被绕过。我们并非通过解开症结来实现,而是直接斩断。通过利用一个加固的无头浏览器,我们在合法域名上生成有效的安全令牌,并将其传递到中间人网络钓鱼环境中。本文档详细阐述了该客户端信任模型的架构缺陷,并深入分析了使 Botguard 成为如此强大对手的虚拟机内部机制的逆向工程分析。 ## 归属与致谢 本文档整合了三个独立的贡献: 1. **原始研究 (2021年):** 第 4 节描述的绕过策略——使用 go-rod 进行环境伪装和令牌提取的 "Puppet" 方法——代表了我们最初的原型验证,证明客户端令牌生成可以与其使用环境解耦。 2. **虚拟机内部分析:** 对 Botguard 虚拟机架构的技术深究(第 2、3 和 6 节)建立在 **Cypa** (@dsekz) 开创性的逆向工程工作基础之上。具体包括: - 操作码的识别与分类 - 反调试机制分析(计时防御) - 反日志记录机制文档 - 内存读取函数分析(寄存器 21,Z.W,Z.U) 此虚拟机分析最初发表于 Cypa 的 [botguard-reverse](https://github.com/dsekz/botguard-reverse) 仓库。我们承认此项工作是理解 Botguard 内部架构的基础。 3. **PO 令牌分析:** 第 7 节记录了 YouTube 网页播放器使用的现代来源证明令牌系统。此节内容源自 **LuanRT** 发表在 [BgUtils](https://github.com/LuanRT/BgUtils) 仓库中的逆向工程工作,依据 MIT 许可证使用。 ## 2. 防御:不是脚本,是 CPU *(基于 Cypa 的分析)* 要击败敌人,必须了解其生理特性。Botguard 并非静态检查列表,而是一个用 JavaScript 编写的、基于寄存器的自定义虚拟机。 当浏览器加载登录页面时,它不仅仅是运行代码,而是在启动一个处理器。这个虚拟机执行一个自定义的字节码二进制文件。这就是它的重装甲。它比标准的控制流平坦化更强大,因为你无法简单地美化代码来阅读它。你必须编写一个反汇编器、一个反编译器和一个自定义调试器,才能看到指令。 ### 虚拟机架构 该虚拟机模拟了一个现代 CPU。它使用寄存器来保存变量和操作状态。虽然较老的混淆器可能使用基于栈的逻辑(如 Java 或 WASM),但 Botguard 使用了一种基于寄存器的方法,模仿了你实际硬件中的 x86 架构。 初始化过程是剧烈的。它定位自身的字节码字符串,抓取一个子字符串(通常是前三个字符加一个下划线),并使用该动态密钥来定位初始化函数。这防止了静态分析工具轻易找到入口点。一旦虚拟机启动,它就开始执行操作码。 ### 操作码 我们通过痛苦的试错识别出了指令集。该虚拟机使用了标准逻辑和自定义操作的混合: * **`328 (USHR) / 381 (ADD)`:** 标准的位运算和算术运算。 * **`65 (SETPROP) / 467 (GETPROP)`:** 对象属性的操作,用于将防篡改机制绑定到 DOM。 * **`220 (IN)`:** 检查属性是否存在,很可能是在查找 `webdriver` 标志。 * **`289 (HALT)`:** 如果检测到异常,则终止执行。 最危险的方面是**自修改代码**。虚拟机在运行时引入新的操作码。它构建一个整数数组(寄存器 274),并将其映射到字符串定义,使用 `LOADSTRING` 操作码动态生成新指令。然后,一个 `EVAL` 操作码(映射为 `LOADOP`)将这些指令编译为可执行逻辑。你在开头看到的代码并非最终运行的代码。 ## 3. 防篡改机制 *(基于 Cypa 的分析)* Botguard 会积极地对抗分析。它假设自己正被监视。 ### 计时防御 (反调试) 脚本对时间极其敏感。它不断地轮询 `performance.now()` 结合 `Date.now()`。如果你在开发者工具中设置断点,执行会暂停,但时钟仍在走动。当你恢复执行时,时间戳之间的差值会非常大。 虚拟机利用这个差值来改变一个**种子**(存储在虚拟机上下文 `K.U` 中)。这个种子决定了下一个字节码块的解密密钥。如果时间差表明有调试器活动,种子就会损坏。程序不会立即崩溃,而是默默地转向一个无意义的执行路径,生成一个服务器会拒绝的无效令牌。你以为你在调试它,其实你只是在已死的时间线上捕风捉影。 ### 反日志记录 你无法打印变量。脚本会积极地绑定控制台方法。它创建一个陷阱函数,使用 `create`(或类似)方法覆盖属性。如果你尝试注入 `console.log` 或使用条件日志点,陷阱就会触发。 这个陷阱修改了与内存读取函数链接的 `t.prototype` 栈。通过记录一个变量,你不经意间移动了内存指针。虚拟机读取了错误的字节,指令流损坏,会话随即终止。 ## 4. 绕过:环境伪装 *(原始研究)* 鉴于虚拟机的复杂性——自修改操作码、滚动加密密钥和基于时间的种子突变——纯粹的逆向工程是一场高成本的消耗战。最有效的攻击向量不是撬开锁,而是偷走钥匙。 ### "Puppet" 策略 服务器端验证检查的是令牌的完整性,而非其来源。令牌证明的是*某个*浏览器通过了检查,它并不证明*哪个*用户持有该令牌。 我们部署了 **go-rod**,一个基于 Golang 的浏览器自动化框架,来充当令牌工厂。 1. **隐蔽层:** 标准的无头 Chrome 会泄露其身份(例如 `navigator.webdriver = true`)。我们通过使用隐身库来修补这一点,以掩盖用户代理、覆盖原型方法并伪装 WebGL 渲染上下文。 2. **令牌提取:** 自动化浏览器导航到 `accounts.google.com`。它输入一个目标邮箱。Botguard 运行,验证环境,并铸造 `bgRequest` 令牌。 3. **拦截:** 我们在客户端生成后立即钩住请求。我们中止到谷歌的网络请求(防止令牌被"消耗")并提取字符串。 4. **注入:** 这个新鲜的、有效的令牌被传递到我们的 MITM 代理。代理将其附加到受害者的请求中。谷歌服务器看到一个来自"干净"浏览器的有效令牌,并授权网络钓鱼会话。 这种方法完全绕过了虚拟机。我们不关心操作码或寄存器,因为我们给虚拟机的正是它想要的:一个顺从的浏览器环境。 ## 5. 现实检验 * **客户端检查易受环境伪装攻击:** 尽管功能强大,但客户端防御本质上运行在攻击者控制的机器上。只要付出足够的努力,就可以模仿环境以满足检查。使用隐身插件就是一个明显的例子。 * **令牌可移植性是根本弱点:** 像 Botguard 这样的基于令牌的系统的安全性,依赖于令牌不可转让。本研究表明,如果令牌生成可以外包到一个"干净"的环境中,那么该令牌就可以在"肮脏"的环境中使用,从而使检查失效。此漏洞也延伸至 YouTube 的 PO 令牌系统,尽管多层令牌架构和内容绑定提供了一些额外的阻碍。 * **分层防御的重要性:** 此绕过之所以有效,是因为它规避了一个单一的、尽管强大的防御层。更先进的防御系统应该将令牌的指纹与服务器端信号(例如 IP 地址信誉、历史会话数据、行为分析)相关联,以检测异常。PO 令牌的 `sps` 机制代表了朝这个方向迈出的一步——服务器端执行,不单纯依赖令牌有效性。 业界创造了这些精心设计的猫鼠游戏,不断添加混淆层和行为分析层。然而,只要逻辑依赖于一个可以从干净环境移植到肮脏环境的令牌,防御就可能被绕过。这关乎的不是破解加密,而是滥用架构。
botguard_white botguard_dark
## 6. 技术发现:内存读取器 *(基于 Cypa 的分析)* 对于那些坚持纯粹逆向工程路径的人来说,野兽的心脏是内存读取函数,通常被混淆为 `H`。 它从字节码数组中读取字节,但在返回前会进行加密。 * **寄存器 21:** 充当一个滚动密钥数组。 * **`Z.W`:** 一个线性递增的位置跟踪器。 * **`Z.U`:** 种子,它会根据时间和执行历史发生突变。 函数 `H(true, L, 8)` 读取 8 位。如果第一个参数为 true,它会调用一个使用寄存器 21 的加密例程。存在一个专门的 `SETPROP` 操作码来扰乱这些密钥,重置位置并从读取器中获取新的种子。这种循环依赖(读取器依赖种子,种子依赖读取器)使得在不进行完美仿真的情况下,静态分析几乎不可能。 ## 7. PO 令牌生成与认证 *(基于 BgUtils 研究)* 本节记录了 YouTube 网页播放器使用的现代来源证明令牌系统。前面的章节侧重于登录/ReCaptcha 上下文中的 BotGuard,而 YouTube 通过 PO 令牌和认证挑战增加了额外的保护层。以下分析源自 **LuanRT** 发表在 [BgUtils](https://github.com/LuanRT/BgUtils) 仓库中的逆向工程工作。 ### 挑战初始化 在生成 PO 令牌之前,客户端必须获取一个 BotGuard 挑战。该挑战由一个虚拟机脚本及其关联的字节码程序组成。获取此数据有三种方法: 1. **直接来自页面源代码**:当页面加载时,InnerTube 挑战响应嵌入在初始页面的 HTML 源代码中。 2. **InnerTube API**:一个以可读格式返回挑战数据的 API 端点。这通常是最简单的方法: 3. **网络防滥用私有 API**:一个内部 Google API (`jnn-pa.googleapis.com`),也被 Google Drive 使用。根据 `requestKey`,响应可能被混淆: 检索到虚拟机脚本后,执行该脚本以使 BotGuard 实例在全局作用域中可用。 ### 完整性令牌检索 完整性令牌是第一个关键输出。它从 Google 的认证服务器获取,并直接依赖于 BotGuard 响应来评估运行时环境的完整性。 首先,必须将字节码程序加载到 BotGuard 虚拟机中: 然后调用 `asyncSnapshotFunction` 以获取 BotGuard 响应: 接着,将此响应交换为来自 `GenerateIT` 端点的完整性令牌: ### 铸造 WebPO 令牌 在快照调用期间填充的 `webPoSignalOutput` 数组包含用于创建 PO 令牌的函数。第一个函数充当铸币器: ### 令牌类型 YouTube 播放器使用三种不同的 PO 令牌类型: - **冷启动令牌**:在完整的会话绑定令牌铸造之前用于启动播放的占位符令牌。它使用简单的异或密码,并绑定到数据同步 ID 或访客 ID。 - **会话绑定令牌**:当用户首次与播放器交互时生成。如果用户已登录,则绑定到帐户的数据同步 ID;否则,使用访客 ID。 - **内容绑定令牌**:为每个 `/player` 请求生成(`serviceIntegrityDimensions.poToken`)。它绑定到特定的视频 ID,不应被缓存。 ### 流保护状态 (sps) 播放器在每个媒体段响应中检查一个名为 `sps` 的值(仅在使用 UMP 或 SABR 流协议时),以确定是否需要 PO 令牌: - **状态 1**:流具有有效的 PO 令牌,用户拥有 YouTube Premium,或流不需要令牌。 - **状态 2**:需要 PO 令牌;客户端在播放中断之前最多可以请求 1-2 MB 的数据。 - **状态 3**:PO 令牌强制要求;没有有效令牌则无法请求更多数据。 ### Puppet 绕过的适用性 第 4 节中描述的环境伪装方法理论上适用于 YouTube 的 PO 令牌系统。核心漏洞——令牌可移植性——依然存在。一个合规的浏览器环境可以生成有效的 PO 令牌,然后将其转移到不同的环境中。然而,YouTube 的架构引入了额外的复杂性: - **多层令牌系统**:与登录流中的单一 `bgRequest` 令牌不同,YouTube 需要三种不同的令牌类型(冷启动、会话绑定、内容绑定),每种具有不同的绑定语义。 - **流保护状态强制执行**:`sps` 机制提供服务器端强制执行,如果未提供有效令牌,可以中断播放,从而限制了令牌重用的时间窗口。 - **内容绑定**:内容绑定令牌与特定视频 ID 挂钩,使得它们不如会话绑定令牌便携。 这些因素使得 Puppet 方法对 YouTube 的执行更加复杂,但并未从根本上改变客户端令牌生成固有的架构漏洞。 ## 参考文献 1. **Cypa** — BotGuard 虚拟机逆向工程 - 仓库:[https://github.com/dsekz/botguard-reverse](https://github.com/dsekz/botguard-reverse) - 关于 Botguard 虚拟机架构、操作码和反调试机制的基础性逆向工程分析。 2. **LuanRT** — BgUtils (PO 令牌生成) - 仓库:[https://github.com/LuanRT/BgUtils](https://github.com/LuanRT/BgUtils) - YouTube 的 PO 令牌生成和认证过程的逆向工程实现。 - 内容依据 MIT 许可证使用。 ## 8. 联系方式 如有与本研究相关的问题、讨论或合作意向,请通过仓库的问题跟踪器或作者链接的个人资料联系。 *本文档仅用于教育和研究目的。*
标签:DNS 反向解析, Google Botguard, JavaScript安全, Web安全, 中间人攻击, 云资产清单, 代码逆向, 反欺诈, 安全令牌, 安全机制绕过, 安全测试, 安全漏洞, 客户端安全, 技术分析, 攻击性安全, 攻击方法, 数据可视化, 无头浏览器, 案例研究, 浏览器脚本, 绕过技术, 网络安全, 自动化攻击, 蓝队分析, 虚拟机分析, 逆向分析, 逆向工程, 隐私保护