Skip to content

Título: [Segurança] Evasão de defesa contra Prompt Injection via sentinelas incompletas em extract.py #3183

Description

@Adriano1976

Descrição do problema e por que é explorável

Em graphify/extract.py (linha 142), a função _neutralise_injection_sentinels() busca higienizar o co
nteúdo de arquivos antes de inseri-los no contexto do LLM. No entanto, a lista de substituição é estátic
a e incompleta, cobrindo apenas <|im_start|> e [INST]. Tokens como <|im_end|>, <|endoftext|>, < |start_header_id|> (Llama 3) e [SYSTEM] não são higienizados. Se um repositório auditado mantiver ess
es tokens em comentários ou strings de teste, o atacante pode quebrar a estrutura da janela de contexto
e forçar a IA a ignorar as instruções de extração.

Evidência

Arquivo: graphify/extract.py:L142

def _neutralise_injection_sentinels(text: str) -> str:
# Substituições estáticas atuais
text = text.replace("<|im_start|>", "<|im_start_defanged|>")
text = text.replace("[INST]", "[INST_DEFANGED]")
return text

Impacto

Médio — Permite alteração no comportamento de extração semântica da IA durante o processamento de reposi
tórios maliciosos de terceiros.

Sugestão de correção

Utilizar regex genérica para neutralizar qualquer padrão de token de controle de LLM:

import re
def _neutralise_injection_sentinels(text: str) -> str:
# Defanga qualquer token no formato <|...|> e marcadores [INST]/[SYSTEM]
text = re.sub(r'<\|([a-zA-Z0-9_\-]+)\|>', r'<|defanged_■|>', text)
text = re.sub(r'\[(INST|SYSTEM|/INST|/SYSTEM)\]', r'[■_DEFANGED]', text)
return text

Critérios de Aceite

  • Criar teste unitário passando <|im_end|>, <|endoftext|> e <|start_header_id|> para _neutral ise_injection_sentinels().
  • Validar que nenhuma tag de controle passa sem defang.

docs_security-audit_relatorio-auditoria-seguranca.pdf

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions