Een modelbestand van 65 bytes kan de populaire Llama CPP inference engine abrupt tot stilstand brengen. De minuscule payload veroorzaakt een deling door nul in de parser, wat resulteert in een SIGFPE-crash.

Waarom de crash ertoe doet

Wat er misging

De parser leest modelmetadata in C++-structuren en controleert of elke tensordimensie "niet-negatief" is. Nul voldoet aan die voorwaarde, waardoor de controle wordt doorgelaten. De volgende regel code gebruikt de dimensie vervolgens als divisor in een berekening die ervan uitgaat dat de waarde positief is. Wanneer de dimensie nul is, werpt de deling een floating-point exception (SIGFPE) en wordt het programma beëindigd.

De validatie dekte slechts de helft van de benodigde invariant: het blokkeerde negatieve waarden, maar negeerde nul, wat net zo onveilig is voor de daaropvolgende rekenkundige bewerkingen.

Wat ontwikkelaars moeten doen

  • Behandel modelbestanden als binaries. Het laden van een model parseert ruwe bytes naar geheugenstructuren, een klassieke grens waar ongecontroleerde data het proces kan laten crashen of erger kan doen.
  • Vermijd gedeeltelijke controles. Een voorwaarde die slechts een deel van de vereiste invariant dekt, geeft een vals gevoel van veiligheid. In dit geval was "niet-negatief" onvoldoende; de code had "positief" nodig.
  • Stel aannames ter discussie na elke controle. Wanneer er een grenstest wordt uitgevoerd, controleer dan of de daaropvolgende code niet vertrouwt op een striktere eigenschap.
  • Gebruik fuzzing-tools. De auteur ontdekte de bug door libFuzzer te draaien met AddressSanitizer, wat inputs muteert en illegale operaties zoals deling door nul signaleert.

Hoe de fix is toegepast

De fix voegt een guard toe die de overflow-berekening overslaat wanneer een dimensie gelijk is aan nul. Deze kleine conditional behoudt de ondersteuning voor legitieme tensors met een grootte van nul — die in sommige modelvarianten worden gebruikt voor optionele functies — terwijl het pad naar de crash wordt geëlimineerd.

Takeaway: Een enkel bestand van 65 bytes kan een breed ingezette inference engine platleggen; grondige validatie en systematische fuzzing houden model loaders veilig.

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