Tem que ser muito paranoico pra navegar na internet sem javascript. Se a preocupação é rastreamento e anúncios basta usar um Adblock e pronto. É o que tenho feito durante anos.
É o Javascript que permite boa parte do fingerprinting que existe na Web. A requisição HTTP e o documento HTML são limitados a poucos recursos para tal (cabeçalhos HTTP, cookies, iframes/frames, HTTP refresh, etc), enquanto o JS tem uma tonelada de possibilidades (e as que listo abaixo não exigem permissões do usuário):
- Ausência ou presença de bateria via
navigator.getBattery()
, e no caso do último cenário, informações como nível e status (carregando, não carregando, etc) - Informações de GPU via WebGL.
- Hashing dos pixels de um canvas em modo 2D (
getContext("2d")
) após desenhar um texto fixo dentro do mesmo (cada navegador e cada S.O. vai renderizar fontes de formas específicas). - Número de núcleos de CPU (
navigator.hardwareConcurrency
) - Lista e nomes de plugins/extensões instaladas (
navigator.plugins
) - Resolução da tela (
screen.width
,screen.height
) e até mesmo posição e tamanho da taskbar (screen.availTop
,screen.availHeight
, etc) - No caso de computadores, cálculos com a movimentação do cursor pela página (aceleração, tremedeira, etc) via
document.onmousemove
- Detecção se o navegador foi minimizado (
window.onblur
) - Qual DNS resolver está sendo usado (Cloudflare? Google? etc)
- (Se não me engano) Dados de acelerômetro e giroscópio (não lembro se exigem permissão do usuário)
- (Edit 2 para adicionar alguns outros recursos importantes para um fingerprinting) Conexão em tempo-real com um servidor através de WebSocket e EventSource, o que permite o envio em tempo-real dos dados retornados por todos os recursos que mencionei.
- Fetch API, a versão moderna do depreciado
XMLHttpRequest
(mais conhecido como AJAX). - Pensando em algo mais sofisticado, o uso e abuso do Math.random() para tentar determinar a entropia da máquina (porque o Math.random() é uma função determinística dentro do V8)
- Uso do WebCrypto para hashear (por exemplo, em SHA) informações/dados de forma nativa, como que jogando todas as informações/dados anteriores em um “liquidificador binário” através de TypedArrays (como
UInt8Array
) e criando uma sequência final (o hash) para criar o fingerprint final que identifica o usuário.
Além dos recursos que exigem permissões, como WebBluetooth, WebSerial, Web USB, etc. Tais coisas não funcionam se não houver JS.
Adblockers (geralmente) não são focados em remover os recursos de fingerprinting que mencionei anteriormente. Talvez Ghostery e Brave? Mas mesmo com eles, ainda é possível lidar, por exemplo, com Canvas.getContext("2d").getPixelData(0,0,Canvas.width,Canvas.height)
(porque eu já testei em tal ambiente).
Edit: Ah, e esqueci de mencionar: o JS permite os chamados ServiceWorkers, programas em JS que ficam funcionando em segundo plano. Exemplo:
Quanto ao tópico, existem soluções para continuar usando o Google sem login de conta Google, sem CAPTCHAs e sem JS, uma delas é o SearXNG, um front-end de buscador decentralizado, gratuito e de código-fonte aberto (FLOSS) que conta com várias instâncias públicas. Testei duas instâncias e elas ainda conseguem fazer buscas mesmo sem JS:
Não sei se o SearXNG vai continuar funcionando no longo prazo, porque provavelmente eles fazem web scrapping da página (HTML) de resultados do Google, mas por enquanto é uma alternativa. Inclusive há instâncias públicas para a redes Onion e I2P também.
Eu particularmente tenho usado o Ecosia. Raramente vou no Google quando o Ecosia não consegue retornar resultados relevantes ao que estou procurando. Se Google agora está exigindo JS (ainda que eu não desabilite o JS no Google aqui no Brave), aí tem, significa que preciso passar a usar mais o SearXNG e similares e deixar de lado totalmente o prefixo :g (no Brave, e creio que em navegadores Chromium no geral, é possível usar prefixos para indicar qual buscador usar, tenho um também personalizado pro Marginalia, :mgn, um buscador que indica resultados na chamada “Web 1.0” composta pela tildespace, blogs antigos, arquivos de listas BBS, e afins).
Adeus a “melhoria progressiva”.
Meu amigo, que aula heim. Agradecido.
Seria legal ter um fork do FF que dê alguma maneira randomizasse essas informações de maneira que fingerprint sempre fosse diferente, mas não alterasse o resultado da função js de maneira significativa.
Ou melhor ainda: uniformizar o resultado, independentemente de qual seja o sistema operacional. O Skia (motor de renderização 2D), nos bastidores, utiliza parâmetros do sistema operacional para lidar com a tipografia, ao invés de implementar do zero a forma como lidar com fontes. Parte disso (e um obstáculo para tal implementação “do zero”) é porque o TrueType é um formato proprietário, além de possuir mecanismos de DRM (Digital Rights Management) que, entre outras características, impedem “extrações” do arquivo, então o Skia solicita ao S.O. para que desenhe e renderize um determinado texto em uma determinada fonte, e retorna o resultado ao software que está usando a API Skia (no caso, ao Chromium ou ao Firefox; ambos utilizam o Skia).
Com exceção de algumas fontes e de fontes Linux que usam o OpenType, quando a web solicita sans-serif
, serif
, monospace
ou cursive
, o resultado será a fonte padrão do S.O.: no Windows, fontes como Arial, Times New Roman, Courier New e Segoe Script, enquanto no Linux (a depender da distro e/ou de como os pacotes foram instalados e configurados) são fontes como DejaVu Sans, Liberation Serif e Ubuntu Mono (no Mac, desconheço, mas provavelmente são fontes proprietárias da Apple). O resultado disso inevitavelmente será diferença de renderização.
Uma solução seria definir uma fonte única, OpenType, por padrão, que venha incorporada dentro da biblioteca Skia, e que prontamente responderia às fontes-coringa serif
/sans-serif
/monospace
/cursive
, renderizando tais fontes “do zero” sem depender de chamadas ao S.O…
Porém, se o cliente (o software, ou no caso a página web) solicita uma fonte em específico (ex.: “Segoe UI Semibold”), aí renderizar do zero (extraindo os glifos diretamente do arquivo .ttf e renderizando de forma unificada dentro do Skia) resultaria em problemas legais (direitos autorais e etc) à desenvolvedora da Skia, que é a Google.
Nesse caso, entra sua solução: adicionar um pouco de entropia ao resultado. Só que essa entropia deveria vir de uma fonte mais próxima do TRNG (True Random Number Generator, em contraste ao PRNG, Pseudo Random Number Generator, que é determinístico em sua natureza) possível como crypto.getRandomValues
(que por sua vez parece, não tenho certeza, que usa fontes de entropia real tais como oscilações do termístor do processador).
A adição de entropia, porém, prejudicaria certas funcionalidades que exigem exatidão gráfica (por exemplo, editores de imagem online como Gravit Designer ou Canva ao abrir e interpretar um arquivo SVG). Desabilitar a funcionalidade de HTML5 Canvas como um todo prejudicaria boa parte dos sites na Web que hoje em dia utilizam HTML5 Canvas pra vários propósitos legítimos, e restringir seu uso à prévia aceitação do usuário (como acontece ao tentar exibir notificações ou solicitar câmera/microfone) tornaria a experiência de web ainda mais irritante aos usuários (pois toda hora apareceria a popup do Chromium/Firefox “O site tal-e-tal está pedindo pra usar Canvas. Aceitar ou recusar?”.
Infelizmente não parece ter uma solução viável enquanto o TrueType for algo proprietário e/ou enquanto os sistemas operacionais usarem fontes TrueType.
Todo esse desespero sendo que sua ISP já sabe tudo sobre você. Desperdício de energia e tempo…
O que minha provedora inevitavelmente sabe:
- Meu nome completo
- Meu endereço
- Outros dados pessoais (CPF, RG, blá blá blá)
- Em qual(is) instituição(ões) tenho conta (ao realizar o pagamento das faturas)
- Qual meu padrão diário de acesso à Internet (isto é, quais dias acesso mais, quais horários acesso mais, etc)
O que minha provedora poderia saber, com ressalvas:
- Quais e quantos dispositivos acessam através do GPON (endereços MAC, etc), algo que é relativamente ofuscado pelo NAT interno porque uso router próprio entre meus dispositivos e o router comodato da provedora, então aos olhos da provedora (TR-69), só um dispositivo acessa: um roteador que eles não têm acesso (porque os pacotes são encaminhados à WAN pelo IP e MAC do router).
- Quais domínios de Internet costumo acessar, se eu usasse o DNS do router comodato, o que não ocorre (porque uso DNS customizado, tanto configurado no meu router particular quanto nas configurações do meu computador/smartphone).
- Quais IPs estou solicitando conexão (exceto quando eu estou via Tor, I2P ou VPN, no que então os únicos IPs que eles verão será o de um entry node Tor ou de um VPN). Porém, mesmo sem VPN, muitos sites utilizam CloudFlare como proxy reverso, então aos olhos da provedora, estou acessando um proxy reverso da CloudFlare que é compartilhado por vários domínios e serviços diferentes.
O que a provedora não tem como saber (a menos que injetassem um MITM CA nos meus dispositivos, ou me obrigassem ao uso de um proxy deles):
- Quais URLs acesso (porque a maioria dos sites, caso não saiba, usam HTTPS e/ou QUIC, então o pacote TCP/UDP contendo a requisição, aos olhos da provedora, são um amontoado de payloads criptografados que exigiriam a chave privada de qualquer que seja o servidor que estou acessando naquele momento).
- Quais minhas preferências pessoais, com base naquilo que acesso/envio (porque, como mencionado, tudo é HTTPS hoje; e se eu uso VPN/Tor, piora a possibilidade de conseguir identificar conteúdo).
Quem (possivelmente) sabe os itens acima:
- Google (tanto através da indexação da Web, quanto através do uso do Android para acessar/enviar conteúdo na Internet)
- Microsoft (quando uso o Outlook)
- Mozilla (quando uso o Firefox tanto no PC quanto no Android)
- Brave Inc (nesse momento em que uso o Brave como navegador para acessar o Tecnoblog e escrever essa resposta)
- Huawei (a fabricante do router)
- Linux Foundation e afins
- Agências de inteligência nacionais e internacionais (através do Intel ME, XKeyscore, ECHELON, Five Eyes e afins; além disso, já usei/busquei termos no passado que possivelmente chamaram alguma atenção de SIGINTs (embora duvido que eu tenha um “agente humano” dedicado a me “espionar”), como informações sobre Plutônio na sonda Voyager e qual a massa crítica para meltdown em comparação à ogivas nucleares, rituais de invocação de forças primordiais cósmicas destrutivas como a de Cáli, o próprio uso (para fins de crítica) e ciência de termos referentes aos programas supramencionados de espionagem como XKeyscore e ECHELON, minha participação há bastante tempo atrás em fóruns/sites de teorias conspiratórias, etc).
Então, não, minha ISP não sabe “tudo” sobre mim. Nem eu mesmo sei “tudo” sobre mim, pra teres uma ideia. Às vezes me dá vontade de mandar um email à CIA, NSA e demais SIGINTs pedindo um relatório sobre mim, quem sabe assim eu consigo conhecer a mim mesmo (como diria Sócrates, conhece-te a ti mesmo) /s
Olha, não quero parecer rude, mas parece mais é um caso de mania de perseguição. Já tive familiar assim.
Uma observação: o /s no final é um indicador de sarcasmo, caso isso não tenha sido claro ali quando usei tal indicador de tom.
Dito isso, uma coisa é o conhecimento factual e técnico sobre como telemetria, espionagem e fingerprinting podem ocorrer (e ali explico como isso pode ocorrer), outra coisa é mania de perseguição, achar que está sendo perseguido a todo momento, que foi o que você mencionou aí em sua postagem.
Os pontos técnicos são baseados em conceitos relativamente bem documentados. Quanto ao item “agências de inteligência” e os termos/programas mencionados, os relatos de Edward Snowden e documentos oficiais sob o FOIA (Freedom of Information Act) estão também à disposição para consulta pública na web.
Surgiu uma dúvida. Se eu usar um router particular, misturando todos os aparelhos por esse único dispositivo, tornaria os anúncios menos precisos/invasivos?
Isso já meio que acontece quando um domicílio ou escritório usa um provedor de internet: o tráfego de internet de todo mundo da residência/escritório estará sob o mesmo endereço IP, o endereço IP atualmente atribuído pela provedora àquela conexão de internet (geralmente um IP dinâmico).
O meu uso de um router particular entre meus dispositivos e o router sob comodato (ONU/ONT) tem mais a ver com o TR-069 da provedora do que com as big techs.
O TR-069 é um protocolo que as provedoras usam para atualizar o firmware dos ONTs/ONUs, bem como para solucionar problemas de conectividade do cliente, sem precisar encaminhar um técnico à localidade. Só que esse protocolo dá acesso às funções administrativas do aparelho, o que inclui listar as atuais atribuições de DHCP (assim sabendo quais dispositivos estão atualmente conectados) e mudar configurações (como setar outro DNS). Não tem como saber quando um TR-069 está sendo acessado.
Como o TR-069 não se estende aos routers conectados ao ONT/ONU (principalmente se estiver LAN->WAN), porque o acesso ao painel de administração exige login e senha que podem ser alterados em um router particular, um router “no meio” efetivamente isola os dispositivos da provedora (também fornece alguma proteção se a função de DMZ ou de port forwarding forem ativadas no ONU/ONT, porque a exposição de portas/rede local não conseguirá ocorrer por conta do “roteador do meio”).
E é só pra isso mesmo: barreira contra acesso não-autorizado da provedora e contra exposição acidental da rede local à Internet. Os anunciantes vão traçar seu perfil através do client-side, seja pelo app, pela página da web (através do uso de JS para determinar um identificador único, como expliquei tecnicamente no meu primeiro comentário) ou por recurusos integrados ao sistema operacional (como Windows e Android têm toneladas de telemetria embutida, que vão não só pra Microsoft/Google mas também para os vários “sponsors”).
Edit pra acrescentar um outro detalhe: tendo um “router do meio”, conectado de forma que a LAN do ONU/ONT está conectada via Ethernet ao WAN do seu router, você tem efetivamente uma rede dentro da rede e seu router passa a ser o gateway (e não mais o ONU/ONT). Assim sendo, você consegue configurar seu próprio DHCP, com um DNS de sua preferência (algo que você precisaria acessar o painel administrativo do router da provedora para alterar, o que geralmente é bloqueado). Daí você pode, por exemplo, usar um DNS que já faz o bloqueio de domínios de anúncios, como o NextDNS. Sozinho, ele não bloqueia todos os anúncios, mas dá conta de bloquear CDNs especificamente propositados a servir anúncios (como o domínio DoubleClick), o que já alivia um pouco o trabalho de front-end do uBlock Origin / ABP / Ghostery / etc.
Agora vocês vão descobrir o fabuloso mundo do TamperMonkey e do ViolentMonkey ( que é uma extensão que você vai instalar no seu navegador e dentro dela você roda scripts que vão te fazer feliz )
Uma mísera pedrinha que atrapalha tudo.
Não entendo muito da parte de renderização, mas para mim parece um contra senso um site público usar uma fonte truetype e não ser permitido que os motores possam extrair e renderiza livremente.
A ONU em modo bridge em conjunto com um router particular pode repassar os comando do protocolo TR-69 para o router e extrair alguma informação dele? Acredito que não por não ter acesso ao login dele, mas é só tira a pulga atrás da orelha…
O que falei nem sobre o javascript nem foi muito focado na questão de privacidade mas na questão a a web dinâmica de hoje funciona a partir dele e navegar sem isso é bastante limitante. Você pode ver pelos diversos pontos que vc citou que é responsabilidade do javascript. Acho que o melhor a se fazer é buscar um equilíbrio entre privacidade e praticidade. Um bom combo de adblock, dns e vpn já resolve boa parte.
A princípio não. Não é questão de login e senha do roteador, precisa estar parametrizado nas configurações dele para poder ter o acesso. Se o roteador foi você quem configurou do zero, não há como ter acesso sem ter configurado os parâmetros de TR-069.