Un fichier de modèle de 65 octets peut provoquer l'arrêt brutal du célèbre moteur d'inférence Llama CPP. Cette charge utile minuscule déclenche une division par zéro à l'intérieur de l'analyseur, produisant un plantage SIGFPE.

Pourquoi ce plantage est important

Ce qui s'est passé

L'analyseur lit les métadonnées du modèle dans des structures C++ et vérifie que chaque dimension de tenseur est « non négative ». Le zéro satisfait cette condition, la vérification est donc validée. La ligne de code suivante utilise ensuite la dimension comme diviseur dans un calcul qui suppose que la valeur est positive. Lorsque la dimension est égale à zéro, la division génère une exception de point flottant (SIGFPE) et interrompt le programme.

La validation ne couvrait que la moitié de l'invariant nécessaire : elle bloquait les valeurs négatives mais ignorait le zéro, ce qui est tout aussi dangereux pour les calculs arithmétiques ultérieurs.

Ce que les développeurs devraient faire

  • Traitez les fichiers de modèles comme des binaires. Le chargement d'un modèle consiste à analyser des octets bruts pour les transformer en structures mémoire, une frontière classique où des données non vérifiées peuvent faire planter le processus ou pire encore.
  • Évitez les vérifications partielles. Une condition qui ne couvre qu'une partie de l'invariant requis donne un faux sentiment de sécurité. Ici, « non négatif » était insuffisant ; le code nécessitait une valeur « positive ».
  • Remettez en question les hypothèses après chaque vérification. Lorsqu'un test de limites apparaît, vérifiez que le code suivant ne repose pas sur une propriété plus stricte.
  • Utilisez des outils de fuzzing. L'auteur a découvert le bug en exécutant libFuzzer avec AddressSanitizer, qui fait muter les entrées et signale les opérations illégales comme la division par zéro.

Comment le correctif a été appliqué

Le correctif ajoute une garde qui ignore le calcul de dépassement lorsque la dimension est égale à zéro. Cette minuscule conditionnelle préserve la prise en charge des tenseurs de taille zéro légitimes — utilisés dans certaines variantes de modèles pour des fonctionnalités optionnelles — tout en éliminant le chemin menant au plantage.

À retenir : Un simple fichier de 65 octets peut paralyser un moteur d'inférence largement déployé ; une validation rigoureuse et un fuzzing systématique assurent la sécurité des chargeurs de modèles.

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