IA

    Higienização de Payloads em IA: Unicode e Metadados

    Como caracteres de controle Unicode, faixas PUA e blocos C2PA/XMP afetam o contexto de LLMs e pipelines RAG. Estratégias de sanitização pré-tokenização.

    2026-08-1511 minEquipe MaxVision
    CLIP_001 · DJI O4FPV · 4K · 60FPS
    IA · 2026.08.15

    Em agosto de 2026, a discussão sobre sanitização determinística de payloads em sistemas agênticos ganhou tração com lançamentos como o watermarks-remover (v0.5.0). O cenário expõe um desafio frequente na engenharia de IA: documentos, e-mails e páginas da web ingeridos por agentes autônomos carregam bytes invisíveis a olho humano — caracteres de controle Unicode, marcadores de Private Use Area (PUA) e blocos de metadados binários — que alteram o comportamento dos tokenizadores e ocupam espaço no contexto antes mesmo da primeira instrução ser processada.

    Dispositivo de higienização e filtragem de rede em rack de datacenter com luz indicadora carmim acesa no painel

    O vetor de contexto: por que o prompt de sistema não protege a memória

    Na arquitetura de agentes autônomos e pipelines de Geração Aumentada por Recuperação (RAG), a ingestão de dados externos é contínua. Um agente de suporte lê tickets de usuários; um agente de código analisa repositórios e diffs; um agente de pesquisa compila documentos em PDF e páginas da web.

    A segurança desses pipelines costuma ser comprometida quando se assume que o texto exibido na interface visual é exatamente o que o tokenizador entrega à rede neural.

    Conforme catalogado no OWASP Top 10 for LLM Applications 2026:

    • LLM01:2026 Prompt Injection: Cobre injeções diretas e indiretas em que entradas não confiáveis — provenientes de páginas web, documentos ou respostas de APIs externas — manipulam a execução do modelo e contornam restrições operacionais.
    • LLM04:2026 Data and Model Poisoning: Abrange a manipulação de dados em pré-treinamento, fine-tuning ou no contexto dinâmico de RAG e memória persistente de agentes, corrompendo a integridade das respostas ao longo do tempo.

    No nível de representação de caracteres e tokenização, destacam-se três vulnerabilidades estruturais:

    1. Tokens fantasmas via Zero-Width e Tag Characters: Caracteres como U+200B (Zero-Width Space), U+FEFF (Byte Order Mark / Zero-Width No-Break Space) e a faixa de Tags Unicode (U+E0001 a U+E007F, documentada no Unicode Standard Annex #44) não produzem glifos visíveis na maioria das interfaces. Dependendo do algoritmo do tokenizador adotado (como BPE, WordPiece ou Unigram), esses pontos de código são decompostos em tokens individuais ou sequências de bytes de fallback, consumindo espaço da janela de contexto e influenciando a matriz de atenção sem que o operador humano perceba.
    2. Formatação Bidirecional (BiDi): Caracteres de controle de direção (Unicode Standard Annex #9), como U+202E (Right-to-Left Override) e os isoladores direcionais U+2066 a U+2069, alteram a ordem de exibição visual na tela do operador. Isso cria uma discrepância entre o que o humano audita visualmente no console e a sequência real de pontos de código processada pelo modelo.
    3. Persistência em memória de longo prazo: Quando um agente armazena o histórico da sessão ou trechos ingeridos em um banco vetorial ou arquivo de estado, os bytes ocultos persistem e continuam sendo injetados nas chamadas subsequentes, poluindo o contexto e distorcendo a recuperação semântica.

    Tentar mitigar essas anomalias apenas através do prompt de sistema — adicionando diretrizes como "ignore caracteres especiais ocultos" — é insuficiente. O modelo consome a representação numérica dos tokens brutos. Se a sequência de entrada contém instruções ocultas intercaladas por caracteres especiais, o mecanismo de atenção processa esses tokens na mesma matriz de pesos.

    Camadas de sanitização determinística na arquitetura agêntica

    A engenharia de software resiliente não delega a validação de formato e segurança estrutural à probabilidade do modelo generativo. O pipeline de sanitização deve ser determinístico, executado em código nativo antes de qualquer payload alcançar o SDK do LLM.

    Uma arquitetura recomendada para pipelines de produção divide a higienização em etapas complementares:

    Diagrama conceitual das camadas de higienização de payload pré-tokenização e controle de metadados em agentes

    1. Camada de Limpeza Unicode e Normalização Canônica

    O primeiro estágio atua no nível de pontos de código (code points). Ele identifica e descarta caracteres de controle sem propósito semântico no domínio do texto, faixas de uso privado (PUA: U+E000U+F8FF, U+F0000U+FFFFD e U+100000U+10FFFD) e tags de controle U+E0001U+E007F. Em seguida, aplica a normalização Unicode conforme detalhado no Unicode Standard Annex #15: a forma NFC garante a composição canônica padrão, enquanto a forma NFKC decompõe variantes de compatibilidade (como caracteres de largura total e ligaduras tipográficas). Para a detecção e restrição de caracteres confusíveis (homoglyph spoofing) entre alfabetos distintos, a referência mandatória é o Unicode Technical Standard #39: Unicode Security Mechanisms.

    2. Camada de Descarte de Metadados em Arquivos Multimodais

    Quando o agente processa imagens, PDFs ou arquivos complexos, extratores de texto e metadados capturam campos auxiliares embutidos. Estruturas como blocos C2PA v2.1, tags EXIF e esquemas XMP armazenam manifests de proveniência, dados técnicos de captura e campos de texto descritivo (como título, autor e observações). Se uma biblioteca de ingestão descompacta cegamente esses campos de texto livre e os anexa ao contexto do prompt de um modelo multimodal, conteúdos não auditados introduzidos por terceiros podem atuar como vetores de injeção indireta. A remoção ou filtragem estrita de metadados textuais não essenciais antes da montagem da mensagem garante que apenas o conteúdo visual ou os dados estruturados pretendidos alcancem o modelo.

    3. Observabilidade Estatística e Pesquisa de Marcas D'água

    No âmbito da pesquisa acadêmica em observabilidade de modelos, projetos como o MarkLLM e o MarkDiffusion desenvolvem arcabouços de código aberto para análise e avaliação de esquemas de marcas d'água estatísticas em modelos de linguagem (via partição de vocabulário e entropia de tokens) e modelos de difusão (via perturbações no espaço latente). Em arquiteturas de produção corporativa, os princípios de análise estatística de distribuição e entropia de tokens auxiliam na identificação de padrões anômalos em fluxos massivos de ingestão de dados.

    Inspeção em nível de byte de buffers de memória e payloads de entrada em console de engenharia

    Implementação de referência: Sanitizador TypeScript com suporte a allowlist

    Abaixo apresentamos a implementação em TypeScript de um sanitizador de payload pré-tokenização, disponível no módulo src/lib/payload-sanitizer.ts. O código utiliza expressões regulares com suporte total a Unicode (flag u), manipulando pontos de código suplementares e oferecendo opções de allowlist por idioma:

    /**
     * Opções de configuração para a higienização de payload de LLM.
     */
    export interface SanitizerOptions {
      /**
       * Se verdadeiro, preserva caracteres de formatação direcional BiDi (U+200E, U+200F, U+202A-U+202E, U+2066-U+2069).
       * Recomendado para pipelines de idiomas RTL como árabe, hebraico e persa.
       */
      preserveBiDiLanguages?: boolean;
      /**
       * Se verdadeiro, preserva Zero-Width Joiner (ZWJ, U+200D) e Zero-Width Non-Joiner (ZWNJ, U+200C).
       * Recomendado para escritas complexas do sul da Ásia (Devanagari, Sinhala) e persa.
       */
      preserveComplexScriptJoiners?: boolean;
      /**
       * Forma de normalização Unicode a ser aplicada: 'NFC' (canônica, padrão) ou 'NFKC' (compatibilidade).
       */
      normalizationForm?: "NFC" | "NFKC" | "none";
    }
    
    export interface SanitizerResult {
      cleanText: string;
      removedCount: number;
      hasSuspiciousBiDi: boolean;
      detectedPua: boolean;
      detectedTags: boolean;
    }
    
    /**
     * Sanitiza strings de entrada antes do envio a tokenizadores e LLMs.
     */
    export function sanitizeLlmPayload(
      input: string,
      options: SanitizerOptions = {}
    ): SanitizerResult {
      if (!input || typeof input !== "string") {
        return {
          cleanText: "",
          removedCount: 0,
          hasSuspiciousBiDi: false,
          detectedPua: false,
          detectedTags: false,
        };
      }
    
      const {
        preserveBiDiLanguages = false,
        preserveComplexScriptJoiners = false,
        normalizationForm = "NFC",
      } = options;
    
      let hasSuspiciousBiDi = false;
      let detectedPua = false;
      let detectedTags = false;
    
      // 1. Detecção de controles BiDi
      // U+200E (LRM), U+200F (RLM), U+202A-U+202E (embeddings/overrides), U+2066-U+2069 (isolates)
      const bidiRegex = /[\u200E\u200F\u202A-\u202E\u2066-\u2069]/gu;
      if (bidiRegex.test(input)) {
        hasSuspiciousBiDi = true;
      }
    
      // 2. Detecção de PUA e Tags
      const puaRegex = /[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/gu;
      if (puaRegex.test(input)) {
        detectedPua = true;
      }
    
      const tagRegex = /[\u{E0001}-\u{E007F}]/gu;
      if (tagRegex.test(input)) {
        detectedTags = true;
      }
    
      // 3. Montagem do padrão de caracteres indesejados
      const zeroWidthBase = "\\u200B\\uFEFF\\u2060\\u180E";
      const joiners = preserveComplexScriptJoiners ? "" : "\\u200C\\u200D";
      const bidi = preserveBiDiLanguages ? "" : "\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u2069";
      const generalControls = "\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u009F";
    
      const stripPattern = new RegExp(
        `[${zeroWidthBase}${joiners}${bidi}${generalControls}\\uE000-\\uF8FF\\u{F0000}-\\u{FFFFD}\\u{100000}-\\u{10FFFD}\\u{E0001}-\\u{E007F}]`,
        "gu"
      );
    
      let removedCount = 0;
      const filtered = input.replace(stripPattern, () => {
        removedCount++;
        return "";
      });
    
      // 4. Normalização Unicode
      let cleanText = filtered;
      if (normalizationForm === "NFC") {
        cleanText = filtered.normalize("NFC");
      } else if (normalizationForm === "NFKC") {
        cleanText = filtered.normalize("NFKC");
      }
    
      return {
        cleanText,
        removedCount,
        hasSuspiciousBiDi,
        detectedPua,
        detectedTags,
      };
    }
    

    Resultados de teste e verificação de casos de borda

    A suíte de testes unitários versionada em src/lib/payload-sanitizer.test.ts valida as garantias do algoritmo contra diferentes casos de borda:

    • Tags suplementares (U+E0001 a U+E007F): Identificadas e removidas sem afetar caracteres legítimos adjacentes no plano suplementar.
    • Marcadores PUA estendidos (BMP U+E000U+F8FF, Plano 15 U+F0000U+FFFFD e Plano 16 U+100000U+10FFFD): Removidos com precisão sem corromper a representação UTF-16 em memória.
    • Controles BiDi (U+200E, U+200F, U+202AU+202E, U+2066U+2069): Removidos por padrão e sinalizados na propriedade hasSuspiciousBiDi para auditoria de segurança, com preservação sob a opção preserveBiDiLanguages.
    • Juntadores e Não-Juntadores (U+200C, U+200D): Removidos em pipelines padrão e preservados sob a opção preserveComplexScriptJoiners para idiomas que exigem ligaduras ortográficas.
    • Preservação de pares substitutos e símbolos compostos: Sequências de múltiplos pontos de código (como Regional Indicator Symbols U+1F1E7 e U+1F1F7) e emojis suplementares permanecem intactos, evitando quebras estruturais causadas por expressões regulares que não operam em code points completos.

    Limitações operacionais e considerações de internacionalização

    Nenhuma rotina de higienização de strings é universalmente aplicável sem contexto de negócio. Engenheiros de IA devem considerar as seguintes restrições:

    1. Idiomas com escrita complexa: Em persa, árabe, hindi e outras línguas asiáticas, caracteres como ZWJ (U+200D) e ZWNJ (U+200C) são essenciais para a formação gramatical e ortográfica correta de ligaduras. Removê-los cegamente degrada a qualidade da resposta do modelo para esses idiomas.
    2. Normalização NFKC vs. Expressões Matemáticas e Código: A normalização de compatibilidade (NFKC) converte caracteres como frações em caracteres normais (ex.: ½ em 1/2) e símbolos matemáticos estilizados em equivalentes ASCII. Em pipelines voltados para geração de código ou provas matemáticas formais, recomenda-se a forma NFC para preservar a exatidão dos símbolos originais.
    3. Defesa em Profundidade: A higienização de payload é uma camada de filtragem estrutural. Ela deve ser combinada com sandboxing de execução (Rule-of-Two) e validação de schema em saídas de ferramentas.

    Checklist de produção: higiene de contexto em 5 etapas

    Para equipes que mantêm sistemas baseados em agentes e pipelines RAG em produção:

    1. Higienização no Ingress: Aplique sanitização e normalização canônica antes de adicionar dados externos ao array de mensagens do modelo.
    2. Descarte de Metadados: Em fluxos com arquivos anexos, filtre blocos EXIF e XMP não essenciais antes de submeter o conteúdo a modelos de visão.
    3. Isolamento de Memória: Ao persistir conversas e resumos em bancos vetoriais, execute a higienização para evitar poluição persistente entre sessões.
    4. Monitoramento e Auditoria: Registre alertas quando requisições apresentarem contagens elevadas de caracteres PUA ou anomalias direcionais BiDi.
    5. Princípio do Menor Privilégio: Mantenha agentes responsáveis por ingestão e web scraping isolados em ambientes sem acesso a credenciais de infraestrutura ou chaves de produção.

    Se a sua equipe desenvolve arquiteturas de agentes autônomos ou pipelines RAG e busca estruturar sistemas robustos e seguros, conheça os programas de aceleração e consultoria da Produtora MaxVision.


    Fontes primárias e documentação técnica


    Leia também no Almanaque MaxVision Labs

    TAGS
    • IA
    • Segurança
    • Agentes de IA
    • RAG
    • Engenharia de Contexto
    • Desenvolvimento
    Mascote da MaxVision para contato rápido no WhatsAppFale agora pelo WhatsApp