在当今的数字世界中,网络安全已成为个人、组织乃至国家面临的重要问题。在各种威胁中,“机器人流量”或机器人网络流量已成为一个重大问题。
机器人流量主要由自动脚本或程序生成,广泛应用于各种恶意活动,例如 DDoS 攻击、垃圾邮件发送、网络钓鱼和欺诈性广告点击等恶意行为不仅威胁个人用户的隐私和财务安全,而且对企业、组织甚至国家网络基础设施的网络安全构成重大风险。因此,对机器人流量的研究和防御已成为网络安全领域的重要课题。本指南旨在解释如何使用 TLS 指纹识别技术来检测和识别机器人流量,从而为网络安全提供更有效的保护。
TLS 指纹识别简介
TLS 即传输层安全性协议,是网络通信中常用的一种协议,用于保证数据的安全传输。TLS 在数据发送和接收过程中采用加密技术,防止数据被拦截或篡改,从而保护信息的完整性和机密性。
TLS 用于加密互联网上绝大多数流量,从网页浏览、注册登录、支付交易、流媒体,到日益流行的物联网 (IoT)。它的安全性也受到恶意攻击者的青睐,他们使用 TLS 来隐藏恶意软件的通信流量。
在 TLS 连接开始时,客户端会发送 TLS 客户端 Hello 数据包。此数据包由客户端应用程序生成,用于通知服务器支持的密码和首选通信方法,并以明文形式传输。TLS 客户端 Hello 数据包对于每个应用程序或其底层 TLS 库都是唯一的,从此数据包计算出的哈希值称为 TLS 指纹。
图 1:TLS 握手过程
目前 TLS 指纹识别的主要应用是 Salesforce 开源的 JA3 和 JA4,其中 JA4 是 JA3 的升级版,检测维度和场景更加丰富。因此本文主要关注基于 JA4 的 TLS 指纹识别在 Bot 防御中的应用和实践。
1.JA3 和 JA3S
JA3 方法从客户端的 Client Hello 数据包中的以下字段收集字节的十进制值:TLS 版本、密码套件、扩展列表、椭圆曲线和椭圆曲线格式。然后按照这些值的出现顺序将它们连接起来,用逗号分隔每个字段,用连字符分隔字段内的每个值。
例子:
771,4865-4866-4867-49195-49196-52393-49199-49200-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-51-45-43-21,29-23-24,0
JA3 指纹是通过将 32 位 MD5 哈希应用于连接字符串来获得的:
JA3:f79b6bad2ad0641e1921aef10262856b
在计算 JA3 指纹时,需要忽略 TLS 扩展中包含的 GREASE 字段的值。Google 使用的这种机制可防止 TLS 生态系统中的扩展性故障。
图 2:客户端 Hello 消息
生成 JA3 指纹后,我们使用类似的方法在服务器端(即 TLS Server Hello 消息)识别指纹。JA3S 方法从 Server Hello 数据包中的以下字段收集字节的十进制值:TLS 版本、密码套件和扩展列表。然后按出现的顺序连接这些值,每个字段用逗号分隔,字段内的每个值用连字符分隔。
例子:
771,49200,65281-0-11-35-16-23
JA3S 指纹是通过将 32 位 MD5 哈希应用于连接字符串来获得的:
JA3S: d154fcfa5bb4f0748e1dd1992c681104
图 3:服务器 Hello 消息
2.JA4+
JA4+ 提供易于使用且可共享的模块化网络指纹识别系统,取代了 2017 年推出的 JA3 TLS 指纹识别标准。JA4 检测方法增强了可读性,有助于更有效地搜寻和分析威胁。所有 JA4+ 指纹都格式化为 a_b_c,其中指纹的不同部分是分开的。这样就可以仅使用 ab、ac 或 c 进行搜索和检测。例如,如果您只想分析来自传入应用程序的 cookie,则可以查看 JA4H_c。这种新的保留局部性的格式有助于进行更深入、更丰富的分析,同时保持简单、易于使用和可扩展。
JA4+指纹包括以下尺寸:
- JA4 — TLS 客户端
- JA4S — TLS 服务器响应
- JA4H — HTTP 客户端
- JA4L — 灯光距离/位置
- JA4X — X509 TLS 证书
- JA4SSH — SSH 流量
本文主要介绍JA4的应用,其他维度的详细信息可以参考JA4开源仓库: https://github.com/FoxIO-LLC/ja4.
图4:JA4原理图
JA4由JA4_a、JA4_b、JA4_c组成:
JA4_r = JA4_a(t13d1516h2)_JA4_b(排序后的密码套件)_JA4_c(排序后的扩展_原始加密算法)
JA4_a:t13d1516h2,包括客户端的 TLS 版本、SNI、密码套件数量、扩展数量和 ALPN。ALPN 表示应用程序在 TLS 协商完成后想要与之通信的协议;“00”表示缺少 ALPN。请注意,ALPN“h2”的存在并不一定表示浏览器,因为许多物联网设备通过 HTTP/2 进行通信。但是,ALPN 的缺失可能表明客户端不是 Web 浏览器。无论流量是通过 TCP 还是 快消QUIC是新HTTP/3标准使用的协议,它将TLS1.3封装在UDP数据包中。
JA4_b:对排序后的密码套件进行SHA256运算,取前12个字符。例如:
002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9 = 8daaf6152771
JA4_c:对排序后的扩展名和原始加密算法进行SHA256运算,取前12个字符。例如:
0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01_0403,0804,0401,0503,0805,0501,0806,0601 = e5627efa2ab1
JA4 指纹识别在 Bot 缓解中的应用
检测原理
不同的客户端(浏览器、计算机软件、程序)支持的协议版本、密码套件、扩展和加密算法都不同。在 TLS 握手过程中,Client Hello 以明文形式传输,使我们能够计算 JA4 指纹来识别客户端的真实属性。
- Firefox(JA4 客户端 Hello)≠ Chrome(JA4 客户端 Hello)
- Chrome 120(JA4 客户端 Hello)≠ Chrome 80(JA4 客户端 Hello)
- Chrome iOS(JA4 客户端 Hello)≠ Chrome Android(JA4 客户端 Hello)
- Heritrix(JA4 客户端 Hello)≠ Chrome(JA4 客户端 Hello)
当客户端没有被恶意篡改时,JA4指纹保持稳定。
申请方式
在 机器人缓解 场景下,应用JA4指纹进行客户端身份识别需要结合其他信息:客户端IP信息、客户端操作系统信息、客户端设备名称、版本号等。JA4指纹在这些场景下主要有两种应用方式:指纹唯一性检测和指纹一致性检测。
- 唯一性检测:
有些客户端程序被设计成具有唯一的JA4指纹,并且这些客户端的指纹很少发生变化,通过唯一性检测可以有效识别此类异常客户端。
应用 | JA4+ 指纹 |
铬合金 | JA4=t13d1517h2_8daaf6152771_b1ff8ab2d16f (初始) |
JA4=t13d1517h2_8daaf6152771_b0da82dd1658(重新连接) | |
火狐浏览器 | JA4=t13d1715h2_5b57614c22b0_7121afd63204(初始) |
JA4=t13d1715h2_5b57614c22b0_7121afd63204(重新连接) | |
苹果浏览器 | JA4=t13d2014h2_a09f3c656075_14788d8d241b |
银蚁 | JA4=t13d491100_bd868743f55c_fa269c3d986d |
未检测到的 chrome 驱动程序 | JA4=t13d1516h2_8daaf6152771_02713d6af862 |
IcedID 恶意软件 | JA4=t13d201100_2b729b4bf6f3_9e7b989ebec8 |
sqlmap | JA4=t13i311000_e8f1e7e78f70_d41ae481755e |
扫描器 | JA4=t12i3006h2_a0f71150605f_1da50ec048a3 |
表 1:常见客户端 JA4 指纹
- 一致性检测:
指纹一致性检测的原理是将客户端声明的设备信息(操作系统、浏览器类型、版本号)与其JA4指纹进行比对,看是否与指纹对应的实际设备信息相匹配。
客户端声明的设备信息 | 客户端 JA4 指纹 | 一致性 |
“浏览器”:“Chrome”, “浏览器版本”:“89.8.7866”, “操作系统”:“Windows”, “操作系统版本”:“7”, |
t12d290400_11b08e233c4b_017f05e53f6d | 异常 |
“浏览器”:“Chrome”, “浏览器版本”:“93.0.4622”, “操作系统”:“Windows”, “操作系统版本”:“10” |
t13d431000_c7886603b240_5ac7197df9d2 | 异常 |
“浏览器”:“Python 请求”, “浏览器版本”:“2.31” |
t13d1516h2_8daaf6152771_02713d6af862 | 异常 |
“浏览器”:“Chrome”, “浏览器版本”:“93.0.4577”, “操作系统”:“Windows”, “操作系统版本”:“10”, |
t13d1516h2_8daaf6152771_e5627efa2ab1 | 普通的 |
“浏览器”:“Firefox”, “浏览器版本”:“116.0”, “操作系统”:“Ubuntu”, |
t13d321200_1b30506679d3_58ed7828516f | 异常 |
“浏览器”:“边缘”, “浏览器版本”:“14.14393”, “操作系统”:“Windows”, “操作系统版本”:“10” |
t12d040400_a6a9ac001284_255c81f47ac1 | 异常 |
“浏览器”:“Safari”, “浏览器版本”:“15.6”, “操作系统”:“Mac OS X”, “操作系统版本”:“10.15.7” |
t13d2014h2_a09f3c656075_f62623592221 | 普通的 |
表 2:JA4 一致性检测
- JA4指纹数据库
在机器人防御场景中,无论是通过JA4唯一性还是一致性特性,底层逻辑都依赖于庞大的JA4指纹库进行数据支撑,与JA3指纹类似。因此,构建完善的指纹库是决定JA4能否成功识别机器人流量的关键因素之一。
由于官方的JA4+指纹库、相关应用及推荐检测逻辑还在建设中,目前尚无可用的指纹库,因此CDNetworks安全实验室针对特定的Bot缓解场景,收集了常见的客户端指纹,并实现了相应的检测算法。
结论
此次分析表明,TLS 指纹识别是一种非常有效的工具。通过深入分析 TLS 客户端的 Client Hello 数据包中的不同字段,我们可以生成独特的 JA4 指纹,并使用这些指纹来识别特定的恶意机器人流量。
TLS 指纹虽然可以有效检测机器人流量,但也存在一定的局限性。随着攻击者不断升级和改变策略,TLS 指纹会不断被篡改或伪造。因此,我们需要不断更新和改进检测机制,才能在持续的攻防战中保持优势。
在机器人缓解场景中,TLS 指纹识别提供了强大的识别机制,但它不能取代其他安全措施。它应该被视为全面机器人安全策略的一部分,与威胁情报、浏览器指纹识别和其他措施结合使用,以提供全面的保护。