Vamos falar sobre fingerprints | Fonte: Everett Collection/Shutterstock
Se você já analisou logs do AWS WAF, talvez tenha reparado nos campos ja3fingerprint e ( mais recentemente) ja4fingerprint. Se está se perguntando o que são, seja bem-vindo! E se nunca tinha visto antes, mas agora ficou curioso… seja bem-vindo também!
Neste artigo, vamos ver o que são esses fingerprints, como eles podem ser úteis em qualquer serviço de nuvem que você use e como detectá-los, analisá-los e trabalhar com eles na AWS, no Google Cloud e no Azure. Também vamos compartilhar alguns exemplos de queries para usar com logs do AWS WAF.
Afinal, o que são os fingerprints JA3 e JA4?
Os fingerprints JA3 e JA4 (que se pronunciam "djei-ei-três" e "djei-ei-quatro") são identificadores de cliente calculados por serviços como o AWS WAF e podem ser muito úteis para identificar tipos de tráfego, principalmente para mitigar ataques em potencial ou em andamento.
Um pouco de história
Pode parecer estranho, mas o JA3 e o JA4 não foram precedidos por JA1 e JA2. O nome "JA3" vem das iniciais dos três desenvolvedores "J.A." da ferramenta:
- John Althouse
- Josh Atkins
- Jeff Atkinson
(Fonte: uma excelente apresentação dos próprios John Althouse e Jeff Atkinson: Profiling And Detecting All Things SSL With JA3 )
O trabalho deles partiu dos esforços de análise de cipher suites TLS de Ivan Ristić e também de Lee Brotherston.
O JA3 foi inventado na Salesforce, e o JA4 é seu sucessor direto, criado pela FoxIO — uma empresa cofundada por John Althouse e por um quarto(!) J.A., Josh Alexander.
Os dois fingerprints são open-source, mas a FoxIO também licencia um conjunto maior chamado JA4+, com termos de licenciamento próprios. A AWS hoje não dá suporte a nenhum recurso JA4+, mas várias outras ferramentas de rede e segurança dão.
Uma explicação curta (e simplificada)
Em uma frase: os fingerprints JA3 e JA4 são uma forma de identificar clientes (qualquer coisa que acessa um serviço) com base nas informações do pacote Client Hello do handshake TLS inicial enviado a esses serviços, independentemente de endereço IP, portas, geolocalização ou outras variáveis comuns.

Fluxo simplificado do handshake TLS 1.2 | Fonte: Wikimedia Commons
Como os fingerprints JA3 e JA4 são calculados
Os fingerprints JA3 são calculados (conforme descrito no repositório oficial open-source) usando os seguintes campos do pacote Client Hello:
- Versão do TLS
- Cifras aceitas
- Lista de extensões
- Curvas elípticas
- Formatos de pontos das curvas elípticas
Esses campos são enumerados, organizados em uma única string, e essa string passa por um hash MD5 para gerar uma string mais curta.

Aqui vai uma captura no Wireshark de um handshake TLS 1.3 feita na minha máquina. Olha só, ela mostra o fingerprint JA3!
Os fingerprints de cliente JA4 usam os seguintes detalhes do Client Hello, como descrito no repositório do JA4:
- Protocolo (TCP ou QUIC)
- Versão do TLS
- O SNI está sendo usado? (sim="d" para domínio, não="i" para IP)
- Cipher suites (quantas e quais)
- Extensões (quantas e quais)
- Valor da extensão ALPN (Application-Layer Protocol Negotiation; alguns exemplos são códigos curtos para HTTP/2, HTTP/3, POP3, DNS-over-TLS, SPDY/3 e outros)
Um ótimo detalhamento visual de como cada parte de um fingerprint JA4 é calculada | Fonte: repositório JA4 da FoxIO; licença BSD-3-Clause.
Esses detalhes não passam por hash MD5; algumas partes da assinatura já vêm com hash e truncadas, então a assinatura final tem só 36 caracteres.
Uma demonstração rápida
O site https://ja4db.com mostra o seu fingerprint JA4 atual — vale a pena testar!
Por que vale a pena usar fingerprints JA3/JA4?
Caso de uso 1: Rate limiting
Tradicionalmente, as regras de rate limiting em WAFs ou em outras camadas de proteção se baseiam em endereço IP, caminho da URI ou outras partes das requisições do cliente.
Limitar a taxa de requisições com base no fingerprint específico do cliente traz os seguintes benefícios:
- Evita falsos positivos que podem ocorrer com limites baseados em IP ou em outros critérios comuns
- Limita atacantes que usam o mesmo fingerprint/ferramenta, independentemente do endereço IP
Tanto o Google Cloud Armor quanto o AWS WAF oferecem esse recurso.

A AWS permite usar fingerprints JA3 ou JA4 como chaves de agregação em uma regra de rate-limit
Caso de uso 2: Blocklisting
Se você já conhece um ou mais fingerprints maliciosos, basta adicioná-los a uma blocklist. O Google Cloud Armor e o AWS WAF também oferecem esse recurso.
Caso de uso 3: Threat hunting
Threat hunting é uma prática defensiva que busca detectar ameaças no seu ambiente de forma proativa. Por exemplo, se sai uma notícia sobre novos endereços IP de servidores C2 descobertos em campo, dá para verificar nos seus logs de rede se houve alguma comunicação com esses IPs.
Da mesma forma, se você consegue detectar fingerprints JA3/4 no seu ambiente de rede, pode varrer os logs em busca de fingerprints de clientes maliciosos recém-descobertos. Esses fingerprints são só mais uma ferramenta no seu arsenal.
Fingerprints vs. endereços IP
Como os fingerprints JA3 e JA4 rastreiam detalhes específicos sobre os clientes, há cenários em que eles são extremamente úteis para a defesa, em vez de tentar rastrear ou bloquear endereços IP:
- Um atacante com um script de ataque customizado provavelmente terá um fingerprint único, que depende das bibliotecas, do sistema operacional etc.
- O tráfego de malware em vários laptops corporativos comprometidos provavelmente terá o mesmo fingerprint, ou no mínimo um conjunto bem pequeno deles.
- Fingerprints de ferramentas maliciosas conhecidas podem ser compartilhados e bloqueados automaticamente antes mesmo que esse tipo de tráfego seja detectado na rede.
JA3 vs. JA4
O ideal é usar fingerprints JA4, mas os JA3 ainda são úteis quando você sabe o que está procurando. Veja algumas diferenças importantes:
- Os fingerprints JA4 são baseados em mais informações do que os JA3.
- O JA3 foi criado e patrocinado pela Salesforce, mas não é mais mantido ativamente.
- Como tudo no mundo da cibersegurança, as pesquisas e os métodos de evasão de detecção estão sempre evoluindo. O JA3 existe há mais tempo e tem mais formas conhecidas de driblar a detecção.
- Alguns clientes (entre eles Chrome e Firefox) já permitem embaralhar partes do pacote Client Hello. Isso muda o fingerprint JA3, mas o método JA4 usa ordenação para manter os fingerprints consistentes.
- Os dois tipos de fingerprint têm bancos de dados mantidos pela comunidade. O maior banco de dados público de JA3 que encontrei tem pouco mais de 128.000 entradas, pelas minhas contas. Também contei cerca de 105.000 entradas no banco de dados JA4+ no momento em que escrevo este artigo.
- O JA3 tem um legado mais longo, mas o suporte ao JA4 está ativo e crescendo. Enquanto eu escrevia este artigo, por exemplo, a AWS anunciou que o serviço Network Firewall agora oferece filtragem por JA4!
Outras considerações
Falsos positivos Aplicar regras agressivas de rate-limiting com base no valor do fingerprint pode gerar muitos falsos positivos, principalmente em cenários com muitos clientes parecidos. Usar dados adicionais do cliente, como a ordem dos cabeçalhos detalhada neste post da AWS, ajuda a reduzir bloqueios de usuários legítimos.
Os bancos de dados ainda estão crescendo Como os bancos de dados públicos de JA3 e JA4 são mantidos pela comunidade, depender só deles pode não ser ideal se você precisa de detecção de ameaças de ponta. Provedores de nuvem e serviços gerenciados de segurança costumam manter bases privadas de fingerprints maliciosos, então vale considerar regras gerenciadas como o grupo de regras Bot Control da AWS.
A astúcia do atacante varia Aqui na DoiT, já ajudamos clientes a analisar tanto ataques que pareciam bem simples — um único fingerprint em vários IPs, sugerindo o uso de uma ferramenta básica de DoS — quanto ataques que realmente não puderam ser amarrados a um fingerprint JA3/4 consistente. As capacidades, os recursos e a paciência de cada atacante variam.
E o Azure? O Azure também merece um espaço nessa conversa! As ferramentas do Azure ainda não suportam recursos personalizados de JA3 e JA4 da mesma forma direta que a AWS e o Google Cloud, mas algumas ferramentas de segurança incluem capacidades de fingerprinting:
- O Azure Firewall Intrusion Detection & Prevention System (IDPS) menciona que usa fingerprinting JA3 nas suas regras de assinatura. O Azure tem um ótimo post de blog sobre o assunto aqui.
- A ferramenta SIEM do Azure, o Sentinel, inclui detalhes de JA3 e JA3S (fingerprinting de servidor) nos dados de objetos de ameaça (usando STIX). Saiba mais na documentação aqui.
Como usar isso na AWS?
Logging e regras baseadas em fingerprints JA3 e JA4 têm bom suporte na AWS, e vou focar nos recursos da AWS na seção a seguir.
Logging de requisições
O primeiro passo é conseguir registrar os fingerprints JA3 e JA4! Os seguintes tipos de recursos da AWS suportam campos de fingerprint JA3 e JA4 nos seus logs:
- Logs do WAF (apenas em logs relacionados a recursos do CloudFront e do Application Load Balancer)
- Logs do Network Firewall (apenas em alguns casos — a AWS tem um exemplo aqui)

Exemplo de logs do AWS WAF mostrando os valores dos meus fingerprints JA3 e JA4. Não me bloqueia!
Bloqueio e rate-limiting com base em valores de fingerprint
Já comentei sobre esse recurso nas seções anteriores, mas aqui vai uma lista prática da documentação citada:
- Bloqueio no AWS WAF
- Rate-limiting no AWS WAF
- Bloqueio no Google Cloud Armor
- Rate-limiting no Google Cloud Armor
Análise de logs
Abaixo estão algumas queries do CloudWatch Log Insights que já usei para investigar fingerprints JA3 e JA4 em tráfego do WAF.
Contagem dos principais fingerprints JA3
fields ja3Fingerprint
| stats count(*) as requestCount by ja3Fingerprint
| sort requestCount desc

1.097? Será que é demais?
Contagem dos principais fingerprints JA4, separados por caminho da URL e user agent
parse @message /\{\"name\":\"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<useragent>[^"\}]*)/
| stats count(*) as requestCount by ja4Fingerprint, httpRequest.uri, useragent
| sort requestCount desc

Adicionar mais informações deixa muito mais claro o que está acontecendo!
Fingerprints de requisições bloqueadas por regras baseadas em taxa
Repare que isso checa qualquer regra baseada em taxa. É útil quando você tem regras rate-based por IP em vigor e quer ver se há algum fingerprint em comum.
fields @timestamp, httpRequest.clientIp as ClientIP, terminatingRuleId as rule, httpRequest.country as Country, ja4Fingerprint
| filter action = "BLOCK"
| filter terminatingRuleType = "RATE_BASED"
| stats count(*) as count by ja4Fingerprint, ClientIP, rule, Country | sort by count desc

Clientes diferentes podem ter o mesmo IP, mas fingerprints distintos
A AWS tem mais exemplos neste post do blog e neste artigo do re:Post. Você vai precisar adaptá-los para incluir fingerprints JA3/4, mas é um ótimo ponto de partida para descobrir o que pode ser útil no seu cenário.
Mais informações
Abaixo está uma lista das fontes e ferramentas mais úteis que encontrei sobre fingerprinting JA3 e JA4.
Fontes oficiais
- Repositório do JA3 no GitHub
- Repositório do JA4+ no GitHub
- TLS Fingerprinting with JA3 and JA3S (blog da Salesforce)
- JA4+ Network Fingerprinting (blog da FoxIO)
Ferramentas
- ja3.me — o maior banco de dados aberto de fingerprints JA3 que encontrei
- JA3.ZONE — outro banco de dados, não open-source
- O banco de dados de fingerprints JA4+
Posts de blog
- Post original de Ivan Ristić sobre TLS fingerprinting
- Trabalho original de Lee Brotherston sobre TLS fingerprinting, com links para apresentações em conferências
- Discussão da Cloudflare sobre fingerprints JA3 e JA4, com detalhes de como eles são analisados
- Unveiling Hidden Connections: JA4 Client Fingerprinting on VirusTotal
Apresentações
- Profiling And Detecting All Things SSL With JA3 (YouTube; John Althouse e Jeff Atkinson)
- JA4+ Intro (YouTube; John Althouse)
- BSides DC 2019 — Using JA3. Asking for a friend? (YouTube; Justin Warner e Ed Miles)
Os fingerprints JA3 e JA4 são uma adição extremamente valiosa às várias opções de detecção e análise que você já pode ter à disposição — seja você analista de segurança, engenheiro de nuvem, o profissional faz-tudo de um time pequeno tentando dar conta de um ataque DDoS, ou qualquer outro papel que esteja exercendo quando se deparar com isso na vida real.
Tem dúvidas sobre como proteger o seu ambiente de nuvem?
Fale com a DoiT hoje mesmo para conversar sobre como podemos ajudar a maximizar a eficiência, o custo-benefício e a segurança do seu ambiente de nuvem. Com a DoiT, você tem acesso a expertise em nuvem exclusivamente sênior para consultoria, capacitação e suporte, e estamos aqui sempre que precisar de orientação especializada, uma segunda opinião, apoio na adoção de novas tecnologias ou ajuda para apagar incêndios em produção.
Se quiser se aprofundar em outros temas de segurança e arquitetura de nuvem, confira os posts do nosso blog de engenharia de nuvem.