Como um teste de privacidade não guarda nenhum dado

Um teste de privacidade é uma ferramenta que lhe mostra o que os sites podem saber sobre o seu navegador — sinais de canvas e GPU, fontes, ecrã, fuso horário, idioma, pistas de rede e os identificadores silenciosos que permitem a um site reconhecê-lo quando volta — e isso cria um problema de credibilidade: uma ferramenta que demonstra técnicas de vigilância é julgada também pelas suas próprias práticas de dados, que não podem ser uma página de política acrescentada depois. A regra de design por trás do nosso teste de impressão digital do navegador diz-se numa frase: se o navegador consegue lê-lo, o servidor nunca o vê. Este artigo explica o que essa regra custa, onde ela se dobra e onde para. Se quiser primeiro o inventário de sinais, comece por o que os sites sabem sobre si; este texto trata da canalização sob o teste, não dos sinais.

Primeiro o cliente

Cada sinal que o próprio navegador oferece é lido e apresentado localmente, na sua máquina, pelo código da página no seu separador. Renderização de canvas, cadeias do renderizador WebGL, propriedades do contexto de áudio, sondas de fontes instaladas, geometria de ecrã e janela, profundidade de cor, suporte tátil, estimativas de armazenamento, consultas de media sobre contraste e movimento: tudo é calculado onde é descoberto e desenhado na página que vê. O código da página é a única coisa que alguma vez tem o panorama completo. Nenhum script recolhe o painel numa carga, nenhum beacon o leva para casa e nenhum evento de analítica o resume, porque no momento em que uma impressão digital completa sai do navegador, o teste tornou-se aquilo contra o qual avisa.

Essa ordem — local primeiro, servidor por último, e servidor apenas para os poucos trabalhos que um navegador realmente não consegue fazer sozinho — não é uma característica da arquitetura; é a arquitetura. A maioria das ferramentas de privacidade é construída ao contrário: recolhem tudo centralmente e depois prometem apagá-lo, anonimizá-lo ou guardá-lo por pouco tempo. Essas promessas podem ser cumpridas, mas são promessas, e um leitor não consegue auditar uma eliminação. Um design que nunca transmite os dados substitui uma promessa por um facto sobre o caminho do código, e factos sobre caminhos de código podem ser verificados num separador de rede, que é exatamente o padrão que uma ferramenta de privacidade deve convidar.

O custo é real e aceite pelo design. Não há nada entre dispositivos: nenhuma conta que o siga, nenhum histórico que sincronize, nenhuma comparação com a sua impressão digital noutro portátil, porque tudo isso exige que o servidor guarde algo por pessoa. As comparações limitam-se ao que o seu próprio navegador recorda localmente e aos contadores diários anónimos descritos abaixo. Quando uma funcionalidade precisaria da impressão digital completa no servidor, a resposta não é uma política de retenção mais cuidadosa: é não. A restrição é o produto.

Três endpoints pequenos, três trabalhos diferentes

Três trabalhos realmente não podem ser feitos dentro da página, e cada um recebe o seu próprio endpoint pequeno com o seu trabalho estreito. O primeiro, /api/check/whoami, devolve apenas o que qualquer servidor já vê no pedido que trouxe a página: o seu endereço de rede tal como chegou, os cabeçalhos que o seu navegador enviou com ele e a geografia aproximada ligada a esse endereço. Mostrar-lhe esses valores não acrescenta exposição nova, porque cada servidor que visita os recebe quer os mostre quer não; o endpoint simplesmente transforma uma divulgação unidirecional numa visível, e não guarda nada para além da resposta.

O segundo, /api/check/etag, existe apenas para demonstrar o reconhecimento baseado em cache, explicado na secção seguinte: entrega um identificador de cache aleatório e não guarda absolutamente nada, nem uma tabela de valores emitidos nem um registo de quem perguntou. O terceiro é o endpoint de contadores: aceita um punhado de valores aproximados de uma execução terminada e devolve totais acumulados, para que a página possa dizer quão comum é a sua configuração sem que ninguém guarde a sua visita. Cada endpoint tem limite de ritmo como os outros verificadores do site, porque pequeno e honesto não é o mesmo que ilimitado, e um endpoint de demonstração que pode ser martelado é uma superfície de abuso com boa intenção.

A página também é explícita sobre os serviços externos que contacta diretamente a partir do seu navegador, porque esses serviços também veem o seu endereço e a honestidade sobre eles faz parte do design. O teste lê endpoints de rastreio da Cloudflare, consulta um serviço de eco DNS para revelar que resolvedor responde por si e abre ligações a dois servidores STUN públicos para mostrar o que uma consulta ao estilo WebRTC pode aprender. Cada um é nomeado na própria página, junto ao resultado que produz: a mesma disciplina de divulgação que aplicamos às verificações de fugas em fugas de VPN e verificações de disfarce. Um teste de privacidade que telefonasse em silêncio a terceiros chumbaria a sua própria lição.

O truque do ETag, explicado com honestidade

Um ETag é uma peça comum da cache HTTP: um servidor anexa um validador a uma resposta, o navegador guarda-o com a cópia em cache e, na visita seguinte, o navegador devolve o validador para que o servidor possa responder «não modificado» e poupar a transferência. O truque é que o validador não tem de descrever o conteúdo. Um servidor pode emitir um validador único para cada visitante, e o navegador devolverá fielmente esse valor único em cada revalidação, momento em que o servidor reconhece o navegador com a mesma fiabilidade de um cookie, sem nunca ter colocado um. A validação de cache funciona como identificador porque o navegador faz bem o seu trabalho.

É por isso que limpar cookies não o limpa: cookies e cache são armazenamentos separados, esvaziados por controlos separados e com calendários separados. E é por isso que uma janela privada ou anónima quebra o truque: uma janela privada funciona com a sua própria cache separada, que é descartada quando a janela fecha, por isso o validador morre com a sessão. O nosso endpoint demonstra a ida e volta e não guarda nada: o reconhecimento é provado pela própria resposta 304, pelo servidor a ver o seu próprio valor aleatório voltar, e não por qualquer registo guardado entre visitas. A demonstração termina no momento em que a página fecha, que é exatamente a propriedade que os rastreadores reais que usam esta técnica não oferecem.

Há um pormenor honesto que vale a pena nomear: a cache de borda. Se as respostas passassem por uma cache CDN partilhada, o identificador do primeiro visitante poderia ser servido a toda a gente, e a demonstração mostraria uma multidão a partilhar um ID em vez de cada navegador com o seu. Por isso este endpoint renuncia por completo à cache de borda: cada pedido chega à origem, cada visitante recebe um valor aleatório novo e nenhuma cache partilhada guarda nenhum. É uma linha pequena de configuração, mas é a diferença entre uma demonstração que prova o mecanismo e uma que acidentalmente prova o contrário.

Contadores em vez de registos

Uma pergunta precisa mesmo do servidor: «quão invulgar sou eu?» Uma página que pode dizer a sua GPU apareceu em N de M execuções hoje ensina muito mais do que uma que só lista sinais, porque a raridade é o que torna uma impressão digital identificadora. Mas respondê-la da maneira óbvia — registar cada visita e depois contar — constrói exatamente a base de dados contra a qual a ferramenta avisa. Por isso o teste guarda contadores em vez de registos: um número por valor e por dia. O sistema operativo, a família do navegador, a cadeia da GPU, o fuso horário, o primeiro idioma, a classe de tamanho do ecrã, os primeiros oito caracteres dos identificadores de impressão digital, o resultado de cada verificação individual e um escalão de duração: cada um contribui com uma marca para um total diário, e mais nada é guardado.

Os limites importam mais do que o mecanismo. A impressão digital completa nunca é enviada, muito menos guardada; o seu endereço nunca é enviado ao contador. Um contador não pode ser consultado ao contrário até chegar a uma pessoa, porque não há nenhuma linha por visitante para encontrar: a agregação acontece no momento da contagem, não depois como um passo de relatório sobre registos guardados. É a mesma razão pela qual os totais reiniciam por dia: um contador que se acumulasse para sempre, cortado fino o suficiente, tornar-se-ia silenciosamente uma base de dados de impressões digitais por acumulação, e o design rejeita essa deriva antecipadamente em vez de pedir desculpa depois.

Mais duas escolhas protegem quem nunca lerá este artigo. Os navegadores que enviam o sinal Global Privacy Control nunca são contados: o sinal significa «não me rastreies», e a sua leitura mais respeitosa é excluir essas execuções por completo em vez de contá-las com cuidado. Todos os outros têm uma opção visível de exclusão na página, respeitada antes de qualquer contagem acontecer. E uma execução que não termina em 45 segundos conta uma vez, como «presa», no seu próprio escalão: a lentidão e as falhas continuam visíveis para nós, enquanto operadores, como um único número agregado, sem seguir nenhum visitante individual através de uma execução falhada.

O que decidimos não construir

A parte mais instrutiva do design é a lista de coisas que ficaram de fora. Não há sonda ao nível da ligação: nem impressão digital TLS nem leitura ao estilo JA3 do seu handshake. A razão honesta é arquitetónica: o TLS deste site termina na CDN que está à frente dele, por isso uma leitura do handshake feita na nossa origem descreveria a negociação e as definições da CDN muito mais do que as do seu navegador. Publicá-la como «a sua impressão digital TLS» seria teatro: um valor plausível com o nome de outra pessoa. Uma ferramenta de privacidade que imprime uma leitura confiante mas errada ensina os seus utilizadores a confiar em leituras confiantes mas erradas em todo o lado, o que é pior do que um painel vazio.

A mesma disciplina moldou o resto das omissões. Os contadores são aproximados porque contadores finos se tornam uma base de dados de impressões digitais por acumulação, uma dimensão inocente de cada vez. A memória da última visita — «desde a sua última execução, estes valores mudaram» — vive apenas no armazenamento do seu próprio navegador, na sua máquina, e nunca é transmitida; no momento em que sincronizasse, seria um histórico, e um histórico é um registo. Funcionalidades que teriam sido realmente úteis foram cortadas pela mesma razão pela qual os endpoints se mantiveram pequenos: a utilidade não é uma defesa quando o custo em dados é todo o objetivo da ferramenta.

Por fim, a nota de honestidade residual, porque nenhum artigo de design deve terminar com os seus próprios elogios. Este design minimiza os dados; não pode tornar as leituras em si menos identificadoras. A sua GPU, as suas fontes, o seu ecrã e o seu fuso horário combinam-se em algo quase único, sejam guardados ou não: é essa a descoberta que a ferramenta existe para lhe mostrar. Não guardar dados protege-o de nós. Não o protege da técnica, e fingir o contrário seria a única funcionalidade verdadeiramente desonesta que poderíamos entregar.

Fontes e leituras adicionais

Perguntas frequentes

Posso verificar que não guardam nada?

Em grande parte, sim, e deve fazê-lo. Abra o separador de rede do seu navegador, execute o teste e observe o que sai da sua máquina: as leituras locais são apresentadas sem nenhum envio correspondente, e os únicos pedidos são os três endpoints nomeados e os serviços externos nomeados, com os valores estreitos que este artigo descreve. Uma afirmação de «sem registos» em qualquer site assenta, no fim, num comportamento do servidor que não pode ver, e é por isso que o design minimiza o que é enviado: o que nunca sai do seu navegador não pode ser registado, vendido ou divulgado por nós, para começar.

Porquê contar alguma coisa?

Porque a raridade é a lição. Uma lista dos seus sinais diz-lhe o que um site pode ler; «esta GPU apareceu em 12 de 4.000 execuções hoje» diz-lhe quão identificadora essa sinal é, que é a diferença entre uma curiosidade e um risco. A contagem manteve-se porque esse contexto importa, e foi moldada — valores aproximados, totais diários, agregação no momento da contagem — para que o contexto nunca exija um registo sobre si.

A exclusão apaga as minhas contagens passadas? E o que é o Global Privacy Control?

Não há nada por visitante para apagar. As contagens são agregados — um número por valor e por dia — sem nenhuma linha, identificador ou registo de visita ligado a si, por isso a exclusão para qualquer contagem futura das suas execuções, mas não pode subtrair uma marca que nunca esteve ligada a si; é essa a razão pela qual o sistema foi construído como contadores e não como registos. O Global Privacy Control (GPC) vai mais longe: é um sinal padrão — uma definição do navegador ou uma extensão, descrita em globalprivacycontrol.org — que diz a cada site «não vendas nem partilhes a minha informação pessoal». Vários navegadores oferecem-no como interruptor. Este teste respeita-o da forma mais forte: os navegadores que enviam GPC nunca são contados, sem necessidade de clique de exclusão.