`expand()` limita o * número* de resultados que produz (a opção `max`, ` 100 _ 000 ` por padrão) mas não o seu * comprimento *. Ao encadear muitos grupos de suporte, um atacante mantém a contagem de resultados em "max", enquanto faz com que cada resultado cresça com o número de grupos. Construir resultados "max` longos — mais os arrays intermédios combinados em cada grupo de aparelhos — exausta a memória e bloqueia o processo do Nó com um erro fora de memória ** incaptável**. ` tentar/ capturar` em torno de `expand()` não ajuda: o erro fatal termina o processo. A ~ 7.5 Input KB (``{a,b}'.repetit( 1500 )`) é suficiente para bloquear um processo de Nó padrão.

Para grupos de aparelhos em cadeia `N` tais como `'{a,b}'.repeat(N)`. - a contagem de resultados é ` 2 ^ N`, imediatamente tapado em ` max` (` 100 _ 000 `), assim a proteção `max` parece segurar, mas - cada resultado é de caracteres `N` longos, assim o tamanho total da saída é `max × N` caracteres, que cresce sem ligação em `N`. `expand_` combina cada conjunto de brace com a cauda totalmente expandida. ```js const post = m.post.long? expand_ (m.post, max, false): ['']... para (let j = 0; j < N. comprimento; j++) { para (let k = 0; k < post. longh && expansions. longh < max; k++) { const expansion = pre + N[ j] + post[ k] // cresce um grupo mais longo por nível... expansions.push( expansion) } } ````.

O loop guard `expansions.long < max` limita quantas cordas são construídas, mas nada limita quanto tempo elas ficam. Cada nível de recursão materializa outra gama de strings até `max`, um caracter mais longo do que o nível abaixo, e — porque V 8 representa `pre + N[j] + post[k]` como uma corda de cons (corde) que refere ` post[k]` — aquelas cordas intermédias permanecem alcançables durante toda a cadeia. A memória, portanto, escala com `max × N`. Medido no ` 5.0.7 ` (`' {a, b} '.repeat( N)`, padrão `max`). Grupos (N) bytes de entrada contagem de resultados pico RSS-------------------------------- 20 | 100 | 100,000 | ~ 80 MB 50 | 250 | 100,000 | ~ 214 MB 100 | 500 | 100,000 | ~ 409 MB 300 | 1,500 | 100,000 | ~ 1,148 MB 1500 | 7,500. —.. ** OOM crash**.

### Prova de conceito. ```js const { expand } = require('brace-expansion') // ~ 7.5 Input KB — bloqueia o processo com um OOM fatal e incaptável: // ERROR FATAL:... O JavaScript pilha fora da memória tenta { expand('{a,b}'.repeat( 1500 ) ) } captura (e) { // nunca alcançado — o processo já está morto } ```.

Qualquer aplicativo que passe por strings influenciados pelo atacante para `brace-expansion.expand()` — diretamente, ou transitivamente através de padrões de ortografia `minimatch` / `glob` — pode ser derrubado por um pequeno pedido. Porque o falha é um V fatal 8 Erro fora da memória, em vez de uma exceção jogada, ele não pode ser capturado e ele derruba todo o processo/operário, negando o serviço. Atualizar para uma versão corregida. A correção limita o número total de caracteres que uma chamada `expand()` pode acumular (`EXPANSION_MAX_LENGTH`, padrão ` 4 _ 000 _ 000 `, configurable através de uma nova opção `maxLength`), aplicada dentro dos loops de construção de saída, para que arrays intermédios sejam delimitados também. Uma vez atingido o limite, a saída é truncada — consistente com como o `max` já trunca — em vez de crescer sem ligação. O limite fica bem acima de qualquer expansão realista ( 100,000 resultados batendo na medida `max` ~ 1 Caracteres M), assim a entrada legítima não é afetada.

Depois da correção, `'{a,b}'.repeat( 1500 )` retorna um resultado limitado, truncado em ~ 0.7 s usando ~ 340 MB e nunca falha, incluindo sob um limite 512 Molha de MB. A memória dos limites corrigidos, mas o algoritmo ainda reconstrui arrays intermédios em cada nível (aproximadamente "O(N × maxLongth)` trabalha nesta classe de entrada). Uma reescrição em streaming que produz saída em `O(total tamanho de saída)' pode ser um acompanhamento não urgente.

Se a atualização imediata não for possível, evite passar entrada não confiável para padrões de ortografia `expand()`/ glob, ou passar um pequeno explícito `max` **e** `maxLength`. Registro de aconselhamento: GHSA- mh 99 - v 99 m- 4 Gvg. Identificadores relacionados: CVE- 2026 - 14257.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 24 T 21: 53: 14.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 19: 37: 56.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: expansão de brace-package npm — ECOSISTEM: introduzido 4.0.0, corrigido 5.0.8. npm pacote de expansão de brace — ECOSISTEM: introduzido 3.0.0, corrigido 3.0.3. npm pacote de expansão de brace — ECOSISTEM: introduzido 2.0.0, corrigido 2.1.3. npm pacote de expansão de brace — ECOSISTEM: introduzido 0, corrigido 1.1.17. Classificação e evidência: identificadores de fraqueza CWE- 400, CWE- 770. O registro contém 11 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.