Sebuah file model berukuran 65-byte dapat menghentikan mesin inferensi Llama CPP yang populer secara tiba-tiba. Payload kecil tersebut memicu pembagian dengan nol (division-by-zero) di dalam parser, yang menghasilkan crash SIGFPE.

Mengapa crash ini penting

Apa yang salah

Parser membaca metadata model ke dalam struktur C++ dan memeriksa apakah setiap dimensi tensor bersifat “non-negatif”. Angka nol memenuhi kondisi tersebut, sehingga pemeriksaan lolos. Baris kode berikutnya kemudian menggunakan dimensi tersebut sebagai pembagi dalam perhitungan yang mengasumsikan nilainya positif. Ketika dimensinya adalah nol, pembagian tersebut memicu pengecualian titik mengambang (floating-point exception/SIGFPE) dan menghentikan program.

Validasi tersebut hanya mencakup setengah dari invarian yang diperlukan: ia memblokir nilai negatif tetapi mengabaikan nol, yang sama tidak amannya untuk operasi aritmatika berikutnya.

Apa yang harus dilakukan pengembang

  • Perlakukan file model seperti biner. Memuat model berarti memparsing byte mentah ke dalam struktur memori, sebuah batas klasik di mana data yang tidak diperiksa dapat menyebabkan crash pada proses atau bahkan hal yang lebih buruk.
  • Hindari pemeriksaan parsial. Kondisi yang hanya mencakup sebagian dari invarian yang diperlukan memberikan rasa aman yang palsu. Di sini, “non-negatif” tidaklah cukup; kode tersebut membutuhkan nilai “positif”.
  • Pertanyakan asumsi setelah setiap pemeriksaan. Ketika pengujian batas (bounds test) muncul, verifikasi bahwa kode berikutnya tidak bergantung pada properti yang lebih ketat.
  • Gunakan alat fuzzing. Penulis menemukan bug tersebut dengan menjalankan libFuzzer bersama AddressSanitizer, yang memutasi input dan menandai operasi ilegal seperti pembagian dengan nol.

Bagaimana perbaikan diterapkan

Perbaikan tersebut menambahkan guard yang melewati kalkulasi overflow saat dimensi bernilai nol. Kondisional kecil ini tetap mempertahankan dukungan untuk tensor berukuran nol yang sah—yang digunakan dalam beberapa varian model untuk fitur opsional—sekaligus menghilangkan jalur penyebab crash.

Kesimpulan: Sebuah file berukuran 65-byte saja dapat mematikan mesin inferensi yang digunakan secara luas; validasi yang menyeluruh dan fuzzing yang sistematis menjaga keamanan pemuat model (model loaders).

Sumber: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap