Skrip pembersihan yang dijalankan pada platform penerbitan laman web tersebut tersalah mengenal pasti petikan kod sebagai pemboleh ubah Liquid yang tidak sah dan membuangnya daripada setiap artikel yang mengandungi petikan tersebut. Gangguan tersebut menyebabkan berpuluh-puluh hantaran teknikal kehilangan kod contoh yang menjadi rujukan pembaca, sekali gus mencetuskan proses pengunduran (rollback) segera dan penilaian semula terhadap cara migrasi kandungan diuji.

Bagaimana pepijat tersebut terlepas

Platform tersebut menggunakan Liquid, sebuah bahasa templat yang menandakan kandungan dinamik dengan tag seperti {{ … }}. Satu tugasan penyelenggaraan rutin sepatutnya membuang tag tersasar yang boleh merosakkan paparan (rendering). Pengecam (parser) skrip tersebut mencari tag pembuka yang tidak mempunyai tag penutup yang sepadan dan, apabila menemuinya, ia memadamkan keseluruhan blok tersebut untuk "memperbaiki" ralat itu.

Dalam praktiknya, pengecam tersebut gagal mengenali tag {% raw %} dan {% endraw %} yang membungkus blok kod. Tag tersebut memberitahu Liquid untuk menganggap semua kandungan di dalamnya sebagai teks literal, tetapi skrip yang bermasalah itu menganggap {% raw %} sebagai pemboleh ubah yang tidak ditutup ({{% raw %}) dan membuang kod di sekelilingnya. Mesej ralat yang direkodkan adalah:

Liquid syntax error: Variable '{{% raw %}' was not properly terminated.

Oleh kerana skrip tersebut beroperasi pada repositori kandungan langsung (live), pemadaman berlaku secara besar-besaran, menghapuskan semua contoh kod daripada semua artikel yang terjejas dalam satu proses sahaja.

Apa yang terjejas

Artikel teknikal bergantung pada petikan kod untuk menjelaskan konsep, menghasilkan semula keputusan, dan membimbing pembaca melalui prosedur langkah demi langkah. Kehilangan blok-blok tersebut menjadikan hantaran tersebut hampir tidak berguna, memaksa penulis menulis semula kandungan, dan menghakis kepercayaan terhadap kebolehpercayaan platform tersebut. Bagi laman web yang membina reputasinya berasaskan dokumentasi pembangun yang berkualiti tinggi, insiden ini mengancam jumlah pembaca dan niat baik penyumbang.

Perincian yang sering terlepas pandang oleh pembaca

  • Pemprosesan berkelompok tanpa sandboxing – Skrip tersebut dijalankan terus pada data pengeluaran (production) dan bukannya pada salinan pementasan (staging).
  • Pengendalian tag yang tidak mencukupi – Hanya sebahagian kecil tag Liquid yang diambil kira; {% raw %} telah tertinggal daripada senarai putih (whitelist).
  • Kekurangan ujian berperingkat – Tugasan tersebut dilaksanakan pada keseluruhan set data tanpa ujian rintis pada sampel kecil.

Apa yang boleh mencegahnya

  • Jalankan migrasi pada salinan – Laksanakan sebarang transformasi pukal pada versi pangkalan data dalam persekitaran ujian (sandboxed) terlebih dahulu.
  • Uji unit pengecam terhadap semua variasi tag – Sertakan kes ekstrem (edge cases) seperti blok raw, tag komen, dan struktur bersarang.
  • Pelaksanaan berperingkat – Proses jumlah artikel yang terhad, sahkan hasil, kemudian tingkatkan skala.

Hujah balas

Sesetengah pihak berpendapat bahawa menguji setiap skrip pada sandaran penuh adalah tidak praktikal bagi laman web yang bergerak pantas, dan risiko kehilangan data adalah lebih kecil berbanding keperluan untuk pembaikan segera. Walaupun kelajuan itu penting, kos untuk membatalkan pemadaman besar-besaran – baik dari segi masa pembangun mahupun kerosakan reputasi – sering kali melebihi kelewatan yang disebabkan oleh pelaksanaan yang berhati-hati.

Apa yang perlu diperhatikan seterusnya

Pasukan tersebut telah memulihkan kod yang hilang daripada sandaran dan sedang menyemak semula alat pembersihan untuk mengenali semua binaan Liquid. Mereka merancang untuk menerbitkan laporan pasca-mortem yang memperincikan aliran kerja ujian yang dikemas kini, dan berkongsi skrip yang telah disemak secara terbuka supaya penerbit lain dapat mengelakkan kesilapan yang sama. Insiden ini berfungsi sebagai peringatan: walaupun ralat pengecaman yang kecil boleh memadamkan usaha penulis selama berminggu-minggu, menjadikan ujian yang rapi sesuatu yang tidak boleh dikompromi.