Símbolos e evasão da EVE
Os filtros apanham palavras, mas as pessoas que querem passar por um filtro raramente escrevem a palavra simples. Trocam um a latino por um cirílico, vestem as letras com Unicode decorativo, envolvem um insulto em entidades HTML, salpicam pontuação entre cada letra, ou recorrem a emoji em vez de palavras. A EVE, o motor de correspondência de padrões por trás do filtro de chat do Verité, tem uma camada dedicada a desfazer estes truques antes de uma mensagem sequer ser testada contra uma regra.
Esta página abrange dois sistemas relacionados:
- O tratamento de símbolos e glifos, incluindo a tabela de reconversão de confundíveis que mapeia caracteres semelhantes de volta para letras simples, e os quadros de símbolos de emoji que apanham significado codificado transportado inteiramente em pictogramas.
- As passagens de evasão que normalizam uma mensagem antes da correspondência: reconversão de homóglifos, remoção de entidades, desofuscação, segmentação e fingerprinting.
Para a própria linguagem de padrões, consulte A linguagem EVE. Para um relato honesto do que esta camada não consegue fazer, leia Limitações.
Como a normalização se encaixa
Quando uma mensagem chega, a EVE não corresponde as regras contra o texto em bruto. Primeiro expande a mensagem num pequeno conjunto de strings candidatas normalizadas, e depois testa as regras contra elas. Uma única mensagem torna-se várias leituras: uma que reconverte cada carácter confundível para a sua forma simples, outras que mantêm um carácter ambíguo tal como está, e assim por diante. Se algum candidato corresponder a uma regra, a mensagem é apanhada.
Este é o mecanismo que permite a um padrão criado, escrito em ASCII simples, apanhar uma palavra soletrada com letras gregas, cirílicas, de largura total ou matemáticas, sem que o autor liste alguma vez essas grafias.
A tabela de reconversão de confundíveis
O coração do tratamento de símbolos é a tabela de reconversão: um mapeamento de uma fonte confundível para as interpretações simples para que pode reconverter-se. Uma fonte é uma sequência em bruto de um ou mais pontos de código Unicode. Um destino é a string simples para que reconverte, que pode ser um único carácter, vários caracteres (o s afiado reconverte para ss), ou a string vazia, que significa que a fonte é eliminada por completo.
A tabela é carregada uma vez a partir de um ficheiro de dados de runtime compilado a partir de um corpus de confundíveis. Quando nenhuma tabela é carregada, uma mensagem reconverte apenas para si própria sob a conversão para minúsculas ASCII, por isso a reconversão degrada-se de forma segura em vez de falhar.
A correspondência é mais longa primeiro
Em cada posição na mensagem, a EVE procura a fonte mais longa na tabela que corresponda ali, preferindo mais bytes para que uma construção de vários caracteres vença o seu primeiro carácter isolado. É assim que uma letra em arte ASCII construída a partir de vários caracteres, ou uma sequência de emoji de vários pontos de código, é reconhecida como uma unidade em vez de como as suas peças individuais.
Uma fonte, várias leituras
Um confundível nem sempre é inequívoco. Uma fonte pode carregar vários destinos, e cada um é tratado como uma leitura separada. Quando uma fonte tem mais do que uma interpretação ativada, a EVE bifurca um novo candidato para cada uma, e mantém também a leitura original intacta juntamente com as reconvertidas. Isto importa: reconverter um carácter para uma letra é um palpite, e manter a leitura original significa que um uso inocente desse carácter não é silenciosamente reescrito numa correspondência.
A única exceção é um carácter cuja interpretação canónica é a eliminação. Uma fonte que canonicamente reconverte para a string vazia, como um zero-width joiner ou outro carácter invisível, é removida e os seus bytes originais não são ressuscitados.
Níveis de proveniência
Nem toda a reconversão é igualmente fidedigna. Cada destino carrega um nível que regista de onde veio o mapeamento, do mais autoritativo até ao mais agressivo:
| Nível | Significado |
|---|---|
| Núcleo autoritativo | Reconversão canónica de segurança e Unicode, sempre segura de aplicar. |
| Normalização | Reconversão de normalização canónica, sempre segura de aplicar. |
| Texto documentado | Símbolos com texto que têm uma leitura simples documentada. |
| Agressivo recomendado | Semelhanças mais soltas recomendadas para reconversão agressiva. |
| Visual agressivo | Semelhanças visuais sob reconversão agressiva. |
| ASCII agressivo | Semelhanças ASCII sob reconversão agressiva. |
| Visual herdado, ASCII herdado | Aliases transportados de uma tabela anterior. |
| Transliteração | Transliteração semântica de escrita. |
| Visual de fonte (estrito, padrão, exploratório) | Semelhanças encontradas ao analisar fontes renderizadas, do mais apertado ao mais solto. |
| Par ASCII de fonte (padrão, exploratório) | Semelhanças ASCII encontradas ao analisar fontes renderizadas. |
Os dois níveis canónicos, núcleo autoritativo e normalização, são sempre aplicados. Todos os outros níveis são heurísticos em algum grau e só são ativados quando a reconversão agressiva está ligada. Uma máscara de nível permite que as interpretações agressivas sejam ativadas ou suprimidas independentemente das seguras.
Os níveis também são tentados por ordem, do mais fidedigno primeiro. A EVE limita quão longe uma única mensagem pode expandir-se em candidatos para que uma mensagem forjada não possa fazer explodir o conjunto de candidatos. Quando esse limite é atingido, os candidatos sobreviventes favorecem as leituras canónicas, porque foram gerados primeiro.
A eliminação é apenas outra reconversão
Remover um carácter invisível e reconverter uma semelhança são a mesma operação. Um carácter que reconverte para a string vazia é eliminado; um carácter que reconverte para uma letra simples é reescrito. Ambos vivem numa tabela, por isso não há uma lista separada de caracteres a remover.
Classes de caracteres em padrões
Separadas da tabela de reconversão, os padrões da EVE podem nomear as suas próprias classes: um conjunto nomeado de fragmentos intercambiáveis que um padrão referencia pelo nome. Uma classe é definida uma vez e reutilizada, por isso um padrão pode, por exemplo, tratar qualquer vogal como intercambiável numa posição. É assim que um autor escreve tolerância para variação ortográfica diretamente numa regra, distinta da reconversão automática de confundíveis descrita acima.
A correspondência relaxada também utiliza uma classe de vogais incorporada, permitindo a um padrão tolerar substituições comuns de vogais como trocas de leetspeak sem o autor enumerar cada uma.
As classes são uma ferramenta de criação para variação ortográfica dentro de uma regra. A tabela de reconversão é uma passagem de todo o motor que corre em cada mensagem antes de qualquer regra ser testada. Complementam-se: a tabela de reconversão mapeia um carácter decorativo para um simples, e uma classe deixa a regra simples aceitar várias grafias simples.
Quadros de símbolos: emoji e iconografia
Algum conteúdo não carrega letras nenhumas. Um único emoji, ou um par ordenado de emoji, pode substituir uma frase. A EVE trata disto com dois tipos de regra criados em ficheiros de filtro de símbolos.
Como qualquer byte não ASCII é tratado como material de palavra, um glifo literal como um emoji ou um símbolo forma o seu próprio token delimitado. Uma regra soletrada com um deles pode começar, terminar e ser delimitada como uma palavra, sem alterar a forma como as letras são tratadas e sem afetar as mensagens ASCII simples.
Regras de símbolo inteiro
Uma regra de símbolo inteiro dispara quando um glifo específico aparece na mensagem. Pode listar vários glifos intercambiáveis como aliases, para que as variantes visuais do mesmo símbolo acionem todas a única regra. Estas apanham iconografia que é utilizada como sinal codificado.
HEAR rule
AS
ALIAS(卐)
卍(WHOLE)
NOTE(Hate symbols, swastika and Tibetan variants)Regras de sequência
Uma regra de sequência dispara quando um conjunto ordenado de passos de glifos aparece, por ordem, algures na mensagem, com qualquer conteúdo permitido entre eles. Corresponde a uma subsequência ordenada em vez de a uma sequência contígua, por isso o enchimento entre os emoji não a derrota. Cada passo pode aceitar qualquer um de um conjunto de glifos intercambiáveis, permitindo que um único passo represente toda uma família de símbolos com o mesmo significado.
Uma sequência pode ser marcada como espelhada, caso em que a ordem inversa também é aceite. É assim que um par cujo significado sobrevive a qualquer arranjo é escrito como uma regra, enquanto uma sequência em que a ordem é significativa não é.
SEQUENCE rule
AS
MIRROR
🍑👋
NOTE(Appears in both orders)Os glifos numa sequência são correspondidos como literais exatos, não padrões difusos, porque um símbolo não tem variantes ortográficas para tolerar.
As passagens de evasão
O plugin expõe o comportamento de normalização como um conjunto de alternadores sob chat.filter.advanced.evasion. Cada passagem visa uma família de evasão. Todas estão ativadas por predefinição. Desativar uma passagem pode poupar alguns microssegundos de latência ao custo de apanhar menos.
evasion:
homoglyph: true
entity: true
deobfuscate: true
segmentation: true
fingerprint: truehomoglyph
Aplica a tabela de reconversão de confundíveis descrita acima: caracteres de largura total, cirílicos, gregos, matemáticos e outras semelhanças são reconvertidos para as suas formas ASCII simples, para que uma regra escrita em letras simples apanhe a grafia falsificada. Esta passagem também remove os caracteres invisíveis e ignoráveis que reconvertem para nada.
entity
Remove as referências de caracteres HTML antes da correspondência. Cada referência numérica (decimal ou hexadecimal) e cada referência nomeada que termina num ponto e vírgula é substituída por um único espaço, para que um insulto escondido dentro de codificação de entidades não possa contrabandear as suas letras para lá do filtro. Uma mensagem sem E comercial fica inalterada.
deobfuscate
Desfaz dois truques relacionados. A redução de sequências colapsa uma grafia esticada, limitando uma sequência da mesma letra para que uma sequência de vogais exagerada se reduza à sua forma canónica curta e uma regra corresponda a cada variante esticada. A remoção densa deteta uma palavra preenchida com um único carácter de enchimento repetido entre as suas letras, como um insulto escrito com um ponto ou traço entre cada letra, e puxa as letras de volta. A passagem densa limita o comprimento recuperado e o número de lacunas para que não possa desgovernar-se em entradas longas, e só se aplica quando o enchimento aparece pelo menos duas vezes.
segmentation
Trata de uma palavra que foi separada ou colada às palavras circundantes, por isso uma frase escrita como uma sequência sólida, ou uma única palavra partida por espaços, ainda é testada como a palavra pretendida.
fingerprint
Apanha a transposição, onde as letras interiores de uma palavra são baralhadas. A EVE reduz uma palavra a uma assinatura construída a partir da sua primeira letra, da sua última letra, do seu comprimento e do multiconjunto ordenado das suas letras interiores. Duas palavras que partilham isso produzem a mesma assinatura, por isso um insulto com as suas letras do meio baralhadas mapeia para o mesmo fingerprint que o original e é apanhado.
Cada passagem tem limites
Estas passagens desfazem famílias conhecidas de ofuscação. Não compreendem uma mensagem, e não podem antecipar uma grafia ou um símbolo que não esteja nas suas tabelas. Uma evasão inédita que as tabelas não cobrem passa intocada. Consulte Limitações para um relato completo.