Cloudflare的JA3与JA4指纹介绍及实用案例

1,057 阅读4分钟

JA3和JA4是用来识别网络中SSL/TLS客户端的“指纹”技术。它们通过分析客户端发起TLS连接时发送的“Client Hello”包中的信息,生成一个独特的标识,帮助安全人员识别和区分不同的客户端设备或程序。

什么是JA3指纹?

  • 定义:JA3通过提取TLS握手中Client Hello包里的关键字段(TLS版本、支持的加密套件、扩展、椭圆曲线等),将这些字段按顺序拼接成字符串,然后用MD5算法生成一个32位的哈希值,这个值就是JA3指纹。

  • 作用:它可以唯一标识一个客户端的TLS连接特征,帮助发现恶意软件或异常流量。

  • 示例

    • Client Hello字段示意:TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats
    • 拼接字符串示例:771,4865-4866-4867,0-11-10,23-24,0
    • MD5哈希后得到的JA3指纹:ab3e1f...

什么是JA4指纹?

  • 定义:JA4是JA3的升级版,除了TLS Client Hello包,还支持HTTP、SSH等协议的指纹识别。它通过对Client Hello中的扩展和加密套件进行排序,减少了因顺序不同导致的指纹差异,使指纹更稳定。

  • 特点

    • 指纹是人类可读的字符串,格式为a_b_c,每部分代表不同协议相关信息,方便分析和扩展。
    • 抗伪造能力更强,不容易被攻击者通过修改顺序绕过。
    • 支持更多协议,信息更丰富。
  • 示例

    • JA4指纹示例:TLS1.3_d_23-24-25_0-11-10
    • 可以只看某一部分,如JA4H_c专注HTTP Cookie字符串分析。

JA3和JA4的主要区别

特性JA3JA4
关注点仅TLS Client HelloTLS、HTTP、SSH等多协议
指纹格式MD5哈希(不可读)人类可读的模块化字符串
协议上下文单一TLS多协议支持
抗伪造能力较低,易被自定义TLS堆栈绕过较高,排序减少伪造可能
碰撞风险较高,不同客户端可能相同较低,更细粒度识别
可扩展性静态,不易适应变化模块化设计,易于扩展
应用范围被动检测,IOC匹配威胁狩猎、行为分析、异常检测

JA3/JA4的应用场景

  • 阻断恶意流量
    通过识别攻击者的JA3/JA4指纹,创建自定义规则阻断或挑战这些请求,防止攻击未被传统防御发现。
  • 允许合法流量
    识别合法移动应用的指纹,允许其流量通过,减少误报。
  • 行为分析和威胁狩猎
    利用JA4更丰富的指纹信息,分析异常行为和潜在威胁。
  • 日志和安全分析
    在日志、GraphQL API和安全事件中使用指纹数据,提升检测准确率。

JA3/JA4指纹的典型数据结构示例

{
  "ja4Signals": {
    "h2h3_ratio_1h": 0.988,          // HTTP/2和HTTP/3请求比例
    "heuristic_ratio_1h": 0.00007,  // 启发式检测比例
    "reqs_quantile_1h": 0.999,      // 请求数量分位数
    "uas_rank_1h": 901,             // 不同User Agent数量排名
    "browser_ratio_1h": 0.936,      // 浏览器请求比例
    "paths_rank_1h": 655,           // 唯一路径数量排名
    "reqs_rank_1h": 850,            // 请求数量排名
    "cache_ratio_1h": 0.189,        // 缓存命中率
    "ips_rank_1h": 662,             // 唯一IP数量排名
    "ips_quantile_1h": 0.999        // 唯一IP数量分位数
  },
  "jaSignalsParsed": {
    "ratios": {
      "h2h3_ratio_1h": 0.988,
      "heuristic_ratio_1h": 0.00007,
      "browser_ratio_1h": 0.936,
      "cache_ratio_1h": 0.189
    },
    "ranks": {
      "uas_rank_1h": 901,
      "paths_rank_1h": 655,
      "reqs_rank_1h": 850,
      "ips_rank_1h": 662
    },
    "quantiles": {
      "reqs_quantile_1h": 0.999,
      "ips_quantile_1h": 0.999
    }
  }
}

简单的Cloudflare Workers示例:获取JA4指纹信息

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  // 从请求上下文中获取JA4指纹和信号
  const ja4 = request.cf && request.cf.ja4Fingerprint || null;
  const ja4Signals = request.cf && request.cf.ja4Signals || {};

  // 处理缺失情况
  if (!ja4) {
    return new Response('没有检测到JA4指纹', { status: 200 });
  }

  // 返回指纹和部分信号信息
  return new Response(JSON.stringify({
    ja4Fingerprint: ja4,
    h2h3_ratio_1h: ja4Signals.h2h3_ratio_1h || '无数据',
    browser_ratio_1h: ja4Signals.browser_ratio_1h || '无数据'
  }, null, 2), {
    headers: { 'Content-Type': 'application/json' }
  });
}

总结

  • JA3和JA4都是TLS客户端指纹技术,用于识别访问服务的客户端。
  • JA4是JA3的升级版,支持更多协议,指纹更稳定且易读。
  • 它们在安全防护、流量分析、恶意行为检测中非常实用。
  • 通过合理使用JA3/JA4指纹,可以精准阻断攻击流量,减少误报,提高安全防御能力

以上内容帮助你快速理解JA3和JA4指纹的基础知识、区别及应用,并通过示例代码展示了如何在实际中获取和使用这些指纹,方便中国开发者和安全人员更好地掌握这一技术。