Eine 65-Byte große Modelldatei kann die populäre Llama.cpp-Inference-Engine abrupt zum Stillstand bringen. Die winzige Nutzlast löst eine Division durch Null innerhalb des Parsers aus, was zu einem SIGFPE-Absturz führt.

Warum der Absturz von Bedeutung ist

Was schiefgelaufen ist

Der Parser liest Modelldaten in C++-Strukturen ein und prüft, ob jede Tensor-Dimension „nicht negativ“ ist. Null erfüllt diese Bedingung, sodass die Prüfung erfolgreich ist. Die darauffolgende Codezeile verwendet die Dimension dann als Divisor in einer Berechnung, die davon ausgeht, dass der Wert positiv ist. Wenn die Dimension Null ist, löst die Division eine Gleitkomma-Ausnahme (SIGFPE) aus und beendet das Programm.

Die Validierung deckte nur die Hälfte der erforderlichen Invariante ab: Sie blockierte negative Werte, ignorierte jedoch die Null, was für die anschließende Arithmetik ebenso unsicher ist.

Was Entwickler tun sollten

  • Behandeln Sie Modelldateien wie Binärdateien. Das Laden eines Modells parst Rohbytes in Speicherstrukturen – eine klassische Schnittstelle, an der ungeprüfte Daten den Prozess zum Absturz bringen oder Schlimmeres verursachen können.
  • Vermeiden Sie Teilprüfungen. Eine Bedingung, die nur einen Teil der erforderlichen Invariante abdeckt, vermittelt ein falsches Gefühl von Sicherheit. In diesem Fall war „nicht negativ“ unzureichend; der Code benötigte „positiv“.
  • Hinterfragen Sie Annahmen nach jeder Prüfung. Wenn eine Bereichsprüfung erscheint, verifizieren Sie, ob der nachfolgende Code auf einer strengeren Eigenschaft basiert.
  • Setzen Sie Fuzzing-Tools ein. Der Autor entdeckte den Fehler durch die Ausführung von libFuzzer mit AddressSanitizer, welches Eingaben mutiert und illegale Operationen wie die Division durch Null meldet.

Wie der Fix angewendet wurde

Der Fix fügt eine Schutzmaßnahme hinzu, die die Überlaufberechnung überspringt, wenn eine Dimension Null ist. Diese winzige Bedingung erhält die Unterstützung für legitime Tensoren mit der Größe Null – die in einigen Modellvarianten für optionale Funktionen verwendet werden – und eliminiert gleichzeitig den Absturzpfad.

Fazit: Eine einzige 65-Byte große Datei kann eine weit verbreitete Inference-Engine lahmlegen; gründliche Validierung und systematisches Fuzzing halten Model-Loader sicher.

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