Um fingerprint JA3 é um hash MD5 derivado de campos específicos de uma mensagem TLS Client Hello, usado para identificar de forma única a aplicação ou biblioteca cliente que inicia uma conexão TLS, servindo assim como um método robusto de fingerprinting de clientes TLS e de detecção de proxy.
Entendendo o fingerprinting de clientes TLS
Quando um cliente inicia um handshake TLS, ele envia uma mensagem Client Hello contendo diversos parâmetros necessários para estabelecer uma conexão segura. Esses parâmetros incluem a versão do TLS, a lista de cipher suites suportadas, as extensões, as curvas elípticas e os formatos de curvas elípticas. A combinação específica e a ordem desses parâmetros costumam ser únicas para cada aplicação cliente, sistema operacional e biblioteca TLS. Essa assinatura distinta permite identificar o cliente mesmo que outras informações identificadoras (como a string de user-agent) sejam alteradas ou omitidas.
O que é um fingerprint JA3?
Desenvolvido pela Salesforce, o JA3 é um método para criar um fingerprint padronizado da mensagem Client Hello. Ele se concentra em cinco campos-chave do Client Hello:
- Versão do TLS: a versão mais alta de TLS suportada pelo cliente.
- Cipher Suites: uma lista separada por vírgulas das cipher suites suportadas pelo cliente, ordenadas por preferência.
- Extensões TLS: uma lista separada por vírgulas das extensões TLS incluídas pelo cliente, ordenadas por tipo.
- Curvas elípticas: uma lista separada por vírgulas das curvas elípticas suportadas.
- Formatos de curvas elípticas: uma lista separada por vírgulas dos formatos de curvas elípticas suportados.
Esses cinco valores são concatenados em uma única string, usando "," como separador dentro das listas e "-" como separador entre os cinco campos principais. Essa string concatenada é então submetida ao hash MD5 para produzir o fingerprint JA3 final, de 32 caracteres. O uso do MD5 tem como objetivo a brevidade e a consistência, não a segurança criptográfica.
Exemplo de cálculo do JA3
Considere um Client Hello hipotético com os seguintes parâmetros:
- Versão do TLS:
0x0303(TLS 1.2) - Ciphers:
0xc02c,0xc02b,0xc030,0xc02f,0x009c,0x0095 - Extensões:
0x0000,0x000b,0x000a,0x0012,0x0023,0x0017,0x0010,0x0035,0xff01,0x000d,0x0005 - Curvas elípticas:
0x001d,0x0023,0x0024 - Formatos de curvas elípticas:
0x0000,0x0001,0x0002
A string concatenada seria:
769,49164-49163-49168-49167-156-149,0-11-10-18-35-23-16-53-65281-13-5,29-35-36,0-1-2
O hash MD5 dessa string seria o fingerprint JA3, por exemplo e66a3d11b302c086d0b604e769494441.
JA3 na detecção de proxy
Proxies, em especial os forward proxies e aqueles que fazem interceptação de TLS, frequentemente modificam ou encerram e reiniciam conexões TLS. Esse processo altera inerentemente a mensagem Client Hello, resultando em um fingerprint JA3 diferente do fingerprint do cliente original.
Como os proxies influenciam os fingerprints JA3
-
Forward proxies (HTTPS): quando um cliente se conecta a um proxy HTTPS, o proxy estabelece uma nova conexão TLS com o servidor de destino. A mensagem
Client Helloobservada pelo servidor de destino vem do software do proxy, não do cliente final. Como consequência, o fingerprint JA3 reflete a stack TLS do proxy (por exemplo, Squid, Nginx, HAProxy ou software de proxy customizado) e não o navegador ou a aplicação realmente usados pelo usuário final. Essa discrepância é um forte indicador do uso de proxy. -
Proxies de interceptação TLS (MITM): esses proxies encerram explicitamente a conexão TLS vinda do cliente e estabelecem uma nova conexão TLS, separada, com o destino. Isso é comum em ambientes corporativos para inspeção, ou por parte de agentes maliciosos. O
Client Helloenviado ao servidor de destino é gerado pelo proxy de interceptação, produzindo um fingerprint JA3 característico do software de interceptação. -
Proxies SOCKS: proxies SOCKS podem operar em um nível mais baixo, tunelando conexões TCP brutas. Se um proxy SOCKS simplesmente encaminha o fluxo TCP sem modificar o handshake TLS, o
Client Hellooriginal do cliente pode passar intocado e o fingerprint JA3 permanece o mesmo. Ainda assim, muitas implementações SOCKS ou configurações específicas podem encerrar e reiniciar o TLS ou alterar informações de cabeçalho, levando a um JA3 diferente.
Identificando proxies com JA3
Ao analisar as mensagens Client Hello recebidas, um servidor pode:
- Detectar discrepâncias: comparar o fingerprint JA3 com outros indicadores do cliente, como o cabeçalho
User-Agent. UmUser-Agentque afirma ser o Chrome no Windows, mas apresenta um fingerprint JA3 sabidamente pertencente a um servidor proxy ou a uma biblioteca de scraping específica, indica uso de proxy ou spoofing. - Categorizar o tráfego: identificar tráfego originado de serviços de proxy conhecidos, data centers ou botnets que usam stacks TLS consistentes.
- Bloquear/limitar: aplicar políticas para bloquear ou limitar conexões de fingerprints JA3 específicos associados a tráfego indesejado (por exemplo, scrapers, bots ou sistemas comprometidos).
JA3 vs. JA3S
Enquanto o JA3 gera o fingerprint do Client Hello do cliente, o JA3S (JA3 Server) gera o fingerprint da mensagem Server Hello do servidor. O JA3S se concentra na versão do TLS, na cipher suite e nas extensões do Server Hello. Embora seja útil para identificar implementações TLS do lado do servidor, é menos aplicável de forma direta à detecção de proxy no cliente.
Limitações e técnicas de evasão
Apesar de poderoso, o fingerprinting JA3 não é infalível:
- Spoofing: clientes sofisticados, bots ou serviços de proxy podem ser configurados para imitar intencionalmente fingerprints JA3 específicos, falsificando na prática um navegador legítimo. Isso exige controle sobre os parâmetros do
Client Hellona biblioteca TLS. - Atualizações de bibliotecas TLS: atualizações de bibliotecas TLS (por exemplo, OpenSSL, NSS, BoringSSL) ou de sistemas operacionais podem alterar os parâmetros do
Client Hello, mudando o fingerprint JA3 de um cliente que, no restante, é idêntico. Isso exige monitoramento e atualização contínuos das bases de assinaturas JA3. - Diversidade de bibliotecas: diferentes bibliotecas cliente HTTP (por exemplo,
requestsdo Python,net/httpdo Go,httpsdo Node.js) e suas implementações TLS subjacentes (por exemplo, OpenSSL, GnuTLS, BoringSSL,crypto/tlsdo Go) produzem naturalmente fingerprints JA3 distintos.
O JA3 é uma ferramenta poderosa para identificar e detectar diversos tipos de tráfego de clientes, em especial no contexto de serviços de proxy e de detecção de bots. Saber interpretar e mitigar fingerprints JA3 é essencial tanto para provedores de proxy quanto para quem os utiliza.
