nullpt.rs • 逆向工程 Vercel 的 BotID

这篇文章主要是关于反向工程 Vercel 的 BotID,包括其基本模式和深度分析模式。

基本模式

  • 可添加到现有 Next.js 项目中,通过yarn add botid安装,保护路由的代码示例如下:

    import { checkBotId } from 'botid/server';
    import { NextRequest, NextResponse } from 'next/server';
     
    export async function POST(request: NextRequest) {
    const verification = await checkBotId();
     
    if (verification.isBot) {
      return NextResponse.json({ error: 'Access denied' }, { status: 403 });
    }
     
    const data = await processUserRequest();
     
    return NextResponse.json({ data });
    }
  • 页面中创建简单表单调用该 API,根据返回结果判断是否为机器人。
  • 发现浏览器访问时会获取新脚本c.js,其中包含混淆的 JavaScript 代码。通过Babel可将字符串解码函数的调用表达式替换为清晰的函数名,以方便静态分析。
  • 脚本的字符串解码过程分为三步:定义编码字符串常量、打乱字符串常量、定义解码函数。此脚本使用了javascript-obfuscator进行混淆,可使用ben-sb的去混淆工具或自行编写去混淆工具。
  • 自行编写的去混淆工具通过@babel/traverse找到编码字符串常量、打乱函数和解码函数,将这些函数放入一个独立的脚本中运行,并通过vm模块在其自己的执行环境中执行。还添加了常量折叠和表达式求值的 passes 来清理和简化脚本。

浏览器信号有效负载

  • 通过多个函数检测浏览器中的各种信号,如检测windownavigator中的泄漏、检测User Agent中的“headless”、收集浏览器的 GPU 渲染器和供应商信息、检测 Chrome Devtools Protocol (CDP)等。
  • 这些检测的结果存储在一个对象中,并传递给加密函数,Next.js 会将加密结果作为x-is-human头传递给受保护的路由。

绕过检查的方法

  • 可以通过伪造收集信号之前的值来绕过基本模式的检查,如修改navigator属性、User AgentWebGL渲染器信息等。

深度分析模式

  • Vercel 推荐使用深度分析模式,该模式使用Kasada的反机器人技术收集更多信号,并与现有训练模型进行比较以检测类似机器人的请求。
  • 启用此模式需要Pro($20/mo)或Enterprise计划,并且每 1000 个请求额外收费$1。
  • 深度分析使用 Kasada 的反机器人脚本,类似于 Nike 网站上部署的脚本,需要反汇编嵌入式字节码才能了解发送到其服务器进行分析的内容。

结论

  • Vercel 的 BotID(基本模式)目前似乎未配置为实际阻止机器人,可能只是用于在更严格的检测启动之前收集信号。深度分析模式则使用 Kasada 的指纹脚本和分类器来主动阻止更高级的机器人。
  • 两种模式都依赖于指纹识别和客户端数据收集,反机器人技术越来越不透明、数据饥渴,并倾向于对“正常”用户进行狭隘的定义。这些脚本有其实际目的,但构建方式继续以难以忽视和挑战的方式塑造着网络。

脚注提供了相关链接,用于进一步了解文中提到的一些概念和技术。

阅读 13
0 条评论