'String.prototype.match' com um **global** `RE 2 ` coleta todas as partidas em um loop nativo que avança o cursor pelo comprimento da partida. Uma correspondência **largura zero (vazia)** tem comprimento 0, para que o cursor nunca avance: a mesma partida vazia é encontrada para sempre e anexada a um vetor nativo em crescimento constante. Qualquer padrão que possa corresponder à cadeia vazia (`a*`, `b?`, `x{ 0,3 }`, `(a) (')`, `(?:)`,...) portanto causa um loop infinito com crescimento de memória sem limites. A chamada é código nativo síncrono, por isso bloqueia todo o loop do evento e não pode ser interrompido por `try/catcha', `AbortController', `--max- old-space- size' ou temporizadores — o processo deve ser eliminado externamente. Isto diverge do motor incorporado, onde `'xxxx'.match(/a*/g)` retorna um array finito. ``` cpp // lib/ match.cc: 44 — ramo global de WrappedRE 2:: Acompanhar enquanto (re 2 ->regexp.Match(str, byteIndex, str.size, âncora, &match, 1 )) { groups.push_back( match); byteIndex = match.data() - str.data + match.size(); // += 0 para uma correspondência de largura zero } ``` Quando `match.size() == 0 `, `byteIndex` está inalterado, então a próxima iteração corresponde à mesma posição vazia novamente; `grupos' cresce sem vínculo. Os outros caminhos de iteração já guardam isto: `lib/ split.cc: 50 - 55 ` avanços por ` obter 8 CharSize` em uma partida vazia, e `exec` avança `lastIndex`. Apenas este loop global `Match` está faltando o guarda.

```js const RE 2 = require('re 2 '); 'x'. match(novo RE 2 ('a*', 'g')); // nunca retorna; cresce memória até que o OOM // também: 'b?', 'x{ 0,3 }', '(a).', 'c*d*', '(?:)'; o assunto vazio '' ativa também '``` Compare com o motor integrado, que termina. ```js 'xxxx''.match(/a*/g); // -> ["", "", "", "", ""] `` Medido em uma instalação limpa `npm 're 2 @ 1.25.1 ` (último), estoque pré- construído binário: a memória residente cresceu **~ 550 MB → 2.3 GB em ~ 3 segundos** em 100% CPU, e o processo teve que ser `SIGKILL` externamente.

Negação de serviço. Alcançable remotamente e sem autenticação onde quer que um aplicativo execute um **global** ` RE 2 ` através de `String.prototype. match` e quer o padrão quer o sujeito é influenciado pelo atacante — por exemplo, uma expressão regular fornecida pelo usuário, ou um padrão fixo e compatível com o vazio aplicado à entrada do usuário. Como o loop bloqueia o loop do evento e exausta a memória em segundos, um único pedido pode cunhar um trabalhador e, através do exaustão da memória, afetar todo o hospedeiro. Espelha o gerenciamento de parques vazios já presente em `split.cc`: quando a correspondência for de largura zero, avance o cursor por um ponto de código.

``` cpp // lib/ match.cc, dentro do global while- loop groups.push_back( match); size_t off = match.data() - str.data; se (match.size()) { byteIndex = off + match.size(); } senão { byteIndex = off + (off < str.size? getUtf 8 CharSize(str.data[off]): 1 ); } ``` Corrigido em re 2 1.25.2.

O loop global de correspondências em `lib/match.cc` agora avança o cursor por um ponto de código Unicode quando uma correspondência é de largura zero, por isso um padrão que pode coincidir com a string vazia termina com um resultado finito idêntico ao do motor incorporado (`'xxx'.match(/a*/g)` retorna cinco strings vazios). Isto reflete o guarda já presente em `split`. ** Remediação:** atualização para ` re 2 @ 1.25.2 ` ou mais tarde.

**Workaround** (se você não puder atualizar): não executar um `RE' global 2 ` através de `String.prototype. match` quando o padrão for influenciado pelo atacante ou possa coincidir com a string vazia. Iter com `matchAll`/ `exec`, ou use o formulário não global; ambos já avançam o cursor corretamente. Registro de aconselhamento: GHSA- 6 hxr- mr 5 r- 9836. Identificadores relacionados: CVE- 2026 - 68499.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 16: 53: 08.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 16: 53: 08.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.

Software afetado e informações de versão: pacote npm re 2 — ECOSISTEM: introduzido 0, corrigido 1.25.2. Classificação e evidência: identificadores de fraqueza CWE- 835. O registro contém 5 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.