Symboles EVE et évitement

Les filtres attrapent des mots, mais les gens qui veulent passer un filtre tapent rarement le mot en clair. Ils remplacent un a latin par un cyrillique, habillent les lettres en Unicode fantaisiste, enveloppent une insulte dans des entités HTML, saupoudrent de la ponctuation entre chaque lettre, ou se tournent vers les emojis à la place des mots. EVE, le moteur de correspondance de motifs derrière le filtre de chat de Verité, dispose d’une couche dédiée pour défaire ces astuces avant qu’un message ne soit jamais testé contre une règle.

Cette page couvre deux systèmes liés :

  • La gestion des symboles et des glyphes, y compris la table de repli des caractères confusables qui ramène les caractères sosies à des lettres en clair, et les tableaux de symboles d’emojis qui attrapent le sens codé porté entièrement par des pictogrammes.
  • Les passes d’évitement qui normalisent un message avant la correspondance : repli des homoglyphes, suppression des entités, désobfuscation, segmentation et empreinte.

Pour le langage de motifs lui-même, voir Le langage EVE. Pour un compte rendu honnête de ce que cette couche ne peut pas faire, lisez Limitations.

Comment la normalisation s’insère

Lorsqu’un message arrive, EVE ne fait pas correspondre les règles contre le texte brut. Il étend d’abord le message en un petit ensemble de chaînes candidates normalisées, puis teste les règles contre celles-ci. Un seul message devient plusieurs lectures : une qui replie chaque caractère confusable vers sa forme en clair, d’autres qui gardent un caractère ambigu tel quel, et ainsi de suite. Si un candidat quelconque correspond à une règle, le message est attrapé.

C’est le mécanisme qui permet à un seul motif rédigé, écrit en ASCII brut, d’attraper un mot épelé avec des lettres grecques, cyrilliques, pleine largeur ou mathématiques, sans que l’auteur ne liste jamais ces orthographes.

La table de repli des confusables

Le cœur de la gestion des symboles est la table de repli : une association d’une source confusable vers les interprétations en clair vers lesquelles elle peut se replier. Une source est une séquence brute d’un ou plusieurs points de code Unicode. Une cible est la chaîne en clair vers laquelle elle se replie, qui peut être un seul caractère, plusieurs caractères (le s dur se replie en ss), ou la chaîne vide, ce qui signifie que la source est supprimée purement et simplement.

La table est chargée une fois depuis un fichier de données d’exécution compilé à partir d’un corpus de confusables. Lorsqu’aucune table n’est chargée, un message se replie uniquement sur lui-même sous la mise en minuscules ASCII, de sorte que le repli se dégrade en toute sécurité plutôt que d’échouer.

La correspondance est du plus long d’abord

À chaque position dans le message, EVE cherche la source la plus longue de la table qui y correspond, préférant plus d’octets afin qu’une construction multi-caractères l’emporte sur son premier caractère seul. C’est ainsi qu’une lettre en art ASCII bâtie à partir de plusieurs caractères, ou une séquence d’emoji à plusieurs points de code, est reconnue comme une unité plutôt que comme ses morceaux individuels.

Une source, plusieurs lectures

Un confusable n’est pas toujours sans ambiguïté. Une source peut porter plusieurs cibles, et chacune est traitée comme une lecture distincte. Lorsqu’une source a plus d’une interprétation activée, EVE crée un nouveau candidat pour chacune, et garde aussi la lecture d’origine intacte aux côtés des repliées. Cela importe : replier un caractère vers une lettre est une supposition, et garder la lecture d’origine signifie qu’un usage innocent de ce caractère n’est pas silencieusement réécrit en une correspondance.

La seule exception est un caractère dont l’interprétation canonique est la suppression. Une source qui se replie canoniquement en la chaîne vide, tel qu’un liant de largeur nulle ou un autre caractère invisible, est retirée et ses octets d’origine ne sont pas ressuscités.

Niveaux de provenance

Tous les replis ne sont pas également dignes de confiance. Chaque cible porte un niveau qui enregistre d’où vient l’association, du plus autoritaire au plus agressif :

Niveau Signification
Noyau autoritaire Repli canonique Unicode et de sécurité, toujours sûr à appliquer.
Normalisation Repli de normalisation canonique, toujours sûr à appliquer.
Texte documenté Symboles porteurs de texte avec une lecture en clair documentée.
Agressif recommandé Sosies plus lâches recommandés pour le repli agressif.
Visuel agressif Sosies visuels sous repli agressif.
ASCII agressif Sosies ASCII sous repli agressif.
Visuel hérité, ASCII hérité Alias reportés d’une table antérieure.
Translittération Translittération sémantique d’écriture.
Visuel de police (strict, standard, exploratoire) Sosies trouvés en balayant des polices rendues, du plus serré au plus lâche.
Paire ASCII de police (standard, exploratoire) Sosies ASCII trouvés en balayant des polices rendues.

Les deux niveaux canoniques, noyau autoritaire et normalisation, sont toujours appliqués. Tout autre niveau est heuristique à un certain degré et n’est activé que lorsque le repli agressif est activé. Un masque de niveau permet aux interprétations agressives d’être activées ou supprimées indépendamment des sûres.

Les niveaux sont aussi essayés dans l’ordre, du plus digne de confiance d’abord. EVE plafonne jusqu’où un seul message peut se déployer en candidats afin qu’un message conçu ne puisse pas faire exploser l’ensemble de candidats. Lorsque ce plafond est atteint, les candidats survivants privilégient les lectures canoniques, car celles-ci ont été générées en premier.

La suppression n’est qu’un autre repli

Retirer un caractère invisible et replier un sosie sont la même opération. Un caractère qui se replie en la chaîne vide est supprimé ; un caractère qui se replie en une lettre en clair est réécrit. Les deux vivent dans une seule table, il n’y a donc pas de liste distincte de caractères à retirer.

Classes de caractères dans les motifs

Séparément de la table de repli, les motifs EVE peuvent nommer leurs propres classes : un ensemble nommé de fragments interchangeables qu’un motif référence par son nom. Une classe est définie une fois et réutilisée, de sorte qu’un motif peut, par exemple, traiter toute voyelle comme interchangeable à une position. C’est ainsi qu’un auteur écrit la tolérance à la variation orthographique directement dans une règle, distincte du repli automatique des confusables décrit ci-dessus.

La correspondance relâchée utilise aussi une classe de voyelles intégrée, permettant à un motif de tolérer les substitutions de voyelles courantes telles que les échanges leetspeak sans que l’auteur n’énumère chacune.

Les classes sont un outil de rédaction pour la variation orthographique à l’intérieur d’une règle. La table de repli est une passe à l’échelle du moteur qui s’exécute sur chaque message avant qu’aucune règle ne soit testée. Elles se complètent : la table de repli associe un caractère fantaisiste à un en clair, et une classe permet à la règle en clair d’accepter plusieurs orthographes en clair.

Tableaux de symboles : emojis et iconographie

Certains contenus ne portent aucune lettre du tout. Un seul emoji, ou une paire ordonnée d’emojis, peut tenir lieu d’une phrase. EVE gère cela avec deux types de règles rédigées dans des fichiers de filtre de symboles.

Comme tout octet non ASCII est traité comme matière de mot, un glyphe littéral tel qu’un emoji ou un symbole forme son propre jeton délimité. Une règle épelée avec un tel glyphe peut commencer, se terminer et être délimitée comme un mot, sans changer la manière dont les lettres sont gérées et sans affecter les messages ASCII bruts.

Règles de symbole entier

Une règle de symbole entier se déclenche lorsqu’un glyphe spécifique apparaît dans le message. Elle peut lister plusieurs glyphes interchangeables comme alias, de sorte que les variantes visuelles du même symbole déclenchent toutes la même règle. Celles-ci attrapent l’iconographie utilisée comme signal codé.

HEAR rule
AS
  ALIAS(卐)
  卍(WHOLE)
  NOTE(Hate symbols, swastika and Tibetan variants)

Règles de séquence

Une règle de séquence se déclenche lorsqu’un ensemble ordonné d’étapes de glyphes apparaît, dans l’ordre, n’importe où dans le message, avec n’importe quel contenu autorisé entre elles. Elle correspond à une sous-séquence ordonnée plutôt qu’à une suite contiguë, de sorte que le remplissage entre les emojis ne la met pas en échec. Chaque étape peut accepter l’un quelconque d’un ensemble de glyphes interchangeables, permettant à une seule étape de tenir lieu de toute une famille de symboles ayant le même sens.

Une séquence peut être marquée comme miroir, auquel cas l’ordre inversé est aussi accepté. C’est ainsi qu’une paire dont le sens survit à l’une ou l’autre disposition est écrite comme une seule règle, tandis qu’une séquence sensible à l’ordre ne l’est pas.

SEQUENCE rule
AS
  MIRROR
  🍑👋
  NOTE(Appears in both orders)

Les glyphes dans une séquence sont appariés comme des littéraux exacts, non comme des motifs flous, car un symbole n’a aucune variante orthographique à tolérer.

Les passes d’évitement

Le plugin expose le comportement de normalisation sous forme d’un ensemble d’interrupteurs sous chat.filter.advanced.evasion. Chaque passe vise une famille d’évitement. Toutes sont activées par défaut. Désactiver une passe peut économiser quelques microsecondes de latence au prix d’attraper moins.

evasion:
  homoglyph: true
  entity: true
  deobfuscate: true
  segmentation: true
  fingerprint: true

homoglyph

Applique la table de repli des confusables décrite ci-dessus : les caractères pleine largeur, cyrilliques, grecs, mathématiques et autres sosies sont repliés vers leurs formes ASCII en clair afin qu’une règle écrite en lettres en clair attrape l’orthographe usurpée. Cette passe retire aussi les caractères invisibles et ignorables qui se replient en rien.

entity

Retire les références de caractères HTML avant la correspondance. Chaque référence numérique (décimale ou hexadécimale) et chaque référence nommée se terminant par un point-virgule est remplacée par un seul espace, de sorte qu’une insulte cachée dans un encodage d’entités ne peut pas faire passer ses lettres devant le filtre. Un message sans esperluette est laissé inchangé.

deobfuscate

Défait deux astuces liées. La réduction de suites effondre une orthographe étirée, plafonnant une suite de la même lettre afin qu’une suite de voyelles exagérée se réduise à sa forme courte canonique et qu’une seule règle corresponde à chaque variante étirée. Le retrait dense détecte un mot rembourré avec un seul caractère de remplissage répété entre ses lettres, tel qu’une insulte écrite avec un point ou un tiret entre chaque lettre, et ramène les lettres ensemble. La passe dense borne la longueur récupérée et le nombre d’intervalles afin qu’elle ne puisse pas s’emballer sur une entrée longue, et elle ne s’applique que lorsque le remplissage apparaît au moins deux fois.

segmentation

Gère un mot qui a été scindé ou accolé aux mots environnants, de sorte qu’une phrase écrite comme une seule suite compacte, ou un seul mot brisé à travers des espaces, est tout de même testée comme le mot voulu.

fingerprint

Attrape la transposition, où les lettres intérieures d’un mot sont brouillées. EVE réduit un mot à une signature bâtie à partir de sa première lettre, de sa dernière lettre, de sa longueur et du multi-ensemble trié de ses lettres intérieures. Deux mots qui partagent ceux-ci produisent la même signature, de sorte qu’une insulte dont les lettres du milieu sont mélangées s’associe à la même empreinte que l’original et est attrapée.

Chaque passe a ses limites

Ces passes défont des familles connues d’obfuscation. Elles ne comprennent pas un message, et elles ne peuvent pas anticiper une orthographe ou un symbole qui n’est pas dans leurs tables. Un évitement inédit que les tables ne couvrent pas passe sans être touché. Voir Limitations pour un compte rendu complet.