Pepijat suntikan HTML tersimpan dalam papan kerja RamenHire membolehkan sesiapa sahaja mengisi borang awam dan menukarkan e-mel pemberitahuan pasukan menjadi platform pemancingan data (phishing).
Bagaimana pepijat ini terlepas
RamenHire berjalan di atas Next.js dan Supabase serta membolehkan syarikat pemula (startups) menyiarkan kerja tanpa perlu log masuk. Setiap penghantaran mencetuskan e-mel kepada pasukan pengambilan pekerja dalaman. Kandungan e-mel dibina dengan mencantumkan medan borang mentah—nama syarikat, huraian kerja, nama kenalan—secara terus ke dalam rentetan (string) HTML. Tiada proses escaping atau sanitasi berlaku sebelum rentetan tersebut sampai ke perkhidmatan e-mel.
Oleh kerana templat tersebut menganggap input pengguna sebagai HTML yang selamat, pemohon berniat jahat boleh menyuntik pautan palsu "klik di sini untuk pengesahan". Payload tersebut disimpan pada pelayan sebagai sebahagian daripada senarai kerja, jadi setiap e-mel pemberitahuan seterusnya akan membawa kod berniat jahat tersebut. Penyerang boleh menyembunyikan pautan itu bersebelahan dengan butang "View Dashboard" yang sebenar, memperdaya ahli pasukan untuk mendedahkan kredensial atau melawat laman pemancingan data.
Mengapa ia penting
E-mel tersebut dihantar kepada kru pengambilan pekerja teras, iaitu individu yang sentiasa mengklik pautan untuk menggerakkan calon melalui proses pengambilan.
Jurang teknikal
Escaping HTML bukanlah satu langkah tunggal. Dua konteks memerlukan perlindungan:
- Text nodes – kandungan di antara tag. Menukarkan
<kepada<dan>kepada>dapat menghalang tag, tetapi tidak menghalang penyerang daripada keluar daripada nilai atribut. - Attribute values – rentetan di dalam tag seperti
href="…". Menyuntik tanda petikan ("atau') membolehkan penyerang menutup atribut lebih awal dan memasukkan penanda (markup) mereka sendiri.
Kod asal hanya mengendalikan teks biasa, menyebabkan suntikan atribut terbuka luas.
Memperbaiki masalah
Pembangun menambah pembantu (helper) escapeHtml yang kecil dan mengaplikasikannya kepada setiap nilai yang dibekalkan pengguna sebelum interpolasi, sama ada nilai tersebut berakhir dalam text node atau atribut.
Langkah pengesahan
- Ujian tempatan (Local testing) – Satu set rentetan suntikan dimasukkan ke dalam fungsi templat. Setiap ujian hanya menunjukkan aksara yang telah di-escape, tanpa sebarang tag yang boleh dilaksanakan.
- Ujian pengeluaran (Production testing) – Selepas melaksanakan tampalan (patch), satu payload dihantar melalui laman web langsung, melepasi semakan bot Cloudflare Turnstile. E-mel yang terhasil masuk ke dalam peti masuk pembangun; pautan berniat jahat dan sebarang tag skrip muncul sebagai teks yang tidak bermakna, bukannya elemen yang boleh diklik.
Nota tentang Gmail: perkhidmatan tersebut mungkin masih mewarnakan URL dengan warna biru dan menjadikannya boleh diklik, tetapi itu adalah kemudahan di bahagian klien (client-side) dan tidak bermakna suntikan HTML telah berjaya. Pembaikan tersebut menghalang suntikan daripada mencipta butang sebenar atau menjalankan skrip.
Perkara yang perlu diperhatikan oleh pembangun
- Jangan sesekali mempercayai data daripada borang awam – Walaupun borang kelihatan tidak berbahaya, ia boleh menghasilkan output tersimpan yang digunakan di tempat lain.
- Lakukan escaping pada titik penggunaan – Gunakan escaping yang peka konteks (teks vs. atribut) sejurus sebelum paparan (rendering), bukan lebih awal dalam saluran (pipeline).
- Uji kedua-dua bahagian klien dan pelayan – Ujian unit dapat mengesan kegagalan yang nyata; ujian hujung-ke-hujung (end-to-end) secara manual melalui UI langsung mengesahkan pertahanan kekal teguh di bawah trafik sebenar.
- Sedar tentang keunikan klien e-mel – Sesetengah klien memautkan URL secara automatik, mewujudkan rasa selamat yang palsu. Sahkan bahawa HTML asas tidak mengandungi sebarang elemen aktif.
Kesimpulan
Satu kecuaian dalam mengendalikan input pengguna telah menukarkan e-mel pemberitahuan rutin menjadi vektor pemancingan data. Memperkenalkan rutin HTML-escaping yang komprehensif dan mengesahkan pembaikan secara tempatan serta dalam pengeluaran telah memulihkan integriti peti masuk. Insiden ini menekankan pengajaran abadi bagi mana-mana aplikasi web yang menjana HTML daripada data yang tidak dipercayai: sanitasi yang betul adalah wajib, dan mengabaikannya boleh membuka ruang terus ke dalam peti masuk pengguna anda.
