Canvas, WebGL e Áudio: as três impressões digitais que sobrevivem a cada reinício do browser
Security & Privacy

Canvas, WebGL e Áudio: as três impressões digitais que sobrevivem a cada reinício do browser

Contra estas três, limpar cookies não vale de nada. Como se formam os hashes de canvas, as strings de renderer do WebGL e as assinaturas do AudioContext, e porque até o Tor deixa escapar uma.

BROWSER.LOL
17.05.2026
20 min de leitura
Partilhar

Limpas as cookies. Mudas de IP. Abres uma janela anónima. Até actualizas o Chrome. O site cumprimenta-te na mesma, como a um velho amigo: as mesmas recomendações, o mesmo estado de fraud-flag, a mesma faixa de preço. Quase todo esse reconhecimento é feito por três pequenos hashes, e nenhum vive num armazenamento que possas esvaziar.

São o fingerprint Canvas, o fingerprint WebGL e o fingerprint AudioContext. Cada um sai do hardware e do stack de drivers que está por baixo do browser, não de algo que a página tenha escrito na tua máquina. Juntos formam uma assinatura de device estática que aguenta reinícios, repor o perfil, instalações limpas e a maioria das extensões de privacidade. É a camada que fica por baixo das cookies, e é onde o tracking moderno acontece de facto. Actualizado: 2026.

Um fingerprint estático de device é um hash que resulta da forma como o teu hardware e os teus drivers reagem a uma carga de trabalho (um canvas desenhado, uma cena 3D renderizada, uma onda sinusoidal processada). Não fica guardado na tua máquina, portanto não há nada para apagar. Duas máquinas do mesmo lote de fábrica podem na mesma produzir hashes diferentes pela variância do silício da GPU e pelo número de build do driver. O panorama geral já o demos em Browser Fingerprinting: como os sites te seguem. Aqui entramos nos três vectores que fazem o grosso do trabalho.

Porquê precisamente estes três

Um script moderno de fingerprinting sonda cerca de 40 vectores numa página típica: User-Agent, tamanho do ecrã, headers de idioma, lista de fontes, plugins instalados, offset de fuso horário, precisão do ponteiro, hardware concurrency. Quase todos esses valores são inteiros ou strings curtas, e na prática cada um vale entre um e cinco bits de entropia. Servem como cola, não como identificadores.

Canvas, WebGL e AudioContext jogam noutra liga. Cada um atira uma carga determinista pelo dispositivo e calcula o hash do resultado. O hash depende do silício da GPU, da versão do driver, do rasterizador de fontes do SO, da estratégia de anti-aliasing e da implementação em vírgula flutuante do subsistema de áudio. É por isso que uma instalação acabada de fazer do Chrome, na mesma máquina, dá no dia seguinte quase os mesmos três hashes, enquanto a mesma máquina com outro driver de GPU sai com valores visivelmente diferentes.

Os números do dataset Cover Your Tracks da EFF e do corpus AmIUnique do Inria colocam o hash de canvas em cerca de dez bits de entropia, as informações do renderer WebGL entre seis e oito bits, e o AudioContext em quatro ou cinco. Uma sessão que exponha os três passa com folga os dezoito bits, o suficiente para te tirar de um bolo de um quarto de milhão de utilizadores. Mais do que de sobra para ad targeting, fraud scoring e quase todas as pipelines de analytics.

O fingerprinting de Canvas em detalhe

Janela de browser com uma área canvas hexagonal cujas margens são traçadas por pontos de medição, e uma fileira de rectângulos por baixo a representar o hash

Um fingerprint de canvas é o hash de uma imagem que o teu browser desenhou sem que tu chegasses a vê-la. O script cria um <canvas> fora do ecrã, enche-o com algumas formas e uma string de texto em duas ou três fontes, chama toDataURL() e faz o hash dos bytes do PNG. Nada disto te aparece à frente, e tudo acontece em poucos milissegundos.

Numa dada máquina o hash mantém-se estável porque o caminho de renderização é determinista. Mesma GPU, mesmo driver, mesmo rasterizador de fontes, mesmo modo de anti-aliasing, mesmo PNG, byte a byte. Muda uma destas variáveis e o hash salta. É também por isso que um feature update do Windows pode fazer um utilizador antes estável parecer novo aos olhos de um tracker, e por isso que as máquinas das empresas com drivers bloqueados se parecem quase todas umas com as outras.

O esqueleto do ataque é mais ou menos isto:

const c = document.createElement("canvas");
const ctx = c.getContext("2d");
ctx.textBaseline = "alphabetic";
ctx.font = "14px 'Arial'";
ctx.fillStyle = "#069";
ctx.fillText("Cwm fjordbank glyphs vext quiz, ", 2, 15);
ctx.fillStyle = "rgba(102,204,0,0.7)";
ctx.fillText("Cwm fjordbank glyphs vext quiz, ", 4, 17);
const png = c.toDataURL();
// hash(png) torna-se o teu fingerprint canvas

O snippet não tem nada de exótico. É basicamente a rotina que o FingerprintJS, o ThreatMetrix e o Cloudflare Bot Management correm no primeiro contacto, com pequenas variações. O Brave e o uBlock Origin defendem-se a injectar um pequeno ruído por sessão antes da leitura, e o hash sai diferente de cada vez. Contra agregadores ingénuos resulta, mas a própria defesa é detectável: um hash que nunca se repete é, por si só, um sinal, e os trackers arrumam-te na gaveta «utilizador com randomização de canvas».

O fingerprinting de WebGL em detalhe

Janela de browser com uma forma triangulada low-poly feita de triângulos finos ligados e um pequeno ícone de chip no canto

O WebGL dá à página acesso directo à tua GPU através de um wrapper JavaScript da API OpenGL ES. Há duas coisas que saltam logo à vista. Primeiro, uma pequena extensão chamada WEBGL_debug_renderer_info expõe sem rodeios o fabricante da GPU e a string do renderer. Na maior parte dos desktops aparece algo como ANGLE (NVIDIA, GeForce RTX 4070, OpenGL 4.5.0) ou outra coisa igualmente específica. Essa string sozinha pode trazer mais de dez bits de entropia, porque inclui o ramo do driver e por vezes até um hash de build.

Segundo, mesmo com a extensão mascarada ou desligada, o resultado renderizado de uma cena 3D moderadamente complexa (um toro texturado, uma esfera com gradiente, alguns triângulos rodados) continua a poder ser hashado. Compiladores de shaders, definições de precisão e implementações de blending diferentes movem os pixéis em quantidades pequenas mas consistentes. O script relê o framebuffer com readPixels(), faz o hash e guarda o resultado.

Desligar o WebGL por completo é a defesa mais limpa e a mais cara. O Google Maps, a maioria dos jogos no browser, metade das ferramentas SaaS modernas que renderizam gráficos na GPU e um número surpreendente de visualizadores 3D de e-commerce deixam de funcionar. O Firefox tem a preferência webgl.disabled para quem aceite a troca. O Tor Browser mantém o WebGL activo, mas normaliza a string do renderer para um único valor em todas as instalações de Tor de uma mesma plataforma. É por isso que dois utilizadores Tor em hardware completamente diferente devolvem à página a mesma assinatura WebGL.

O fingerprinting de AudioContext em detalhe

Janela de browser com uma onda sinusoidal limpa traçada ao longo de um eixo horizontal e uma fileira de rectângulos por baixo a representar um hash estável

O fingerprinting de AudioContext é o mais silencioso dos três, em todos os sentidos. O script instancia um OfflineAudioContext, gera uma onda triangular ou sinusoidal a frequência fixa, passa-a por um compressor dinâmico com parâmetros fixos e relê as amostras como Float32Array. Nenhum som chega às colunas. O dispositivo não tem de ter o som ligado e os auscultadores também não pesam. O que pesa é a matemática em vírgula flutuante com que o teu stack de áudio gerou aquelas amostras.

Ao ouvido humano, a saída de áudio é idêntica (e também a qualquer analisador de espectro que só olhe para o conteúdo audível), mas os valores float32 por baixo mudam consoante a implementação do compressor. Builds de browser, motores de áudio do SO e até certas revisões de microcódigo de CPU deslocam os bits menos significativos seguindo padrões estáveis. Fazer o hash do buffer ou somá-lo dá um número que sobrevive a reboots, reposições de perfil e à maioria das extensões.

O AudioContext carrega menos entropia do que o canvas (tipicamente quatro a cinco bits), por isso isolado não identifica ninguém. O seu valor real para um tracker está em quase ninguém o defender. Canvas e WebGL apanham a atenção ruidosa das ferramentas de privacidade; o áudio escapa por baixo. Um script que encontre hashes de canvas e áudio coincidentes em duas sessões fica muito mais confiante na correspondência do que o canvas sozinho justificaria, porque o número de áudio quase nunca coincide por acaso.

Os três lado a lado

Postos lado a lado, os três vectores têm forças distintas. A tabela em baixo resume o que cada um vale para um tracker, quanto te custa a defesa e o quanto essa defesa salta à vista.

VectorEntropia médiaPersistênciaDefesasDefesa detectávelUsado por
Canvas~10 bitsAté mudar GPU, driver ou fontesRandomização Brave, CanvasBlocker, imagem uniforme TorSim (o ruído é por si um sinal)FingerprintJS, ThreatMetrix, Cloudflare Bot Management
WebGL~6 a 8 bits (string renderer até 10)Até mudar GPU ou driverMascarar renderer, desactivar WebGL, uniformização TorSim (UA contra renderer denuncia divergências)FingerprintJS, SDKs ad-tech, plataformas antifraude
AudioContext~4 a 5 bitsSobrevive a reboots e reinstalaçõesRara. Extensões de ruído áudio, Tor parcialBaixa (a defesa é incomum)FingerprintJS, fornecedores anti-bot, suites de analytics

O padrão é sempre o mesmo. Cada vector isolado é duro de bater, e as defesas que funcionam dão nas vistas. Um tracker que vê canvas normal, WebGL normal e uma flag de AudioContext em falta está a olhar para uma fatia minoritária da população, e só isso já chega para identificar.

Porque o Tor continua a deixar escapar um

O Tor Browser é a defesa de consumo mais agressiva contra o fingerprinting estático. Por defeito, as leituras de canvas devolvem uma imagem branca uniforme (o utilizador é consultado antes de qualquer dado verdadeiro ser libertado). O WebGL fica activo, mas a string do renderer é normalizada para um único valor em todas as instalações Tor da mesma plataforma, e o resultado renderizado é arredondado para tirar a variância dos drivers. Dois dos três vectores estão, na prática, mortos dentro do Tor.

O AudioContext é a ponta solta. O modelo de ameaça do Tor Project tem-no em conta (o ticket tor-browser#13017 e os relatórios de bug do Mozilla relacionados arrastam-se há anos), mas a saída em vírgula flutuante de um OfflineAudioContext continua a depender da cadeia de build. Um Tor Browser em Linux x86_64 contra um Tor Browser em macOS arm64 produz hashes de áudio mensuravelmente diferentes, mesmo quando ambos anunciam a mesma string de plataforma. Há distinguishers de AudioContext que funcionam contra o Tor, publicados várias vezes, desde o trabalho original do AmIUnique até a seguimentos académicos mais recentes.

Corrigir isto é complicado, porque a alternativa é desligar por completo o OfflineAudioContext, e isso parte qualquer webapp que descodifique áudio em segundo plano (leitores de podcasts, videoconferência, jogos no browser, ferramentas de acessibilidade). O Tor Project tem-se mantido conservador quanto a esta mudança. Resultado: mesmo o browser de consumo mais endurecido continua a expor um dos três vectores.

O que funciona mesmo contra estes hashes

Os três vectores partilham uma propriedade: derivam todos do comportamento do hardware físico. A defesa só por software ajuda, mas as únicas respostas completas mudam o que a página vê da tua máquina, não aquilo que a tua máquina realmente é.

Correr noutro hardware físico

Uma GPU diferente, outra microarquitectura de CPU e outro chip de áudio produzem hashes diferentes nos três vectores ao mesmo tempo. É a defesa mais forte e também a mais inconveniente. Quase ninguém compra um segundo portátil só para navegação sensível.

Arrancar de outra instalação de SO

Mesmo sobre o mesmo hardware, uma imagem de SO recém-feita, com outras versões de drivers, outro conjunto de fontes e outro stack de áudio, mexe em cada hash. Uma pen bootável com Tails é o exemplo clássico. O preço é viver num ambiente separado, com estado separado, o que serve para uso pontual e dói como configuração do dia-a-dia.

Usar um browser remoto containerizado

A versão mais prática é tirar o browser de cima da tua máquina por inteiro. Um browser remoto em contentor mostra à página a GPU do contentor, o stack de áudio do contentor e o conjunto de fontes do contentor. O teu hardware local nem chega a participar no render. Cada sessão nova começa num contentor novo, o que significa um novo hash de canvas, uma nova assinatura WebGL e um novo valor de AudioContext, nenhum deles ligado à tua máquina real. É o modelo do Browser.lol.

Instalar uma extensão de ruído, com reservas

CanvasBlocker, Trace e afins injectam aleatoriedade no readback do canvas e, por vezes, no WebGL. Os hashes mudam a cada sessão e isso despista os trackers ingénuos. O problema é que «utilizador com randomização canvas» é em si uma categoria, por isso um tracker sofisticado mete-te na mesma num balde, só que num mais pequeno e provavelmente mais interessante. Trata as extensões como defesa parcial, não como solução.

FAQ

Posso desligar o canvas no Chrome?

De forma limpa, não. O Chrome não expõe nenhuma definição para desligar o canvas, e uma extensão que bloqueie toDataURL() parte quase todos os clientes de webmail, ferramentas de mapas e pads de assinatura. As opções realistas no Chrome são uma extensão de ruído tipo CanvasBlocker (com o compromisso descrito acima) ou encaminhar a navegação sensível por um ambiente isolado.

Uma VPN muda o meu fingerprint?

Não. Uma VPN muda o IP e a geolocalização aparente, ambos sinais úteis para um tracker, mas não toca em canvas, WebGL ou AudioContext. O hash que a tua GPU produz é o mesmo, quer os bytes saiam pela tua ligação de casa, quer saiam por um nó de saída da Mullvad.

Porque é que o meu fingerprint muda depois de uma actualização do Windows?

As actualizações cumulativas do Windows mexem com frequência no driver da GPU, no rasterizador de fontes DirectWrite ou no motor de áudio. Qualquer um destes deslocamentos vira pelo menos um dos três hashes. Os trackers contam com isso e cruzam outros sinais (gama de IP, cookies de login, padrões de comportamento) para tapar o buraco. Ganhas uma janela curta em que pareces novo, não um reset permanente.

Estes fingerprints são únicos por si só?

Nenhum sozinho chega. O canvas isolado colide para milhares de utilizadores com a mesma combinação de GPU, driver e SO. O risco está no cruzamento: canvas mais WebGL mais AudioContext, juntos com o tamanho de ecrã e o fuso horário, reduzem a população a um punhado de pessoas.

O modo anónimo ajuda contra algum?

Não. O modo anónimo limpa cookies e histórico no fim da sessão, mas o hardware e os drivers que estão por baixo do browser não mudam. Cada janela anónima numa dada máquina dá os mesmos valores de canvas, WebGL e AudioContext que uma janela normal nessa mesma máquina.

O panorama final

Canvas, WebGL e AudioContext, juntos, passam os dezoito bits de entropia numa sessão típica. Chega para isolar um utilizador num conjunto de mais de 250 000, e todas as ferramentas pensadas para a era cookie (modo anónimo, VPN, a maioria das extensões de privacidade) deixam os três intactos. Os hashes saem da tua GPU, dos teus drivers, das tuas fontes e do teu stack de áudio, ou seja, precisamente a camada que essas ferramentas nunca alcançam.

Defender um vector de cada vez também se nota. A randomização do canvas, o mascaramento do WebGL e o ruído de áudio produzem anomalias detectáveis, por isso os trackers arrumam os utilizadores «defendidos» num grupo mais pequeno e provavelmente mais interessante. O Tor fecha dois dos três de forma convincente e continua a deixar escapar a assinatura de áudio. A única solução que fecha os três muda o hardware e o stack de software que a página tem autorização para ver, o que, na prática, significa outra máquina física, outra instalação de SO ou um browser remoto containerizado como o Browser.lol.

Pronto para teres um desktop completo em qualquer dispositivo?

Experimenta o Browser.lol grátis e sente a produtividade de um PC a partir do telemóvel.

Abrir o meu navegador desktop

Sem instalações • Funciona em qualquer dispositivo

Usado por mais de 250 000 profissionais
Compatibilidade total com desktop
Pronto num instante

Últimos artigos

Todos os artigos