Você entrou no modo anônimo. Você limpou os seus cookies. E o site continuou tratando você como o mesmo visitante que ele viu dez minutos atrás. Um dos motivos mais silenciosos para isso continuar acontecendo está no canto da sua tela: o indicador de bateria.
Durante boa parte da última década, qualquer site podia perguntar ao seu navegador exatamente quão carregado estava o seu notebook, com um número suspeitosamente preciso, e quantos segundos de vida ainda restavam. Leia esses números em dois sites diferentes com poucos instantes de diferença e você tinha o suficiente para concluir que os dois visitantes eram a mesma pessoa. O painel nesta página faz ao seu navegador essa mesma pergunta agora mesmo e mostra a resposta a você.
Os quatro números que a Battery Status API entrega
Chame navigator.getBattery() e você recebe de volta um objeto com quatro campos: level, de 0 a 1, charging, verdadeiro ou falso, chargingTime, em segundos até carregar por completo, e dischargingTime, em segundos até esvaziar. Nenhum número de série, nada que se pareça com um ID. É exatamente por isso que ele entrou nos navegadores no começo da década de 2010 sem muita resistência. O que um percentual de bateria poderia entregar, afinal?
Entropia, ao que parece. O dischargingTime sozinho cai em algum ponto de uma faixa de milhares de segundos de largura. Combine-o com um level já reportado com muitas casas decimais e você tem um valor que pouquíssimas outras pessoas na internet têm naquele exato segundo. Não é um nome. É um número raro o bastante para agir como um, por um curto período.
Como dois sites se encontram por meio disso
O mecanismo foi detalhado em 2015 por Olejnik, Acar, Castelluccia e Díaz, em um artigo chamado The leaking battery. A leitura é um identificador de reidentificação com prazo de validade. O Site A registra o seu level e o seu dischargingTime; um instante depois, o Site B registra quase o mesmo par; os dois podem ser cruzados sem que nenhum cookie mude de mãos. Isso sobrevive à limpeza dos cookies e a uma troca para a navegação privada, porque nada disso fica armazenado no navegador. É lido diretamente do hardware, do zero, toda vez que você pergunta.
A janela é curta. Os números vão mudando conforme a sua bateria descarrega, então a correspondência só se mantém por algo como trinta segundos a alguns minutos. Trinta segundos são de sobra para costurar dois carregamentos de página em um único visitante. Um ano depois do artigo, uma varredura de um milhão de sites feita por Princeton encontrou scripts de rastreamento reais já lendo a API na prática, ou seja, o ataque já havia saído do laboratório.
O truque da capacidade: extrair mAh do nada
Aqui está a parte que os outros artigos pulam. O sistema operacional calcula o level como charge_now / charge_full, dois inteiros nas unidades da própria bateria, microampère-hora em um notebook Linux típico. Ou seja, a fração que o seu navegador reporta não é arbitrária. É uma razão cujo denominador é a capacidade de carga total da sua bateria. O Firefox no Linux já entregou a razão bruta com precisão total, algo como 0.9301926, e a partir de uma leitura tão exata assim você pode inverter a fração e recuperar o denominador que está por baixo dela.
Esse denominador é a sua capacidade em mAh, e é um identificador melhor do que o nível jamais foi, porque a capacidade de carga total de uma bateria vai caindo aos poucos conforme ela envelhece. Ele é específico da sua célula física, no ponto de desgaste em que ela está. O Chromium moderno praticamente encerrou isso ao arredondar o level para um percentual inteiro, então o único denominador que você consegue extrair de volta é 100, e a capacidade real desaparece. O painel nesta página executa a reconstrução na sua leitura ao vivo e quase certamente vai reportar o valor como quantizado. Essa falha é a mitigação fazendo o seu trabalho.
Por que o Firefox simplesmente apagou tudo
A Mozilla não corrigiu a API de bateria. Ela a removeu, no Firefox 52, em 2017 — toda a superfície do navigator.getBattery desapareceu. A Apple nunca chegou a implementá-la no Safari. Essa é uma resposta drástica para um recurso web, e ela diz muito sobre como o mundo dos padrões passou a enxergar esse aqui: um vetor de rastreamento sem nenhum benefício para quem está sendo rastreado. O Chrome e o Edge ainda a carregam, agora restrita a páginas seguras de nível superior e arredondada para baixo, e a própria especificação hoje começa com um aviso de privacidade que ela não tinha em 2012. Se você estiver lendo isto no Firefox ou no Safari, o teste lá em cima volta limpo, porque não há nada ali para responder. A mesma divisão vale nos celulares: o Chrome no Android também expõe a leitura, enquanto o Safari no iOS e o Firefox para Android não entregam nada.
Nunca foi só a bateria
A bateria é apenas uma linha de uma lista mais longa que o seu navegador entrega a qualquer site que pedir, sem nenhum pedido de permissão em lugar nenhum. O navigator.hardwareConcurrency revela a quantidade de núcleos lógicos da sua CPU. O navigator.deviceMemory reporta a sua RAM, arredondada para uma potência de dois — por muito tempo limitada a 8 no desktop, embora o Chrome atual agora também entregue 16 e 32. O maxTouchPoints diz se você tem uma tela sensível ao toque. O adaptador WebGPU entrega o fabricante e a arquitetura da sua GPU em texto puro. Nenhum deles, sozinho, aponta diretamente para você. Empilhados, eles reduzem a multidão em que você está se escondendo a um punhado de pessoas, do mesmo jeito que a renderização de canvas e o processamento de áudio fazem nas nossas análises de canvas fingerprinting e audio fingerprinting. O painel de Hardware no scan completo do navegador mostra os valores exatos que o seu navegador está entregando agora mesmo.
O que realmente fazer a respeito
- Veja o que você vaza antes de presumir que está protegido. Rode o scan do navegador e leia os painéis de bateria e de hardware. Adivinhar o que você vaza não é a mesma coisa que olhar.
- O modo anônimo não ajuda aqui. A reconexão passa pelo hardware, não pelos cookies, então uma janela privada com a mesma bateria e a mesma GPU é o mesmo visitante. Vale lembrar disso em todo lugar onde você estava contando com ele.
- O Firefox e o Safari já fecham o vetor da bateria. Se você está no Chrome, manter-se atualizado é o que mantém o nível quantizado em vez de bruto.
- Se você faz malabarismo com várias identidades, deixe toda a história do hardware consistente. Falsificar um valor enquanto o resto discorda é justamente a contradição que os sistemas de fingerprinting procuram. O Incogniton monta cada perfil de modo que a bateria, a GPU, os núcleos e a memória que ele apresenta se alinhem como uma única máquina crível, em vez de uma pilha de contradições.
O indicador de bateria é uma coisa pequena para ter entregado tanta coisa. Aponte o seu próprio navegador para o scan e veja o que o seu ainda diz.