flawopen.com/Teardowns/cve-2026-102422-shell-quote-comment-line-terminator-injection
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.
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
Token mencapai fungsi pengutipan
Aplikasi menyusun token yang berisi komentar dan string setelahnya; penyerang harus dapat memengaruhi urutan itu.
Fungsi mengeluarkan sintaks komentar
Sebelum 1.11.0, quote() memeriksa teks komentar, tetapi tidak mengingat adanya string setelah komentar.
Token berikutnya memuat batas baris
CR, LF, U+2028, atau U+2029 dapat mengakhiri komentar shell.
Aplikasi menjalankan keluaran melalui shell
Interpretasi yang didokumentasikan hanya berlaku bagi pemanggil yang meneruskan keluaran ke shell POSIX.
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
// 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;
}
// 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
- ✓Perbarui dependensi langsung dan transitif
shell-quoteke 1.11.0 atau lebih baru; periksa lockfile dan artefak yang diterapkan. - ✓Jangan menganggap
quote()aman untuk semua konteks atau sebagai pengganti menghindari shell. - ✓Jika memungkinkan, jalankan executable tetap dengan larik argumen dan
shell: false; validasi setiap argumen sesuai program tujuan. - ✓Jika shell tidak dapat dihindari, pertahankan struktur perintah dan tolak urutan token komentar yang diikuti terminator sebelum pemanggilan.
- ✓Tambahkan pengujian regresi untuk CR, LF, U+2028, dan U+2029 dalam string selanjutnya, termasuk token dari
parse(). - ✓Tinjau titik pemanggilan yang meneruskan token terpengaruh penyerang ke
quote()lalu menjalankan hasilnya; penggunaan paket saja tidak membuktikan keterpaparan. - ✓Jangan menyimpulkan status paket Ubuntu dari versi npm; periksa advisori distribusi yang tepat.