Strings de renderizador WebGL e sinais de hardware: quanto sua GPU diz sobre você

O hardware em que um navegador roda vaza para a página de várias pequenas maneiras. Nenhuma delas nomeia a máquina, mas, juntas, descrevem-na com precisão suficiente para distingui-la da maioria das outras.
A string do renderizador
O WebGL expõe uma extensão chamada WEBGL_debug_renderer_info com dois valores: o fabricante sem máscara e o renderizador sem máscara. No Windows com Chromium, o renderizador costuma ter este aspecto: ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11). Essa única linha informa o fabricante da GPU, o modelo exato, o id de dispositivo PCI, a API gráfica e o shader model, o que também é uma forte pista sobre o sistema operacional, porque essa string só existe no Windows.
O Firefox e o Safari, em momentos diferentes, mascararam ou generalizaram essa string; o Chromium a expõe. Um navegador que a mascara devolve um valor genérico, e um diagnóstico mostra “informações do renderizador mascaradas” em vez de adivinhar.
Contagens e tamanhos
navigator.hardwareConcurrency retorna o número de threads lógicas da CPU. navigator.deviceMemory retorna uma quantidade aproximada de RAM, arredondada para um pequeno conjunto de valores e limitada a 8 no Chromium, de modo que uma máquina com 32 GB informa 8. screen.width e screen.height dão o tamanho do monitor, availWidth e availHeight descontam a barra de tarefas, e devicePixelRatio revela a escala. screen.colorDepth é quase sempre 24. navigator.maxTouchPoints separa os dispositivos com toque dos demais.
Alguns desses valores têm um poder de identificação incomumente alto para o quão inocentes parecem. O número de threads tem apenas um punhado de valores comuns, mas é um dos campos aos quais um conhecido serviço comercial de fingerprinting dá muito peso, justamente por ser barato e estável. O tamanho da tela combinado com a proporção de pixels e a altura disponível reduz uma máquina mais do que um user agent.
Dispositivos de mídia
navigator.mediaDevices.enumerateDevices() retorna as câmeras, os microfones e os alto-falantes do sistema. Sem permissão, os navegadores modernos devolvem os tipos e as quantidades, mas com rótulos vazios; assim, a página fica sabendo “uma câmera, um microfone, uma saída” e nada mais. Conceder acesso a qualquer site revela os rótulos. Um diagnóstico que mostra só as quantidades se comporta como uma página sem permissão se comportaria.
O ângulo da consistência, de novo
Os sinais de hardware são onde a falsificação mais costuma dar errado. Um perfil que afirma ser um MacBook com um renderizador NVIDIA Direct3D, 24 threads e uma tela de 1366×768 descreve uma máquina que não existe. Os sites não precisam de um banco de dados para perceber isso; algumas regras bastam. Se um perfil altera qualquer um desses valores, precisa alterar todos para uma combinação que um dispositivo real realmente tem, e mantê-la assim entre as visitas.
O que verificar
Leia a string do renderizador e pergunte se ela corresponde ao sistema operacional do user agent. Leia o tamanho da tela e pergunte se corresponde à proporção de pixels e à altura disponível. Leia o número de threads e a memória e pergunte se o par é plausível para aquela GPU. Um diagnóstico dispõe esses dados lado a lado exatamente para isso; o julgamento é seu.


