- A verificação de dispositivo “Verify you're human” do Cloudflare Turnstile está entrando em loop infinito em navegadores baseados em WebKitGTK desde cerca de uma semana atrás
- A causa direta que está bloqueando o acesso a vários sites parece ser o comportamento do Cloudflare de tentar obter a impressão digital do dispositivo por meio de WebGL
- A mensagem do Turnstile afirma que usa coleta de impressão digital do navegador para verificar se é uma pessoa, e que ferramentas de bloqueio ou aleatorização podem fazer o navegador parecer um bot
- O WebKit vem bloqueando esse tipo de recurso há anos, e isso não parece ser uma opção de privacidade que o usuário possa desativar facilmente
- Enquanto se supõe que haja uma exceção para o Safari, todos os navegadores WebKitGTK estão sendo bloqueados, e usuários com proteções de privacidade do Firefox também podem ser afetados
Verificação Turnstile em loop no WebKitGTK
- A verificação de dispositivo “Verify you're human” do Cloudflare Turnstile está entrando em loop infinito em navegadores baseados em WebKitGTK desde cerca de uma semana atrás, bloqueando o acesso a vários sites
- A causa do bloqueio de acesso parece ser o comportamento do Cloudflare de tentar obter a impressão digital do dispositivo por meio de WebGL
- O texto informativo do Turnstile afirma que usa coleta de impressão digital do navegador para verificar se é uma pessoa
- Ferramentas de privacidade que bloqueiam ou aleatorizam a coleta de impressão digital podem fazer o navegador parecer um bot tentando ocultar sua identidade
- O WebKit vem bloqueando esse tipo de recurso há anos, e isso não parece ser uma função de privacidade que possa ser facilmente desativada
- Enquanto se supõe que o Cloudflare tenha feito uma exceção para o Safari, todos os navegadores WebKitGTK acabaram ficando bloqueados
Comportamento de proteção relacionado no Firefox
- A proteção contra coleta de impressão digital via WebGL no Mozilla Firefox tem o problema Bugzilla#1916271: Gecko reveals sanitized GPU Characteristics; webkit and blink return hardcoded strings for all users
privacy.resistfingerprintingnão é ativado mesmo ao selecionar “Strict” e “Enhanced Privacy Protection” nas configurações- Usuários do Firefox voltados à privacidade que ativaram
privacy.resistfingerprintingmanualmente podem, no futuro, não conseguir passar pela verificação de dispositivo do Cloudflare
2 comentários
Opiniões no Lobste.rs
Parece que o artigo misturou várias coisas sobre o Firefox. Falo isso como alguém que esteve na equipe que trabalhou diretamente nisso: as defesas contra fingerprinting do Firefox funcionam de várias formas
Primeiro, o Firefox limita as informações nas strings de vendor/renderer do WebGL, incluindo as chamadas strings “unmasked”. O código de exemplo para verificar isso diretamente foi postado pelo Fatih no comentário 14. A alegação de que isso quebrou alguma coisa está completamente errada
Segundo, o Firefox também randomiza a saída do canvas. Se você chamar
toDataURL()no mesmo canvas, o valor retornado varia sutilmente entre sessões. Dá para testar isso, por exemplo, entre modo privado/modo normal ou em diferentes container tabsTerceiro, esse recurso e proteções recentes contra fingerprinting foram feitos com base em análises empíricas para funcionar bem sem quebrar a web. A maior parte já vem ativada por padrão, e se quiser mais, basta mudar o “Enhanced Tracking Protection” para strict nas configurações
Quarto, o modo
resistFingerprintingnão aparece nas configurações e só pode ser acessado viaabout:config, porque é sabido que ele pode quebrar a web. Ele continua lá por causa do Tor Browser, que é um fork do Firefox, mas pessoalmente acho que as proteções do Enhanced Tracking Protection são muito melhoresNão estou defendendo fingerprinting, mas isso faz parte do meu trabalho atual, então tenho interesse em ferramentas de bloqueio de bots
Pelo que entendo, o objetivo do Cloudflare com o Turnstile é criar um widget de defesa contra bots em que humanos não precisem resolver captchas. Imagino que isso funcione observando o comportamento em vários sites por meio de fingerprinting e liberando a maioria dos usuários; queria saber se esse entendimento está correto
É viável ter um widget sem captcha e sem fingerprinting? Isso é possível em primeiro lugar? Também já ouvi dizer que não é tão difícil assim contornar o Turnstile :tm:. Todo widget de bloqueio de bots acaba sendo, no fim, segurança baseada em obscuridade?
Não importa tanto se a pessoa navega por vários sites; o essencial é detectar acessos repetidos ao mesmo site
Para criar um widget sem captcha e sem fingerprinting, atestado de hardware também funciona. Mas todo mundo odeia isso. A Apple oferece atestado de hardware, e como a Cloudflare usa isso no Safari, o Safari consegue passar mesmo com randomização de canvas. Ao contrário do que esse post do blog sugere, não é que a Cloudflare tenha aberto uma exceção para o Safari
Você também pode exigir prova de trabalho, mas aí precisa aceitar excluir muitos usuários da web que só têm celulares Android baratos, e o valor de cada ação individual do bot precisa ser baixo o suficiente para que o operador do bot não tenha incentivo para pagar esse custo computacional. Às vezes essas condições existem, mas não servem para coisas como e-commerce ou banco
Fora isso, não há grande solução. Não conheço bem o Turnstile, mas o produto da empresa onde eu estava era definitivamente difícil de contornar em escala. Quando não era em escala, porém, a gente deliberadamente não dificultava tanto, e eu não me surpreenderia se a Cloudflare tivesse feito a mesma escolha
O objetivo de todo widget de bloqueio de bots não é tornar bots impossíveis, e sim tornar ataques com bots a um site economicamente inviáveis. Por isso o jogo é diferente do de outras áreas de cibersegurança, e obscuridade funciona razoavelmente bem. A meta é fazer o adversário continuar arcando com custos extras ao longo do tempo
canvas/webglé, na prática, um problema já resolvido para quem faz web scraping. Isso até aparece em entrevistas para vagas da área de scraping webA solução comum é extrair os comandos de renderização. Dá para fazer isso com um navegador modificado que despeja os comandos ou obtendo-os por desofuscação do script
Depois, basta hospedar esse script extraído de canvas/webgl em um site seu e gerar, a partir dos visitantes, fingerprints reutilizáveis para os bots
Esse método é bastante robusto. Esses scripts de fingerprinting quase nunca mudam, porque se mudassem, invalidariam o banco de dados de canvas → pares GPU/vendor/browser/OS
Em resumo, este é só mais um caso em que os usuários normais ficam mais incomodados, enquanto web scrapers sérios já conhecem várias estratégias de evasão
Comentários do Hacker News
A Cloudflare é conhecida por usar coleta de impressão digital do navegador para detectar scrapers. Por exemplo, ela compara a impressão digital JA3 com o user agent para bloquear coisas como cURL e permitir OkHttp (cliente Android), mas isso pode ser facilmente disfarçado com pacotes como o CycleTLS [1]
Não quero defender isso, já que “proteção contra bots” acaba bloqueando uma grande parte da internet, mas se não for usar prova de trabalho (PoW), a coleta de impressão digital pode ser um método realista, e o resultado é destruir completamente a privacidade de todos os envolvidos
O Cromite, um fork do Chromium para Android focado em privacidade, vive tendo problemas com o Cloudflare Turnstile [2], porque a Cloudflare coleta impressões digitais de várias formas para deixar o desafio passar
Para resolver isso, seria preciso entrar no programa Cloudflare Browser Developer, que exigia assinatura de NDA, e parece justo que o mantenedor do projeto tenha recusado
Se quiser ver até onde a Cloudflare vai na coleta de impressão digital do navegador, basta olhar na issue [2] quais flags precisam ser desativadas para conseguir passar pelo desafio. No mínimo, acho que a Cloudflare poderia ser flexível o bastante para substituir por prova de trabalho em vez de simplesmente impedir pessoas de enviar formulários ou acessar sites
[1]: https://github.com/Danny-Dasilva/CycleTLS
[2]: https://github.com/uazo/cromite/issues/2365
Dar reputação a IPs residenciais e faixas comerciais também pode ser outra forma de alcançar o resultado desejado. Isso faria os provedores tomarem muito mais cuidado com abuso de IP, mas nesse caso os negócios de DDoS dos dois lados, atacantes e defensores, também poderiam desmoronar
Ironicamente, há muitas empresas que investem tanto em criar seus próprios bots quanto em bloquear bots de outras empresas
Se forem 2 segundos com carga de 5 W, isso dá 0,002 Wh, e como também precisa funcionar em smartphones, não daria para exigir uma prova de trabalho de dezenas de segundos. Mesmo com 8 bilhões de verificações por dia durante 1 ano, isso daria 8 GWh
Existe um motivo para
privacy.resistfingerprintingnão ser ativado mesmo quando se escolhe “Strict” em “Enhanced Privacy Protection”. Eu usei isso por bastante tempo, mas os sites quebravam de formas estranhas, então eu sempre precisava desligar e criar exceçõesEm certos sites, o tratamento de fuso horário ficava quebrado, e por pouco não perdi compromissos algumas vezes. Para avisar ao usuário que não é o Firefox que está quebrado, seria preciso algo como um banner permanente dizendo “se sites quebrarem, aparecerem glitches estranhos, o horário do seu computador parecer errado, a fonte ficar esquisita ou vídeos às vezes não carregarem, clique aqui para desativar a proteção contra fingerprinting”
Curiosamente, o Turnstile quebra com
resistfingerprinting, mas funciona comfingerprintingProtection. Este último parece ter levado esse tipo de situação lixo em consideraçãoNa configuração Strict, eu até espero algum nível de quebra de site, mas não espero que os caminhos de rastreamento continuem totalmente abertos. Parece enganoso
Eu mantenho um navegador de nicho[0], e vários usuários vêm enfrentando esse problema há algumas semanas[1]. No momento eu não trato isso como bug do navegador, mas claro que pode haver algum bug relacionado, e seria bom ter mais gente olhando; preciso de ideias e ajuda para melhorar ou mitigar a situação
[0]: https://konform-browser.codeberg.page/
[1]: Não sei se é a maioria ou todos. Estou dependendo de relatos de usuários e testes próprios, sem telemetria
“Se descobriram que você está se disfarçando, é porque você não se disfarçou bem o suficiente.”
Essa guerra idiota contra bots vai levar ao colapso da internet e acabar transformando tudo em mais um jardim murado onde só agentes hostis ao usuário “aprovados” serão permitidos. Não caiam nesse papo furado de “scrapers de IA”. É só um meio de fabricar consentimento
Google e Cloudflare fizeram algum acordo para dificultar o uso de navegadores que não sejam Chrome? A pressão para usar Chrome só aumenta, e o que dá para filtrar de anúncios no Chrome só diminui
Se você esconde alguma coisa, é automaticamente classificado do lado dos “agentes que têm motivo para esconder algo”
Para ser claro, esse é o problema central. Como uma parte tão grande da internet passa pela Cloudflare, deveria haver sinais alternativos suficientes para demonstrar, com mais força do que um sinal específico, que você não é um agente malicioso
Só que, como quase não existem usuários com a mesma configuração dentro da base, pode demorar muito até surgir uma solução real
Dizem “parece que você quer esconder sua identidade”, mas eles nunca tiveram o direito de exigir isso para começar
Eu não conhecia
privacy.resistfingerprinting, mas daqui para frente vou deixar todos os Cloudflare Turnstile falharemA configuração
privacy.resistfingerprintingé para o Tor BrowserEla também vem ativada por padrão no Konform Browser e no Mullvad Browser, que trazem muitos dos patches de privacidade e segurança do Tor Browser
Gosto daquele ditado ligado ao crime: se X% da população está violando uma certa lei, então o certo é abolir essa lei. Drogas recreativas são um exemplo óbvio
Se o rendering aleatório de canvas era tratado como comportamento de bot, mas agora todo mundo que usa Firefox faz isso, então talvez a Cloudflare também devesse simplesmente “legalizar” isso, não?