65 baytlık bir model dosyası, popüler Llama CPP çıkarım motorunu aniden durdurabilir. Bu küçücük veri yükü, ayrıştırıcı içinde bir sıfıra bölünme hatasını tetikleyerek bir SIGFPE çökmesine neden olur.
Çökmenin önemi
Ne yanlış gitti
Ayrıştırıcı, model meta verilerini C++ yapılarına okur ve her bir tensör boyutunun “negatif olmadığını” kontrol eder. Sıfır bu koşulu karşıladığı için kontrol başarıyla geçer. Bir sonraki kod satırı ise boyutu, değerin pozitif olduğunu varsayan bir hesaplamada bölen olarak kullanır. Boyut sıfır olduğunda, bölme işlemi bir kayan nokta istisnası (SIGFPE) fırlatır ve programı sonlandırır.
Doğrulama, gereken değişmezin (invariant) yalnızca yarısını kapsıyordu: negatif değerleri engelledi ancak sonraki aritmetik işlemler için aynı derecede güvensiz olan sıfırı göz ardı etti.
Geliştiriciler ne yapmalı
- Model dosyalarına ikili dosyalar (binaries) gibi davranın. Bir modeli yüklemek, ham baytları bellek yapılarına ayrıştırır; bu, denetlenmemiş verilerin süreci çökertebileceği veya daha kötüsüne yol açabileceği klasik bir sınır noktasıdır.
- Kısmi kontrollerden kaçının. Gerekli değişmezin yalnızca bir kısmını kapsayan bir koşul, yanlış bir güvenlik hissi verir. Burada “negatif olmama” durumu yetersizdi; kodun “pozitif” değerlere ihtiyacı vardı.
- Her kontrolden sonra varsayımları sorgulayın. Bir sınır testi yapıldığında, takip eden kodun daha katı bir özelliğe dayanmadığından emin olun.
- Fuzzing araçları kullanın. Yazar, girdileri mutasyona uğratan ve sıfıra bölünme gibi yasa dışı işlemleri işaretleyen AddressSanitizer ile libFuzzer'ı çalıştırarak hatayı ortaya çıkardı.
Düzeltme nasıl uygulandı
Düzeltme, bir boyut sıfıra eşit olduğunda taşma (overflow) hesaplamasını atlayan bir koruma (guard) ekler. Bu küçük koşullu ifade, bazı model varyantlarında isteğe bağlı özellikler için kullanılan meşru sıfır boyutlu tensörlere olan desteği korurken, çökme yolunu ortadan kaldırır.
Sonuç: Tek bir 65 baytlık dosya, yaygın olarak kullanılan bir çıkarım motorunu kapatabilir; kapsamlı doğrulama ve sistematik fuzzing, model yükleyicileri güvenli tutar.
Kaynak: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
