Les défenses antérieures contre la lecture d'écran par IA opéraient au niveau de la couche de pixels — bruit aléatoire, perturbation dans le domaine fréquentiel, gigue sous-pixel, micro-flou, décalages chromatiques. Elles restent efficaces contre les moteurs OCR classiques et font partie de la défense en couches. Mais les modèles de vision-langage modernes — GPT-4V, Claude Vision, Gemini et leurs successeurs — disposent d'encodeurs de patches avec conscience des tokens qui reconstruisent de mieux en mieux les mots à partir de preuves visuelles partielles. Les pixels peuvent être bruités et le modèle récupère toujours le texte sous-jacent.
La prochaine surface d'attaque se trouve une couche au-dessus : le DOM. À l'intérieur du navigateur headless qui rend la page protégée, nous possédons les données de caractères réelles peintes sur l'écran. Nous pouvons décider que la lettre à la position 47 du troisième paragraphe n'est plus l'original ; c'est un caractère visuellement proche mais différent du même alphabet. L'OCR ou le VLM qui regarde une capture d'écran de cette page voit le caractère substitué et le rapporte comme la vérité. Le modèle ne sait pas qu'il a été substitué ; il n'a rien à comparer.
La partie difficile consiste à faire cela sans gêner la lecture pour l'utilisateur humain. Le mécanisme de révélation — une petite zone autour du curseur qui remet le texte substitué à l'original — est la réponse. Les gens lisent en regardant : l'œil se fixe sur une phrase, le pattern recognition du cerveau complète le reste à partir de la vision périphérique et du contexte. La révélation par curseur s'aligne avec l'endroit où l'utilisateur regarde réellement ; le reste de la page peut rester substitué car l'utilisateur ne le lit pas de toute façon caractère par caractère. Un modèle IA regardant la même capture d'écran n'a pas un tel curseur, pas une telle révélation — il lit tout comme le texte substitué.
Un script est injecté dans chaque page protégée par le navigateur headless de ZeroLeak. Au démarrage, le script parcourt le DOM, choisit des substituts visuellement proches pour une partie des lettres du même alphabet latin, et les écrit dans la page. La position du curseur pilote une zone de révélation — partout où l'utilisateur regarde, les originaux apparaissent. Tout ce qui est en dehors de la révélation reste substitué.
Un caractère à une position de la page devient un autre caractère qui ressemble visuellement mais est une lettre différente — a transformé en e, b transformé en p, m transformé en w, n transformé en u. La substitution est entre des lettres qui partagent une famille visuelle dans l'alphabet latin, pas entre des sosies Unicode. Pourquoi cette distinction est importante : les pipelines OCR et de vision IA normalisent les homoglyphes Unicode (le а cyrillique devient le a latin) vers le latin canonique. Les substitutions au sein du même alphabet ne laissent rien à normaliser — le modèle lit le caractère substitué comme la lettre réelle.
Partout où l'utilisateur déplace le curseur, une zone autour de lui (cercle par défaut, configurable comme bande horizontale) remet les caractères substitués à leurs originaux. L'utilisateur lit là où il regarde ; le pattern recognition naturel du cerveau gère le reste à partir de la vision périphérique. En dehors de la révélation, la page reste substituée — ce qu'un modèle IA regardant la capture d'écran voit.
Lorsque la page se charge, chaque lettre substituée reçoit un remplacement spécifique qui reste stable pour la durée de vie de la page. Il n'y a aucun scintillement, aucune rotation temporelle, aucune animation dans le champ de vision de l'utilisateur — le cipher se tient silencieusement derrière la révélation par curseur. Une conception antérieure faisait tourner le cipher toutes les quelques images ; les tests de fatigue des utilisateurs ont montré que cela causait un inconfort de lecture mesurable, donc la conception finale reste statique.
Text Cipher opère à l'intérieur du DOM du navigateur headless — directement sur les données de caractères, pas sur les pixels rendus. Les défenses au niveau des pixels contre les modèles de vision IA continuent de fonctionner en dessous ; Text Cipher ajoute une surface d'attaque orthogonale que les techniques de récupération de pixels ne peuvent pas aider. Un attaquant qui perce la couche de pixels doit toujours lire correctement le texte substitué. Un attaquant qui récupère d'une façon ou d'une autre les caractères originaux doit toujours vaincre la couche de pixels.
Chaque comportement ci-dessous fait partie de la conception de production après la révision empirique de la fatigue ; l'implémentation en production correspond exactement à ceci. La configuration se fait par service protégé via la console opérateur.
Les substitutions restent à l'intérieur de l'alphabet latin. La table de substitution est éditée par famille visuelle : cavités rondes (a, e, o, c), cavités en miroir (b, p, d, q), verticales étroites (i, l, j, 1), arches (m, n, u, h, w), descendantes (g, y, j, q). Chaque lettre de la table a 2-4 voisins visuels ; la substitution en choisit un. L'appariement des largeurs est favorisé pour que la mise en page ne se déplace pas.
La forme par défaut est un cercle de rayon configurable (200 px par défaut). Une forme de bande alternative couvre une bande horizontale à la hauteur du curseur — utile pour lire du contenu à longues lignes où le mouvement des yeux est principalement horizontal. La forme est partagée avec d'autres effets ZeroLeak basés sur le curseur, les opérateurs configurent donc une fois.
Lorsque le script voit pour la première fois un nœud de texte, il stocke la valeur originale dans une map par nœud et écrit la valeur substituée dans le DOM. Les mises à jour ultérieures utilisent la même substitution — il n'y a pas de rotation par image. L'utilisateur perçoit une page statique ; le cipher est invisible derrière la révélation par curseur.
Le script de substitution est injecté par le moteur ZeroLeak dans chaque document navigué à l'intérieur de Chromium headless. L'application web protégée n'est pas modifiée ; le cipher s'exécute comme un assistant côté page entre le document rendu et la couche de visualisation de l'utilisateur. Aucune coordination avec le code de l'application protégée n'est requise.
Le texte que l'utilisateur saisit dans les inputs, les textareas ou les régions contentEditable est exclu de la substitution. L'application protégée voit une saisie propre telle que l'utilisateur l'a écrite. Les champs de recherche, la composition de messages, la soumission de formulaires — tous ne sont pas affectés.
Un IntersectionObserver suit quels nœuds de texte sont réellement visibles. Le texte hors écran n'est pas substitué (l'utilisateur ne peut de toute façon pas le voir). Lorsque l'utilisateur fait défiler une section cachée dans le champ de vision, la substitution est appliquée juste à temps. Cela maintient le coût d'exécution proportionnel à ce qui est à l'écran, pas à la taille totale de la page.
La substitution visuelle au sein du même alphabet est au cœur de la technique. La table ci-dessous est un échantillon du mapping de production réel ; la table complète couvre l'intégralité des minuscules, majuscules et chiffres sélectionnés.
Ces quatre caractères partagent tous la forme de cavité fermée ; substituer l'un pour l'autre préserve la silhouette à distance de lecture. Un mot comme 'data' pourrait devenir 'doto' sous la forme substituée — un humain y jetant un coup d'œil à travers la révélation du curseur lit 'data' instantanément, un moteur OCR ou un modèle IA lisant la forme substituée retourne 'doto'.
Ces quatre sont des miroirs visuels les uns des autres ; substituer l'un pour l'autre préserve le pattern tige verticale + cavité. Le mot 'database' pourrait devenir 'patabose' sous forme de cipher — visuellement assez proche pour que le pattern recognition du cerveau récupère l'original, sémantiquement sans rapport pour qu'un modèle IA qui le lit retourne le mauvais mot.
Ces cinq partagent le pattern arche / arche inversée / arche répétée ; la substitution au sein de cette famille préserve le rythme général du texte. 'human' pourrait devenir 'wuwon' — lisible d'un coup d'œil sous le curseur, méconnaissable pour une IA lisant le texte substitué.
Des propositions antérieures utilisaient des confusables Unicode (а cyrillique pour le a latin, ο grec pour le o latin). Celles-ci ont été rejetées car les pipelines OCR et les modèles de vision IA normalisent ces caractères vers le latin canonique au cours de leur phase de modèle de langage — Tesseract avec un pack de langue russe sur du texte mixte latin-cyrillique retourne une sortie latin propre, car la deuxième passe du modèle de langage projette les homoglyphes cyrilliques sur leurs équivalents latins. La substitution au sein du même alphabet ne laisse rien à normaliser.
Le texte rendu à l'intérieur d'un canvas HTML5 ou SVG ne fait pas partie de l'ensemble des nœuds de texte DOM ; le cipher ne le touche pas. De même, le texte que l'utilisateur saisit dans les inputs et textareas reste propre. Ces lacunes de couverture sont délibérées : le contenu canvas et SVG est géré par les défenses au niveau des pixels en parallèle, et la saisie de formulaire doit rester propre pour que l'application protégée fonctionne.
Les utilisateurs avec des assistants IA personnels sur leur téléphone ou à côté de leur poste de travail — n'importe qui peut coller une capture d'écran dans GPT-4V ou Claude Vision et lui demander de résumer. Avec Text Cipher en place, le résumé IA est construit sur le texte substitué — il retourne une sortie plausible qui, à l'inspection, diffère de ce qui était sur l'écran original.
Documents lus à l'écran mais non destinés à être exfiltrés via un outil IA. Une capture d'écran transmise à une IA pour analyse retourne des chiffres brouillés et des noms altérés — l'IA rapporte avec assurance un contenu qui ne correspond pas au document réel.
Le personnel médical disposant d'un accès en lecture seule aux dossiers patients ne peut pas utiliser de manière significative une IA externe pour résumer ou interroger les données — l'IA voit du texte substitué. Les informations cliniques restent dans l'environnement protégé ; le chemin d'ingestion IA retourne un document différent.
Contenu classifié consulté par des analystes. Tout outil IA consulté depuis l'extérieur de l'environnement protégé lit du texte substitué, pas le matériel classifié original. La limite de divulgation tient sur le chemin d'ingestion IA de la même façon qu'elle tient sur le chemin de capture d'écran.
Nous chargerons une page, déplacerons le curseur sur le texte pour que vous voyiez une lecture normale, prendrons une capture d'écran et la transmettrons à Tesseract, GPT-4V et Claude Vision — et vous montrerons le texte très différent que chacun retourne.