Un archivo de modelo de 65 bytes puede detener abruptamente el popular motor de inferencia Llama CPP. La diminuta carga útil provoca una división por cero dentro del analizador, produciendo un error de tipo SIGFPE.

Por qué es importante el error

Qué salió mal

El analizador lee los metadatos del modelo en estructuras de C++ y comprueba que cada dimensión del tensor sea “no negativa”. El cero cumple esa condición, por lo que la comprobación se supera. La siguiente línea de código utiliza entonces la dimensión como divisor en un cálculo que asume que el valor es positivo. Cuando la dimensión es cero, la división lanza una excepción de punto flotante (SIGFPE) y termina el programa.

La validación solo cubría la mitad de la invariante necesaria: bloqueaba los valores negativos pero ignoraba el cero, lo cual es igual de inseguro para la aritmética posterior.

Qué deben hacer los desarrolladores

  • Traten los archivos de modelo como binarios. La carga de un modelo analiza bytes sin procesar en estructuras de memoria, un límite clásico donde los datos no verificados pueden hacer que el proceso falle o incluso algo peor.
  • Eviten las comprobaciones parciales. Una condición que cubre solo parte de la invariante requerida genera una falsa sensación de seguridad. En este caso, “no negativo” era insuficiente; el código necesitaba que fuera “positivo”.
  • Cuestionen las suposiciones después de cada comprobación. Cuando aparezca una prueba de límites, verifiquen que el código siguiente no dependa de una propiedad más estricta.
  • Empleen herramientas de fuzzing. El autor descubrió el error ejecutando libFuzzer con AddressSanitizer, que muta las entradas y señala operaciones ilegales como la división por cero.

Cómo se aplicó la solución

La solución añade una guarda que omite el cálculo de desbordamiento cuando una dimensión es igual a cero. Este pequeño condicional preserva el soporte para tensores legítimos de tamaño cero —utilizados en algunas variantes de modelos para funciones opcionales— al tiempo que elimina la ruta de error.

Conclusión: Un solo archivo de 65 bytes puede desactivar un motor de inferencia ampliamente desplegado; una validación exhaustiva y un fuzzing sistemático mantienen seguros a los cargadores de modelos.

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