FlawOpen

flawopen.com/Teardowns/cve-2026-102422-shell-quote-comment-line-terminator-injection

● CVE-2026-102422 · CVSS 8.1 · Tinggi
Riset Keamanan · FlawOpen

CVE-2026-102422: injeksi token komentar pada shell-quote

Sebelum shell-quote 1.11.0, token komentar yang diikuti string berisi terminator baris dapat mengubah arti keluaran yang dikutip saat diteruskan ke shell POSIX. Syaratnya adalah token dipengaruhi penyerang, aplikasi memanggil quote(), dan keluarannya dijalankan oleh shell; tingkatkan ke 1.11.0 atau lebih baru.

💡 Penjelasan Sederhana (ELI5)

Komentar pada label dapat menyembunyikan semua teks setelahnya sampai akhir baris. Jika bagian berikutnya berisi baris baru, komentar berakhir lebih awal dan teks sisanya terlihat lagi. Bug ini memungkinkan token berikutnya menimbulkan efek tersebut pada keluaran untuk shell.

Konsep Kunci & Istilah

shell-quote
Paket JavaScript untuk mengurai dan mengutip token bergaya shell; keluarannya tetap ditujukan untuk sintaks shell, bukan format teks aman universal.
Token komentar
Token sintaks komentar shell yang pengaruhnya dapat berlanjut ke teks berikutnya hingga terminator baris.
Terminator baris
Batas baris seperti CR, LF, U+2028, atau U+2029 yang dapat dianggap shell sebagai akhir komentar.
CWE-78
Penetralan yang tidak tepat terhadap elemen khusus dalam perintah sistem operasi.

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-78

Analisis Akar Masalah (Root Cause)

Jalur quote() yang terdampak menolak terminator baris di dalam token komentar itu sendiri, tetapi tidak mencatat bahwa komentar telah dikeluarkan. Karena itu, token string berikutnya dapat berisi terminator baris. Jika token yang dipengaruhi penyerang melewati quote() dan teks hasilnya dijalankan oleh shell POSIX, batas baris mengakhiri komentar dan shell menafsirkan teks berikutnya sebagai sintaks. Perbaikan upstream mencatat status komentar dan menolak terminator baris pada semua string selanjutnya. Ini berbeda dari CVE-2026-9277, yang perbaikannya menolak terminator di dalam token komentar. Maintainer memberi tingkat High, CVSS 3.1 8.1; Ubuntu secara terpisah menerbitkan penilaian CVSS 4.0 9.2 Critical. Versi CVSS-nya berbeda dan nilainya tidak dapat dipertukarkan.

Alur Serangan Langkah demi Langkah

Langkah 1

Token mencapai fungsi pengutipan

Aplikasi menyusun token yang berisi komentar dan string setelahnya; penyerang harus dapat memengaruhi urutan itu.

Langkah 2

Fungsi mengeluarkan sintaks komentar

Sebelum 1.11.0, quote() memeriksa teks komentar, tetapi tidak mengingat adanya string setelah komentar.

Langkah 3

Token berikutnya memuat batas baris

CR, LF, U+2028, atau U+2029 dapat mengakhiri komentar shell.

Langkah 4

Aplikasi menjalankan keluaran melalui shell

Interpretasi yang didokumentasikan hanya berlaku bagi pemanggil yang meneruskan keluaran ke shell POSIX.

Langkah 5

Pembaruan menolak urutan berbahaya

Versi 1.11.0 mencatat status komentar dan melempar kesalahan jika string selanjutnya berisi terminator baris.

Kode Sumber: Rentan vs Aman

Cuplikan rentan memeriksa terminator baris pada token komentar, tetapi tidak mencatat status untuk string berikutnya. Perubahan upstream mencatat bahwa komentar telah dikeluarkan dan menolak string selanjutnya yang berisi terminator baris. Cuplikan ini menjelaskan batas parsing dan pengutipan; ini bukan exploit atau perintah shell.

Cuplikan sumber: quote.js — focused upstream diff hunks

IMPLEMENTASI RENTAN
// quote.js sebelum commit 6002b2e — bagian khusus token komentar
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;
}
PERBAIKAN AMAN & KUAT
// quote.js setelah commit 6002b2e — bagian persis dari guard baru dan status komentar
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;
  }
});

Daftar Periksa Penguatan Sistem Rekayasa

Sumber