### Sumário `linkify- it`'s schema-schema loop (`.test()` / `.match()`, a API pública documentada) invoca o validador de esquema `mailto:` em **todos** `mailto:` ocorre no texto de entrada. Para cada ocorrência, o validador faz `text.slice(pos)` (uma cópia de O(n)) e executa um registro de e- mail cuja classe de partes locais `src_email_ name` varre com avidez a **todo a cauda restante** (O(n)) antes de falhar. Com N `mailto:` ocorrências que são **N × O(n) = O(n2)**. Como linkify- it é executado no texto arbitrário do usuário (markdown- it alimenta- o de documentos inteiros quando `linkify: true`), um atacante não autenticado pode bloquear o loop de eventos de uma única linha por muitos segundos com uma pequena entrada. Nenhum comprimento está ligado (ao contrário de um cabeçalho HTTP). ### Causa raíz — `index.mjs` + `lib/re.mjs` ```js // index.mjs (mailto validator) — executa em cada "mailto:" hit 'mailto:': { validar: função (texto, pos, self) { const cauda = text.slice(pos) // O(n) cópia por hit se (! self.re.mailto) self.re.mailto = novo RegExp('^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i') se (self.re.mailto.test(cauda)) {... } // varre todo o retorno da cauda O(n) 0 }} // lib/ re. mjs: 91 - 93 — cada caracter de "mailto:" (incluindo ':', '-', ';') está nesta classe: re.src_email_name = '[\\-;:&=\\+\\$,\\.a-zA-Z 0 - 9 _[\\-;:&=\\+\\$,\\"\\.a-zA-Z 0 - 9 _]* '`` O `while ((m = re.exec(texto)))! == null) {...teste o esquemaAt... }` loop de varredura chama o validador em cada `mailto:` hit; `src_email_name` consome com avidez toda a cauda (todos os caracteres estão na sua classe) e então falha por falta de `@`. `http:`/`https:` NÃO exploda — seu validador requer que a cauda comece com `//`, falhando em O(. 1 ) por golpe.
### Prova de Conceito (confirmado, linkify-it 5.0.1, Nodo v 24 ) ```js const LinkifyIt = require('linkify-it'); const lf = novo LinkifyIt(); If. match('mailto:'.repeat( 48000 )); // ~ 336 KB de "mailto:mailto:..." -> segundos de loop de eventos bloqueados ````. entrada (meios bytes) 56 KBň 112 KBň 224 KBň 336 KB------------------------------------------------------------------------------- 97 msÌ 357 msÌ 1438 msÌ 3272 msї `mailto:` separados do espaço 2 msÌ 3 msÌ 5 msÌ 8 msї ` contígua 12 msÌ 17 msÌ 33 msÌ 49 msÌ ×~ 4 por 2 × entrada ї O(n2); os controles de iguais-bytes permanecem. Algoritmo plano, não um artefato GC/alocação. Mundo real via markdown-it 14.x (`{linkify:true}`), `md.render('mailto: '.repeat(n))`: 219 KB ї ~ 5 s.
### Impacto Alcançable no texto arbitrário do usuário através da API documentada `.test()`/.match()` e através do linkificador de markdown- it — sistemas de comentários, chat, fóruns, wikis, aplicativos de nota que tornam o markdown do usuário com linkify habilitado. A ~ 220 Post KB pendura o loop do evento ~ 5 s; algumas centenas de KB → dezenas de segundos. Apenas disponibilidade. ### Remediação sugerida Amarrou o e-mail local-parte por RFC 5321 (≤ 64 ) assim que o trabalho por- hit é O( 1 ) e evitar a fatia completa: ```js // lib/ re.mjs — cap o goloso: re.src_email_name = '[\\-;:&=\\+\\$,\\.a-zA-Z 0 - 9 _[\\-;:&=\\+\\$,\\"\\.a-zA-Z 0 - 9 _]{ 0,63 }' // index.mjs — prefere um regex adesivo ancorado em `pos` sobre text.slice(pos). ```.
### Afetado / divulgação Todas as versões através 5.0.1 (mais recente); mesmo código no `master`. cve- mcp/ OSV não relata nenhuma vulnerabilidade conhecida para linkify- it. Distinta do próprio ReDoS '*'- executado por markdown- it (CVE- 2026 - 2327, pacote/ caminho diferente) e o recente markdown- it DoS. Relatou em privado; feliz por testar um patch contra o PoC. Registro de aconselhamento: GHSA-v 245 - v 573 - v 5 VM. Identificadores relacionados: CVE- 2026 - 59887.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 21 T 19: 06: 09.000 Z e lista a sua última modificação como 2026 - 07 - 21 T 19: 06: 09.000 Z.
Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.
Software afetado e informações de versão: pacote npm linkify-it — ECOSISTEM: introduzido 0, corrigido 5.0.2.
Classificação e evidência: identificadores de fraqueza CWE- 407. O registro contém 5 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.