voltar à visão geral Mais artigos

Fingerprinting de WebGL: o que sua GPU conta para todo site

Lendo sua GPU pelo WebGL...

Qualquer página da web pode perguntar ao seu navegador o nome da sua placa de vídeo. Sem pedido de permissão, sem banner de cookies, só umas poucas linhas de JavaScript. Num notebook Windows típico, a resposta é algo como ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 (0x00002503) Direct3D11 vs_5_0 ps_5_0, D3D11), e o widget nesta página mostra o que o seu responde.

Isso é fingerprinting de WebGL, e é por causa dele que verificadores de fingerprint exibem linhas como “WebGL fingerprinting is present” ou, de forma mais alarmante, “WebGL renderer info is spoofed”. A primeira vale para praticamente todo navegador do planeta. A segunda significa que seu navegador foi pego se contradizendo, quase sempre por causa de uma extensão que você instalou.

Versão resumida: o WebGL expõe sua GPU duas vezes: uma como nome (a string do renderizador "desmascarado") e outra como pixels (o jeito como sua GPU desenha uma cena de teste). "WebGL fingerprinting is present" só quer dizer que o WebGL está ligado, o que é normal. "Spoofed" significa que essas duas histórias se contradizem, ou contradizem o resto do seu navegador, e esconder o nome de um jeito malfeito chama mais atenção do que simplesmente não esconder.

O que um teste de fingerprint WebGL lê do seu navegador

O WebGL é a API do navegador para desenhar gráficos 3D com a sua GPU. É ele que faz funcionar o Google Maps, os jogos no navegador e os configuradores de produto em 3D, e para dar conta desse trabalho ele precisa conversar com hardware de verdade. Um script de fingerprinting o usa de duas formas.

Ele pergunta. A extensão WEBGL_debug_renderer_info adiciona duas constantes, UNMASKED_VENDOR_WEBGL e UNMASKED_RENDERER_WEBGL. O nome promete mais do que entrega: a extensão não desmascara nada, só devolve o nome da GPU informado pelo driver em vez de um placeholder como “WebKit WebGL”. Ao lado dela ficam dezenas de valores de capacidade (o tamanho máximo de textura, as extensões suportadas, a precisão dos shaders) que variam entre famílias de GPU e versões de driver. Juntos, são baratos de ler e continuam estáveis por meses.

Ele observa. O script desenha uma pequena cena fora da tela, lê os pixels de volta com readPixels e calcula um hash deles. GPUs e drivers diferentes arredondam cores, suavizam bordas e calculam a matemática dos shaders de maneiras ligeiramente diferentes, então o hash também muda. É a mesma ideia do fingerprinting de canvas, só que uma camada mais perto do hardware.

As pessoas imaginam esse nome como algo vago, tipo “gráficos Intel”. A string real parece uma ficha técnica:

O que uma única string entrega
ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 (0x00002503) Direct3D11 vs_5_0 ps_5_0, D3D11)
  • ANGLE: a camada que transforma WebGL em chamadas de Direct3D, Metal ou OpenGL. O Chrome desenha através dela em todo SO de desktop, o Firefox só no Windows; este formato exato é o do Chrome.
  • Fabricante da GPU
  • O chip gráfico exato, que também dá uma pista de quanto a máquina custou
  • ID de dispositivo PCI: diferencia variantes do chip vendidas com o mesmo nome
  • Direct3D: só existe no Windows
O que o Chrome retorna para UNMASKED_RENDERER_WEBGL, sem pedir permissão. A API gráfica costuma entregar o sistema operacional sozinha.

O Direct3D só existe no Windows e o Metal só em hardware da Apple, então, na maioria das máquinas, a string da GPU resolve sozinha a questão do sistema operacional, diga o seu User-Agent o que disser. É a mesma verificação cruzada que destrinchamos em Um navegador, cinco alegações de SO.

Quão único é um fingerprint de WebGL?

Sozinho, menos do que você talvez tema. Milhões de pessoas têm uma RTX 3060, e todo MacBook com M2 informa a mesma string. O WebGL coloca você numa gaveta de hardware, e um fingerprint se constrói empilhando gavetas. Uma RTX 3060 é comum. Uma RTX 3060 numa tela 1440p, no fuso horário de Amsterdã, com holandês e inglês configurados como idiomas, já é uma multidão bem pequena.

O valor dele para os rastreadores é a persistência: você pode trocar de navegador e apagar todos os cookies, e sua GPU continua a mesma. Pesquisadores foram além. O estudo DrawnApart, de 2022, cronometrou pequenas cargas de trabalho nas unidades de execução de uma GPU e conseguiu distinguir máquinas com hardware idêntico e strings de renderizador idênticas.

“WebGL fingerprinting is present” não é um alerta

Quando um verificador diz que o fingerprinting de WebGL está presente (“WebGL fingerprinting is present”), isso significa uma coisa só: o WebGL está ligado e pode ser lido. Esse é o estado normal de todo navegador popular, em todo desktop e em todo celular. Não é sinal de que algo esteja errado, e o WebGL não é algo de que você precise se proteger: o custo para a privacidade é o fingerprint, e o fingerprint é o assunto do resto desta página.

A solução tentadora é desligar o WebGL. Não faça isso. Desligá-lo troca uma GPU que você divide com milhões de pessoas por uma característica que quase ninguém tem, e ainda quebra todo site que desenha com a GPU. Um navegador que recusa uma API padrão também é o tipo de esquisitice que rende CAPTCHAs extras.

Por que um verificador diz “WebGL renderer info is spoofed”

A frase aparece com mais frequência na ferramenta de diagnóstico do Cloudflare Turnstile, numa verificação chamada “Graphics Information Appears Fake”, que as pessoas costumam encontrar depois que um desafio fica em loop em vez de deixá-las passar. Ninguém consegue ver sua GPU diretamente, então um verificador não tem como provar que hardware você tem. O que ele pode fazer é comparar as alegações entre si, e valores falsificados raramente sobrevivem a isso. Estes são os testes. O widget nesta página executa os quatro primeiros:

  • A API gráfica não combina com o SO. Uma string de renderizador com Metal no meio, enviada por um navegador cujo User-Agent diz Windows.
  • Fornecedor e renderizador discordam. O campo de fornecedor (vendor) ainda diz NVIDIA porque o spoof só reescreveu o renderizador.
  • As funções do WebGL foram sobrescritas. Para mudar o que getParameter retorna, uma extensão precisa substituí-la, e uma função nativa substituída de forma ingênua deixa de reportar [native code]. Sobrescritas mais bem escondidas exigem verificações mais sutis. É a mesma armadilha que pega ferramentas de automação no nosso teste de detecção de bots.
  • Os pixels mudam entre uma leitura e outra. Na prática, uma GPU real devolve pixels idênticos quando desenha a mesma cena duas vezes. Algumas extensões antifingerprinting injetam ruído aleatório novo a cada leitura, então dois desenhos dão dois hashes. Essa instabilidade é mais rara do que qualquer GPU do mercado.
  • O nome não bate com os pixels. Empresas antifraude podem comparar sua saída de renderização com o que dispositivos conhecidos produzem. Diga que tem uma RTX 3060 enquanto desenha como uma GPU integrada da Intel e o hash de renderização denuncia você. Um único navegador não consegue fazer essa verificação, então o widget a deixa de fora.

Alterne entre as configurações para ver quais indícios cada uma dispara:

O que um verificador de spoof vê
Renderizador informado ANGLE (Apple, ANGLE Metal Renderer: Apple M2, Unspecified Version)
  • marcada
    API gráfica combina com o SO
    Metal num User-Agent de Windows
  • marcada
    Fornecedor bate com o renderizador
    o fornecedor ainda diz NVIDIA
  • marcada
    Funções do WebGL são nativas
    getParameter foi substituída
  • aprovada
    Mesmo desenho, mesmos pixels
    dois desenhos, um só hash
Trocar o nome dispara três verificações de uma vez: o novo nome pertence a outro SO, o campo de fornecedor foi esquecido e a própria troca é uma função sobrescrita.

Nas duas configurações falsificadas, a GPU está ótima; todas as marcações vêm da própria falsificação. Se você recebeu o aviso de “spoofed” sem nunca ter tentado falsificar nada, confira sua lista de extensões atrás de algum “defender” de WebGL ou de canvas. Esse é o culpado de sempre, e a ferramenta de diagnóstico da Cloudflare cita um com todas as letras: WebGL Fingerprint Defender.

Quando o aviso é alarme falso

Nem toda marcação significa que alguém mexeu no seu navegador. Algumas configurações bem comuns também disparam os verificadores:

  • Área de trabalho remota e máquinas virtuais. Sem uma GPU real disponível, o navegador recorre a um renderizador por software, como o llvmpipe ou o Basic Render Driver da Microsoft, ou perde o WebGL por completo. Servidores rodando bots têm exatamente a mesma cara, então os verificadores tratam isso com desconfiança.
  • Notebooks com GPU híbrida. Um notebook com placa integrada e dedicada pode informar GPUs diferentes dependendo das configurações de energia ou de qual delas foi atribuída ao navegador.
  • Navegadores que protegem você de propósito. O Safari informa uma “Apple GPU” genérica para todo site. O Firefox reduz o nome do renderizador a uma família ampla. O Brave dá a todos os usuários o mesmo nome genérico de GPU e acrescenta pequenas variações por site a outras saídas do WebGL, técnica que ele chama de farbling. Bons verificadores colocam esses casos numa lista de permissões. Os preguiçosos marcam mesmo assim.

A diferença entre esses casos e um spoof é a consistência. O Safari dizendo “Apple GPU” num dispositivo Apple é uma resposta compartilhada e honesta. Um navegador no Windows alegando ter uma GPU da Apple é uma contradição.

Como mudar ou bloquear seu fingerprint de WebGL

  1. Deixe o WebGL ligado. Desativá-lo torna você mais raro, não mais seguro, e quebra sites de verdade.
  2. Remova extensões que falsificam o WebGL. Trocadores de nome e injetores de ruído criam exatamente as contradições que os verificadores procuram. Se o widget acima marcar funções sobrescritas ou pixels instáveis, a culpada costuma ser uma extensão.
  3. Se você precisa de outra identidade, mude cada parte dela. Gerenciar várias contas para verificação de anúncios, e-commerce ou redes sociais significa que cada perfil precisa de uma GPU que combine com seu sistema operacional, de um fornecedor que combine com seu renderizador e de pixels que combinem com sua GPU. Isso é difícil de falsificar em JavaScript, e é por isso que os navegadores anti-detecção fazem esse trabalho dentro do engine. O Incogniton dá a cada perfil uma identidade WebGL consistente no nível do navegador, sem nenhuma função sobrescrita para um verificador encontrar.

Depois, rode o scan completo do navegador para ver como sua GPU se encaixa em todo o resto que seu navegador informa, do fuso horário às fontes.

Logotipo da Incogniton

Eleve o nível da sua privacidade

Seta