As defesas anteriores contra leitura de tela por IA operavam na camada de pixel — ruído aleatório, perturbação no domínio de frequência, jitter sub-pixel, micro desfoque, deslocamentos cromáticos. Elas ainda são eficazes contra motores OCR clássicos e permanecem parte da defesa em camadas. Mas os Modelos de Visão-Linguagem modernos — GPT-4V, Claude Vision, Gemini e seus sucessores — têm codificadores de patch cientes de tokenizador que reconstroem progressivamente palavras a partir de evidências visuais parciais. Os pixels podem ser ruidosos e o modelo ainda recupera o texto subjacente.
A próxima superfície de ataque fica uma camada acima: o DOM. Dentro do navegador headless que renderiza a página protegida, possuímos os dados reais de caracteres sendo pintados na tela. Podemos decidir que a letra na posição 47 do terceiro parágrafo não é mais a original; ela é um caractere visualmente semelhante, mas diferente, do mesmo alfabeto. O OCR ou VLM que olha para uma captura de tela dessa página vê o caractere substituído e o reporta como verdade. O modelo não sabe que foi substituído; ele não tem nada para comparar.
A parte difícil é fazer isso sem quebrar a leitura para o usuário humano. O mecanismo de revelação — uma pequena área ao redor do cursor que inverte o texto substituído de volta ao original — é a resposta. As pessoas leem olhando: o olho se fixa em uma frase, o reconhecimento de padrões do cérebro preenche o restante a partir da visão periférica mais o contexto. A revelação do cursor se alinha com onde o usuário está realmente olhando; o resto da página pode permanecer substituído porque o usuário não está lendo caractere por caractere de qualquer forma. Um modelo de IA olhando para a mesma captura de tela não tem esse cursor, não tem essa revelação — ele lê tudo como texto substituído.
Um script é injetado em cada página protegida pelo navegador headless do ZeroLeak. Na inicialização, o script percorre o DOM, escolhe substitutos visualmente semelhantes para uma porção das letras do mesmo alfabeto latino e os escreve na página. A posição do cursor orienta uma zona de revelação — onde quer que o usuário esteja olhando, os originais aparecem. Tudo fora da revelação permanece substituído.
Um caractere em uma posição na página se torna outro caractere que parece visualmente semelhante, mas é uma letra diferente — a transformado em e, b transformado em p, m transformado em w, n transformado em u. A troca é entre letras que compartilham uma família visual no alfabeto latino, não entre caracteres Unicode de aparência semelhante. Por que essa distinção importa: os pipelines de OCR e visão de IA normalizam homóglifos Unicode (Cirílico а se torna Latino a) de volta ao latino canônico. As substituições do mesmo script não deixam nada para o normalizador desfazer — o modelo lê o caractere substituído como a letra real.
Onde quer que o usuário mova o cursor, uma área ao redor dele (círculo por padrão, configurável como banda horizontal) inverte os caracteres substituídos de volta aos originais. O usuário lê onde olha; o reconhecimento de padrões natural do cérebro cuida do restante a partir da visão periférica. Fora da revelação, a página permanece substituída — que é o que um modelo de IA olhando para a captura de tela vê.
Quando a página carrega, cada letra substituída recebe uma substituição específica que permanece estável durante a vida útil da página. Não há cintilação, não há rotação temporal, não há animação na visão do usuário — o cipher fica silenciosamente atrás da revelação do cursor. Um design anterior rotacionava o cipher a cada poucos frames; testes de fadiga do usuário mostraram que causava desconforto de leitura mensurável, então o design final permanece estático.
O text cipher opera dentro do DOM do navegador headless — diretamente nos dados de caracteres, não nos pixels renderizados. As defesas da camada de pixel contra modelos de visão de IA continuam funcionando por baixo; o text cipher adiciona uma superfície de ataque ortogonal que as técnicas de recuperação de pixel não conseguem ajudar. Um atacante que quebra a camada de pixel ainda tem que ler o texto substituído corretamente. Um atacante que de alguma forma recuperou os caracteres originais ainda tem que vencer a camada de pixel.
Cada comportamento abaixo faz parte do design de produção após a revisão empírica de fadiga; a implementação ao vivo corresponde exatamente a isso. A configuração é por serviço protegido via console do operador.
As substituições ficam dentro do alfabeto latino. A tabela de substituição é curada por família visual: tigelas redondas (a, e, o, c), tigelas espelhadas (b, p, d, q), verticais estreitas (i, l, j, 1), arcos (m, n, u, h, w), descendentes (g, y, j, q). Cada letra na tabela tem 2-4 vizinhos visuais; a substituição escolhe um deles. A correspondência de largura é favorecida para que o reflow de layout não ocorra.
A forma padrão é um círculo de raio configurável (200 px por padrão). Uma forma alternativa de banda cobre uma faixa horizontal na altura do cursor — útil para leitura de conteúdo com linhas longas onde o movimento do olho é principalmente horizontal. A forma é compartilhada com outros efeitos baseados em cursor do ZeroLeak para que os operadores configurem uma vez.
Quando o script vê pela primeira vez um nó de texto, ele armazena o valor original em um mapa por nó e escreve o valor substituído no DOM. Atualizações subsequentes usam a mesma substituição — não há rotação por frame. O usuário percebe uma página estática; o cipher é invisível atrás da revelação do cursor.
O script de substituição é injetado pelo motor ZeroLeak em cada documento navegado dentro do Chromium headless. A aplicação web protegida não é modificada; o cipher opera como um auxiliar do lado da página entre o documento renderizado e a camada de visualização do usuário. Nenhuma coordenação com o código da aplicação protegida é necessária.
O texto que o usuário digita em inputs, textareas ou regiões contentEditable é excluído da substituição. A aplicação protegida recebe entrada limpa conforme o usuário escreveu. Caixas de busca, composição de mensagens, envio de formulários — todos não são afetados.
Um IntersectionObserver rastreia quais nós de texto estão realmente visíveis. O texto fora da tela não é substituído (o usuário não consegue vê-lo de qualquer forma). Quando o usuário rola uma seção oculta para a visualização, a substituição é aplicada a tempo. Isso mantém o custo de execução proporcional ao que está na tela, não ao tamanho total da página.
A substituição visual do mesmo script é o coração da técnica. A tabela abaixo é uma amostra do mapeamento real de produção; a tabela completa cobre todas as minúsculas, maiúsculas e dígitos selecionados.
Esses quatro caracteres compartilham a forma de tigela fechada; substituir um pelo outro preserva a silhueta na distância de leitura. Uma palavra como 'data' pode se tornar 'doto' na forma substituída — um humano olhando através da revelação do cursor lê 'data' instantaneamente, um OCR ou modelo de IA lendo a forma substituída retorna 'doto'.
Esses quatro são espelhos visuais uns dos outros; substituir um pelo outro preserva o padrão de haste vertical + tigela. A palavra 'database' pode se tornar 'patabose' na forma cipher — visualmente próximo o suficiente para que o reconhecimento de padrões do cérebro recupere o original, semanticamente não relacionado o suficiente para que um modelo de IA lendo retorne a palavra errada.
Esses cinco compartilham o padrão de arco / arco invertido / arco repetido; a substituição dentro dessa família preserva o ritmo geral do texto. 'human' pode se tornar 'wuwon' — legível de relance sob o cursor, irreconhecível para uma IA lendo o texto substituído.
Propostas anteriores usavam confusables Unicode (Cirílico а para Latino a, Grego ο para Latino o). Estas foram rejeitadas porque os pipelines de OCR e modelos de visão de IA normalizam esses de volta ao latino canônico durante seus estágios de modelo de linguagem. Um 'а' Cirílico inserido em texto latino é dobrado de volta a um 'a' latino regular — a substituição não deixa rastro. A substituição latina do mesmo script (a transformado em e) não tem nada para normalizar; o caractere substituído é a letra canônica que o modelo lê.
O texto renderizado dentro de HTML5 canvas ou SVG não faz parte do conjunto de nós de texto DOM; o cipher não o toca. Da mesma forma, o texto que o usuário digita em inputs e textareas permanece limpo. Essas lacunas de cobertura são deliberadas: o conteúdo de canvas e SVG é tratado pelas defesas da camada de pixel em paralelo, e a entrada de formulário deve permanecer limpa para que a aplicação protegida funcione.
Usuários com assistentes de IA pessoais no telefone ou ao lado da estação de trabalho — qualquer um pode colar uma captura de tela no GPT-4V ou Claude Vision e pedir para resumir. Com o text cipher ativo, o resumo da IA é construído sobre o texto substituído — ele retorna saída de aparência plausível que é, na inspeção, diferente do que estava na tela original.
Documentos lidos na tela, mas não destinados a serem exfiltrados por meio de uma ferramenta de IA. Uma captura de tela tirada e alimentada em uma IA para análise retorna números distorcidos e nomes alterados — a IA relata com confiança conteúdo que não corresponde ao documento real.
Profissionais médicos com acesso somente de visualização a prontuários de pacientes não conseguem usar de forma significativa uma IA externa para resumir ou consultar os dados — a IA vê texto substituído. O insight clínico permanece dentro do ambiente protegido; o caminho de ingestão de IA retorna um documento diferente.
Conteúdo classificado visualizado por analistas. Qualquer ferramenta de IA consultada de fora do ambiente protegido lê texto substituído, não o material classificado original. O limite de divulgação se mantém no caminho de ingestão de IA da mesma forma que se mantém no caminho de captura de tela.
Carregaremos uma página, moveremos o cursor sobre o texto para você ver a leitura normal, tiraremos uma captura de tela e alimentaremos a captura de tela no Tesseract, GPT-4V e Claude Vision — e mostraremos o texto muito diferente que cada um retorna.