Skip to content

[security][P3] ReDoS guard L1: cobrir alternância ambígua ((a|a)*) na heurística + fixar regex-runtime não-confiável no escopo L2/L3 (#865) #1114

Description

@FabioLeitao

Contexto (verificado contra origin/main)

config/plugin_validator.py:51 _has_nested_quantifier = heurística ReDoS de #829 (star-height>1: pega (a+)+, ([a-z]+)*). Aplicada em 2 camadas: core/detector.py:766 (load de regex_overrides_file) + config/plugin_validator.py:362 (schema de plugin).

⚠️ Severidade P3 (honesta): o caminho de dado do CLIENTE usa só DEFAULT_PATTERNS (core/detector.py:84), provadamente lineares — cobertos pela regressão tests/test_redos_guard.py:164 (test_default_patterns_pass_redos_guard). O vetor residual é regex_overrides_file (pack de 3º carregado pelo operador), NÃO input remoto de cliente. Esta issue não reabre #829; liga o épico #865 (Plugin SDK L1/L2/L3).

Lacuna confirmada EMPIRICAMENTE (rodando a função real do repo)

_has_nested_quantifier("(a+)+")     -> True   (pego)
_has_nested_quantifier("([a-z]+)*") -> True   (pego)
_has_nested_quantifier("(a|a)*")    -> False  (NÃO pego — ReDoS real)
_has_nested_quantifier("(a|ab)*c")  -> False  (NÃO pego — ReDoS real)

Alternância ambígua sob quantificador não tem "quantificador aninhado" → a heurística não marca, mas é backtracking exponencial clássico.
Correção do draft original: o exemplo a{1,1000}{1,1000} não é lacuna — o Python re já rejeita como "multiple repeat" (re.error), então o try: re.compile / except descarta.

Tarefa A — fortalecer L1 (independe do #865)

  • Testes em tests/test_redos_guard.py p/ alternância ambígua ((a|a)*, (a|ab)*c) — documentar se é known-gap-aceito ou a-corrigir.
  • Se corrigir: estender _has_nested_quantifier p/ alternância com ramos sobrepostos sob quantificador (ou avaliar regex/re2 só p/ o caminho não-confiável).
  • Decidir sobre timeout duro em runtime como rede complementar (não substituta) à heurística — registrar decisão mesmo que "não agora".

Tarefa B — requisito p/ L2/L3 (dentro do #865)

Aceite

  • A: cobertura de _has_nested_quantifier p/ alternância ambígua documentada (teste presente) + decisão de timeout registrada.
  • B: requisito de regex-runtime não-confiável citado no desenho final de L2/L3, com ADR.

Fora de escopo: reabrir #829; implementar #865 (só adiciona requisito ao escopo existente).
Proveniência: triado do pack round-2 redos — verificado empiricamente 01-jul (auditor RO).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions