Se você já tentou automatizar requisições contra um site protegido por Kasada e recebeu um HTTP 429 com cabeçalhos x-kpsdk-ct, sabe que trocar User-Agent não resolve. Kasada Anti-Bot explicado em termos práticos é um sistema multicamada que combina fingerprinting de TLS (JA3/JA4), reputação de IP e uma máquina virtual de bytecode customizada de ~449KB chamada ips.js. Para engenheiros de scraping que realizam coleta de dados autorizada e pesquisadores de segurança, entender cada camada — e como passar por elas de forma legítima — é essencial.
Neste artigo, vamos dissecar a arquitetura do Kasada em 2026, explicar como a VM ips.js kasada coleta fingerprints de navegador e dispositivo, detalhar os cabeçalhos x-kpsdk-ct e o fluxo do cookie KP_UIDz, e mostrar como parear proxies residenciais da ProxyHat com um runtime de navegador real para que o challenge execute nativamente e minta um token válido.
Kasada Anti-Bot Explicado: Arquitetura e Camadas de Detecção
O Kasada opera em três camadas sequenciais, cada uma filtrando tráfego antes de chegar à aplicação protegida. Entender essa sequência é fundamental: um erro na camada 1 pode impedir que o challenge JS seja sequer servido.
Camada 1: Fingerprinting de TLS e HTTP/2
Antes de enviar qualquer JavaScript, o Kasada inspeciona a handshake TLS do cliente. O servidor computa o hash JA3 — uma fingerprint derivada da ordem e seleção de cipher suites, extensões TLS e curvas elípticas apresentadas no ClientHello. Em 2026, muitos sites também adotaram o JA4, uma variação que normaliza a fingerprint em grupos ordenados, tornando-a mais estável e resistente a reordenações deliberadas de cipher suites.
Cada runtime HTTP tem uma assinatura JA3/JA4 distinta. Um requests em Python usando urllib3 produz um ClientHello completamente diferente do Chrome 131 ou do Firefox 134. Por exemplo, o Chrome envia extensões como signature_algorithms em uma ordem específica e inclui application_layer_protocol_negotiation com h2,http/1.1, enquanto urllib3 omite ALPN por padrão. O Kasada mantém uma base de fingerprints conhecidas e bloqueia aquelas associadas a bibliotecas de automação.
Além do TLS, o Kasada inspeciona o fingerprint HTTP/2 — a ordem dos pseudo-headers (:method, :path, :scheme, :authority), os valores do frame SETTINGS inicial, o WINDOW_UPDATE e o padrão de priorização (PRIORITY ou PRIORITY_UPDATE). Bibliotecas como hyper ou httpx com backend HTTP/2 produzem SETTINGS frames com valores de HEADER_TABLE_SIZE e INITIAL_WINDOW_SIZE que diferem do Chrome nativo, que usa HEADER_TABLE_SIZE=65536 e INITIAL_WINDOW_SIZE=1048576. Referência: a especificação do HTTP/2 está definida na RFC 7540 e detalhes sobre TLS na documentação da MDN sobre TLS.
Camada 2: Reputação de IP e Bloqueio de ASNs
Paralelamente ao TLS, o Kasada consulta a reputação do IP de origem. Aqui está o ponto crítico: o Kasada pré-bloqueia ASNs de datacenter (AWS, Google Cloud, Azure, DigitalOcean, OVH) com uma pontuação de confiança extremamente baixa. Isso significa que mesmo que você resolva o challenge JavaScript perfeitamente, um IP de datacenter ainda pode receber 403 ou 429.
O Kasada pondera a reputação de IP de forma pesada — um IP residencial limpo com histórico de tráfego orgânico recebe uma pontuação alta, enquanto um IP de datacenter conhecido recebe uma penalidade que frequentemente resulta em bloqueio automático, independentemente do resultado do challenge JS. Essa camada é a razão pela qual tentativas de kasada bypass puramente no nível de JavaScript falham: o IP já foi filtrado antes do challenge ser servido.
Camada 3: A VM ips.js e o Challenge JavaScript
Se as camadas 1 e 2 passarem, o Kasada serve o script ips.js — um arquivo de aproximadamente 449KB que contém uma máquina virtual de bytecode customizada. O script não é JavaScript legível; é um interpretador que carrega bytecode ofuscado e uma tabela de strings codificada.
Características técnicas do ips.js kasada:
- VM de bytecode customizada: o código não executa JavaScript direto — ele interpreta um bytecode proprietário, tornando a engenharia reversa extremamente difícil. A VM implementa seu próprio conjunto de opcodes, pilha de execução e sistema de chamadas.
- Tabela de strings codificada: strings sensíveis (nomes de APIs, targets de fingerprint, URLs de validação) são armazenadas em formato codificado e decodificadas em runtime, impedindo análise estática.
- Seeds baseados em tempo: a VM usa timestamps como seeds para gerar valores dinâmicos, impedindo replay de tokens. Um token gerado há 5 minutos já pode estar expirado.
- Checksums de integridade: o script verifica sua própria integridade durante a execução, detectando modificações no código ou hooks injetados.
A VM coleta dezenas de sinais do navegador e dispositivo:
- Canvas fingerprint: renderiza elementos em um canvas oculto e computa o hash dos pixels resultantes. Diferentes GPUs, drivers e configurações de anti-aliasing produzem hashes distintos. Veja mais sobre canvas fingerprinting na Wikipedia.
- WebGL fingerprint: parâmetros do
renderer,vendor, versão WebGL e extensões suportadas. - Audio fingerprint: processamento de sinais via Web Audio API usando
OfflineAudioContext— o hash do buffer de áudio processado varia por hardware. - Fontes instaladas: medição de largura de strings em fontes específicas para detectar quais fontes estão disponíveis no sistema.
- Propriedades do navegador:
navigator.webdriver,navigator.plugins,navigator.languages,screen.colorDepth, timezone,deviceMemory,hardwareConcurrency. - Sinais comportamentais: timing entre eventos de mouse, padrões de movimento, velocidade de digitação,
Event.isTrusted. - APIs específicas:
Performance API,Battery API,MediaDevices.enumerateDevices(), vazamentos de WebRTC.
Todos esses sinais são combinados, criptografados e enviados ao servidor Kasada como um payload rotativo. O servidor valida o payload e emite o cookie KP_UIDz.
Cabeçalhos x-kpsdk-ct, x-kpsdk-cd e x-kpsdk-dv
Após o challenge ser resolvido, o Kasada espera que o cliente envie tokens de validação em cabeçalhos específicos:
x-kpsdk-ct(Challenge Token): o token principal que prova que oips.jsfoi executado e resolveu o challenge. Se você recebe um 429 carregandox-kpsdk-ct, significa que o token falhou na validação — o payload estava expirado, inválido, não correspondia ao fingerprint esperado ou havia inconsistência entre o IP que resolveu o challenge e o IP atual.x-kpsdk-cd(Challenge Data): dados complementares enviados junto com o token, contendo metadados de sessão e device.x-kpsdk-dv(Device Verification): verificação de dispositivo adicional que pode ser requerida em fluxos sensíveis como login ou checkout.
O cookie KP_UIDz é o artefato de sessão persistente. Ele é setado após a primeira resolução do challenge e deve ser mantido entre requisições. O Kasada valida não apenas o cookie, mas também a consistência entre o cookie, os cabeçalhos x-kpsdk-* e o IP de origem em cada requisição subsequente.
Por Que Proxies Residenciais São Essenciais para Passar pelo Kasada
Dado que o Kasada pré-bloqueia ASNs de datacenter, o tipo de proxy que você usa é decisivo. Aqui está uma comparação direta dos tipos de proxy contra a camada de reputação de IP do Kasada:
| Tipo de Proxy | Reputação de IP no Kasada | Risco de Bloqueio | Recomendado para Kasada? |
|---|---|---|---|
| Datacenter | Muito baixa — ASNs conhecidos são pré-bloqueados | Altíssimo (403/429 mesmo com challenge resolvido) | Não |
| Mobile | Alta — IPs de operadoras móveis têm boa reputação | Baixo | Sim, alternativa viável |
| Residencial | Alta — IPs de ISPs residenciais com tráfego orgânico | Baixo | Sim — recomendado |
O Kasada pesa a reputação de IP de forma tão agressiva que mesmo um challenge perfeitamente resolvido pode ser rejeitado se o IP tiver baixa confiança. Proxies residenciais fornecem IPs que pertencem a ISPs reais, com histórico de tráfego que parece orgânico — exatamente o que o Kasada espera ver. Você pode explorar as localizações disponíveis da ProxyHat para escolher IPs residenciais geograficamente relevantes para o site alvo.
Implementação Prática: ProxyHat + Browser Runtime
A abordagem legítima para passar pelo Kasada em 2026 não é "bypassar" o challenge — é executá-lo de forma nativa em um navegador real, usando proxies residenciais para garantir que o IP tenha reputação adequada. Aqui está um fluxo prático usando a ProxyHat.
Passo 1: Configurar o proxy residencial via SOCKS5
Use o gateway SOCKS5 da ProxyHat para rotear o tráfego do navegador através de IPs residenciais. O SOCKS5 é preferido sobre HTTP CONNECT porque preserva a handshake TLS original do navegador, mantendo o JA3/JA4 intacto:
# Teste de conectividade SOCKS5 com geo-targeting (EUA)
curl --socks5 user-country-US:pass@gate.proxyhat.com:1080 \
https://httpbin.org/ipPasso 2: Lançar um navegador headless com o proxy
Usando Playwright em Python para executar o ips.js nativamente:
from playwright.sync_api import sync_playwright
proxy_config = {
"server": "socks5://gate.proxyhat.com:1080",
"username": "user-country-US",
"password": "pass"
}
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy=proxy_config,
args=["--disable-blink-features=AutomationControlled"]
)
context = browser.new_context(
user_agent=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36"
),
viewport={"width": 1920, "height": 1080},
locale="en-US"
)
page = context.new_page()
# Navega para o site protegido — ips.js executa nativamente
page.goto("https://exemplo-protegido.com",
wait_until="networkidle")
# Aguarda o challenge ser resolvido (KP_UIDz cookie é setado)
page.wait_for_timeout(3000)
# Captura cookies de sessão
cookies = context.cookies()
kp_uidz = [c for c in cookies if c["name"] == "KP_UIDz"]
if kp_uidz:
print(f"KP_UIDz obtido: {kp_uidz[0]['value'][:20]}...")
else:
print("Challenge não resolvido — verifique reputação do IP")
browser.close()O navegador real executa o ips.js com todas as APIs necessárias disponíveis (Canvas, WebGL, Web Audio, navigator), produzindo um fingerprint consistente e um token x-kpsdk-ct válido.
Passo 3: Reutilizar cookies em requisições subsequentes
Após obter o KP_UIDz e os cabeçalhos x-kpsdk-ct, você pode reutilizá-los em requisições subsequentes via HTTP usando o gateway da ProxyHat:
import requests
proxies = {
"http": "http://user-country-US:pass@gate.proxyhat.com:8080",
"https": "http://user-country-US:pass@gate.proxyhat.com:8080"
}
headers = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36"
),
"Cookie": f"KP_UIDz={kp_uidz_value}",
"x-kpsdk-ct": f"{ct_token}",
}
response = requests.get(
"https://exemplo-protegido.com/api/data",
headers=headers,
proxies=proxies
)
print(response.status_code)Passo 4: Sessões Sticky para Consistência
O Kasada valida a consistência entre IP, cookie KP_UIDz e cabeçalhos x-kpsdk-ct. Se o IP mudar entre requisições que carregam o mesmo cookie, o token pode ser invalidado. Use sessões sticky da ProxyHat para manter o mesmo IP residencial durante todo o ciclo de vida do token:
# Sessão sticky — mesmo IP residencial por toda a sessão
curl --socks5 user-session-abc123-country-US:pass@gate.proxyhat.com:1080 \
https://exemplo-protegido.comConsulte a página de preços da ProxyHat para planos com sessões sticky e rotação configurável. Para detalhes técnicos completos de configuração, veja a documentação oficial da ProxyHat.
Erros Comuns e Casos de Borda
1. Usar bibliotecas HTTP sem navegador real
Tentar resolver ips.js com requests + PyExecJS ou Node.js vm não funciona de forma confiável. A VM do Kasada depende de APIs de navegador (Canvas, WebGL, Web Audio, navigator) que não existem em runtimes Node.js puros. Sem um DOM real e APIs de navegador, o fingerprint gerado é inválido e o x-kpsdk-ct será rejeitado.
2. Ignorar o fingerprint TLS
Mesmo com um navegador real, se o tráfego passar por um proxy HTTP que modifica a handshake TLS (alguns proxies HTTP CONNECT intermediários reescrevem o ClientHello), o JA3 muda e pode ser bloqueado. Use SOCKS5 (porta 1080) em vez de HTTP CONNECT para minimizar interferência na handshake TLS.
3. Rotacionar IPs durante uma sessão ativa
Se você rotacionar o IP no meio de uma sessão que já tem KP_UIDz, o Kasada detecta a inconsistência entre o IP que resolveu o challenge e o IP atual. Use sessões sticky (user-session-xxx) durante todo o ciclo de vida do token. Só rotacione ao iniciar uma nova sessão.
4. Não respeitar rate limits
O Kasada impõe rate limits agressivos. Mesmo com proxies residenciais e tokens válidos, fazer 100 requisições concorrentes do mesmo IP pode disparar 429. Distribua a carga entre múltiplas sessões sticky com IPs residenciais diferentes e mantenha uma taxa conservadora (ex: 1 requisição a cada 2-3 segundos por IP).
5. Headers HTTP/2 fora de ordem
Se você usa uma biblioteca que não preserva a ordem de headers HTTP/2 do navegador real (ex: requests não suporta HTTP/2 nativamente), o fingerprint HTTP/2 não corresponde. Use httpx com http2=True ou Playwright para preservar a ordem natural dos headers.
Considerações Legais e Éticas
Técnicas de acesso a sites protegidos por Kasada devem ser usadas exclusivamente para fins legítimos:
- Testes autorizados em infraestrutura própria ou com permissão explícita do proprietário
- Monitoramento de dados públicos que não violam termos de serviço
- Pesquisa de segurança com divulgação responsável
Nos Estados Unidos, o Computer Fraud and Abuse Act (CFAA) criminaliza acesso não autorizado a sistemas computacionais. Na União Europeia, o GDPR impõe restrições rigorosas sobre coleta e processamento de dados pessoais. Sempre consulte os termos de serviço do site alvo, respeite o robots.txt e obtenha autorização antes de automatizar acessos. A ProxyHat fornece infraestrutura de proxy para automação legítima — consulte nossa página de casos de uso de web scraping e rastreamento SERP para mais contexto sobre boas práticas.
Principais Conclusões
Resumo rápido:
- O Kasada Anti-Bot opera em três camadas: TLS/HTTP2 fingerprinting (JA3/JA4), reputação de IP (pré-bloqueio de ASNs de datacenter) e challenge JavaScript via VM
ips.js(~449KB).- Receber um 429 com
x-kpsdk-ctsignifica que o token do challenge falhou — o payload estava expirado, inválido ou inconsistente com o IP de origem.- Proxies de datacenter são pré-bloqueados pelo Kasada — proxies residenciais são essenciais para passar pela camada de reputação de IP.
- A abordagem correta é executar
ips.jsnativamente em um navegador real via proxy residencial SOCKS5 (porta 1080), não tentar "bypassar" o challenge com emulação parcial.- Sessões sticky mantêm consistência entre IP, cookie
KP_UIDze cabeçalhosx-kpsdk-ctdurante todo o ciclo de vida do token.
Pronto para implementar acesso autorizado contra sites protegidos por Kasada? Comece configurando seus proxies residenciais na ProxyHat e teste o fluxo completo com o código acima.






