flawopen.com/Teardowns/cve-2026-102422-shell-quote-comment-line-terminator-injection
CVE-2026-102422: injeção por token de comentário no shell-quote
Antes do shell-quote 1.11.0, um token de comentário seguido por uma string com terminador de linha podia alterar o significado do texto citado ao ser enviado a um shell POSIX. A condição exige tokens influenciados por um atacante, uma chamada a quote() e execução da saída por um shell; atualize para 1.11.0 ou posterior.
Um comentário em uma etiqueta pode esconder tudo o que vem depois até o fim da linha. Se a parte seguinte da etiqueta contiver uma quebra de linha, o texto oculto termina antes e o restante volta a aparecer. Essa falha permitia que um token posterior fizesse isso na saída citada para o shell.
Conceitos Centrais e Termos
shell-quote- Pacote JavaScript que analisa e cita tokens no estilo de shell; a saída continua destinada à sintaxe de shell, não a um formato universal de texto seguro.
Token de comentário- Token que representa a sintaxe de comentário do shell. Seu efeito pode alcançar o texto seguinte até um terminador de linha.
Terminador de linha- Limite de linha como CR, LF, U+2028 ou U+2029; o shell pode tratá-lo como fim do comentário.
CWE-78- Neutralização inadequada de elementos especiais usados em um comando do sistema operacional.
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-78
Análise de Causa Raiz
O caminho afetado de quote() rejeitava terminadores de linha dentro do próprio token de comentário, mas não registrava que um comentário já havia sido emitido. Assim, um token de string posterior podia conter um terminador de linha. No caso específico em que tokens influenciados por um atacante chegam a quote() e o texto retornado é executado por um shell POSIX, a quebra encerra o comentário e o shell interpreta o texto seguinte como sintaxe. A correção registra o estado de comentário e rejeita terminadores em todas as strings posteriores. Isso é distinto de CVE-2026-9277, cuja correção rejeitava terminadores dentro do token de comentário. Os mantenedores classificam a falha como Alta, CVSS 3.1 8,1; o Ubuntu publica uma avaliação separada CVSS 4.0 9,2 Crítica. As pontuações usam versões diferentes e não são intercambiáveis.
Fluxo de Ataque Passo a Paso
Entrada de tokens chega à função de citação
A aplicação monta tokens que incluem um comentário e uma string posterior; é necessário que o atacante influencie essa sequência.
A função emite sintaxe de comentário
Antes da 1.11.0, quote() verificava o texto do comentário, mas não lembrava que haveria strings depois dele.
Um token posterior contém quebra de linha
CR, LF, U+2028 ou U+2029 nessa string pode encerrar o comentário do shell.
A aplicação executa a saída em um shell
A interpretação documentada só ocorre nos chamadores que passam essa saída a um shell POSIX.
A atualização rejeita a sequência insegura
A versão 1.11.0 registra que houve comentário e lança erro quando uma string posterior contém terminador de linha.
Código-Fonte: Vulnerável vs. Seguro
O trecho vulnerável verifica terminadores de linha no token de comentário, mas não registra o estado das strings seguintes. A alteração upstream registra que um comentário foi emitido e rejeita uma string posterior que contenha um terminador. Este trecho ilustra o limite entre análise e citação; não é um exploit nem um comando de shell.
Trecho de origem: quote.js — focused upstream diff hunks
// quote.js antes do commit 6002b2e — trecho específico do token de comentário
if ('comment' in s && typeof s.comment === 'string') {
if (LINE_TERMINATORS.test(s.comment)) {
throw new TypeError('`comment` must not contain line terminators');
}
return '#' + s.comment;
}
// quote.js após o commit 6002b2e — trecho exato da nova proteção e do estado do comentário
var sawComment = false;
return xs.map(function (s) {
if (sawComment && typeof s === 'string' && LINE_TERMINATORS.test(s)) {
throw new TypeError('a token after a `comment` must not contain line terminators');
}
if ('comment' in s && typeof s.comment === 'string') {
if (LINE_TERMINATORS.test(s.comment)) {
throw new TypeError('`comment` must not contain line terminators');
}
sawComment = true;
return '#' + s.comment;
}
});
Lista de Verificação de Segurança para Engenharia
- ✓Atualize as dependências diretas e transitivas de
shell-quotepara 1.11.0 ou posterior; confira a versão resolvida no lockfile e no artefato implantado. - ✓Não trate
quote()como seguro para qualquer contexto nem como substituto de evitar a chamada a um shell. - ✓Quando possível, invoque um executável fixo com vetor de argumentos e
shell: false; valide cada argumento para o programa de destino. - ✓Se a interpretação por shell for inevitável, mantenha fixa a estrutura do comando e rejeite sequências de token de comentário seguidas por terminadores antes da chamada.
- ✓Adicione testes de regressão para CR, LF, U+2028 e U+2029 em strings posteriores, inclusive tokens produzidos por
parse(). - ✓Revise os pontos que enviam tokens influenciados por atacantes a
quote()e depois executam a saída; apenas usar o pacote não demonstra explorabilidade. - ✓Não deduza o estado dos pacotes Ubuntu a partir da versão npm; consulte o aviso da distribuição para o pacote exato.