Sebuah fail model bersaiz 65-bait boleh menyebabkan enjin inferens Llama CPP yang popular terhenti secara tiba-tiba. Payload yang sangat kecil ini mencetuskan ralat pembahagian dengan sifar di dalam parser, yang mengakibatkan kegagalan SIGFPE.

Mengapa kegagalan ini penting

Apa yang telah berlaku

Parser membaca metadata model ke dalam struktur C++ dan menyemak bahawa setiap dimensi tensor adalah “bukan negatif”. Sifar memenuhi syarat tersebut, jadi semakan itu lulus. Baris kod seterusnya kemudian menggunakan dimensi tersebut sebagai pembahagi dalam pengiraan yang mengandaikan nilai tersebut adalah positif. Apabila dimensi adalah sifar, pembahagian tersebut mencetuskan pengecualian titik apungan (floating-point exception - SIGFPE) dan menamatkan program.

Pengesahan tersebut hanya merangkumi separuh daripada invarian yang diperlukan: ia menyekat nilai negatif tetapi mengabaikan sifar, yang mana ia sama tidak selamat untuk aritmetik yang menyusul.

Apa yang perlu dilakukan oleh pembangun

  • Layan fail model seperti binari. Memuatkan model melibatkan proses parsing bait mentah ke dalam struktur memori, iaitu sempadan klasik di mana data yang tidak disemak boleh menyebabkan proses terhenti atau lebih buruk lagi.
  • Elakkan semakan separa. Syarat yang hanya merangkumi sebahagian daripada invarian yang diperlukan memberikan rasa selamat yang palsu. Dalam kes ini, “bukan negatif” adalah tidak mencukupi; kod tersebut memerlukan nilai “positif”.
  • Pertikaikan andaian selepas setiap semakan. Apabila ujian sempadan (bounds test) dilakukan, sahkan bahawa kod yang menyusul tidak bergantung pada sifat yang lebih ketat.
  • Gunakan alatan fuzzing. Penulis menemui pepijat ini dengan menjalankan libFuzzer bersama AddressSanitizer, yang mengubah suai input dan menandakan operasi haram seperti pembahagian dengan sifar.

Bagaimana pembaikan dilaksanakan

Pembaikan tersebut menambah satu kawalan (guard) yang melangkau pengiraan limpahan (overflow) apabila dimensi bersamaan dengan sifar. Syarat kecil ini mengekalkan sokongan untuk tensor bersaiz sifar yang sah—yang digunakan dalam beberapa varian model untuk ciri pilihan—sambil menghapuskan laluan kegagalan (crash path).

Rumusan: Sebuah fail 65-bait sahaja boleh melumpuhkan enjin inferens yang digunakan secara meluas; pengesahan yang menyeluruh dan fuzzing yang sistematik memastikan pemuat model kekal selamat.

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