Plik modelu o rozmiarze 65 bajtów może doprowadzić do nagłego zatrzymania popularnego silnika wnioskowania Llama CPP. Ten maleńki ładunek wywołuje dzielenie przez zero wewnątrz parsera, co skutkuje awarią typu SIGFPE.

Dlaczego ta awaria jest istotna

Co poszło nie tak

Parser wczytuje metadane modelu do struktur C++ i sprawdza, czy każdy wymiar tensora jest „nieujemny”. Zero spełnia ten warunek, więc sprawdzenie kończy się sukcesem. Następna linia kodu wykorzystuje ten wymiar jako dzielnik w obliczeniu, które zakłada, że wartość jest dodatnia. Gdy wymiar wynosi zero, dzielenie powoduje wyjątek zmiennoprzecinkowy (SIGFPE) i przerywa działanie programu.

Walidacja obejmowała tylko połowę wymaganej niezmienniczości: blokowała wartości ujemne, ale ignorowała zero, które jest równie niebezpieczne dla późniejszych operacji arytmetycznych.

Co powinni robić programiści

  • Traktuj pliki modeli jak pliki binarne. Wczytywanie modelu polega na parsowaniu surowych bajtów do struktur pamięci – to klasyczna granica, na której niezweryfikowane dane mogą doprowadzić do awarii procesu lub czegoś gorszego.
  • Unikaj częściowych sprawdzeń. Warunek, który obejmuje tylko część wymaganej niezmienniczości, daje fałszywe poczucie bezpieczeństwa. W tym przypadku „nieujemność” okazała się niewystarczająca; kod wymagał wartości „dodatniej”.
  • Podważaj założenia po każdym sprawdzeniu. Gdy pojawia się test zakresu, upewnij się, że następujący po nim kod nie opiera się na surowszej właściwości.
  • Stosuj narzędzia do fuzzingu. Autor odkrył błąd, uruchamiając libFuzzer wraz z AddressSanitizer, który mutuje dane wejściowe i flaguje nielegalne operacje, takie jak dzielenie przez zero.

Jak zastosowano poprawkę

Poprawka dodaje mechanizm ochronny, który pomija obliczenia przepełnienia, gdy wymiar wynosi zero. Ta niewielka instrukcja warunkowa zachowuje wsparcie dla prawidłowych tensorów o zerowym rozmiarze – używanych w niektórych wariantach modeli do opcjonalnych funkcji – jednocześnie eliminując ścieżkę prowadzącą do awarii.

Wniosek: Pojedynczy, 65-bajtowy plik może unieruchomić szeroko stosowany silnik wnioskowania; dokładna walidacja i systematyczny fuzzing zapewniają bezpieczeństwo ładowarek modeli.

Źródło: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap