A 65-byte model file can bring the popular Llama CPP inference engine to an abrupt halt. The tiny payload triggers a division-by-zero inside the parser, producing a SIGFPE crash.
Почему этот сбой важен
Что пошло не так
Парсер считывает метаданные модели в структуры C++ и проверяет, чтобы каждое измерение тензора было «неотрицательным». Ноль удовлетворяет этому условию, поэтому проверка проходит успешно. Следующая строка кода использует это измерение в качестве делителя в вычислении, которое предполагает, что значение является положительным. Когда измерение равно нулю, деление вызывает исключение с плавающей точкой (SIGFPE) и завершает работу программы.
Валидация охватывала лишь половину необходимого инварианта: она блокировала отрицательные значения, но игнорировала ноль, что столь же небезопасно для последующих арифметических операций.
Что должны делать разработчики
- Относитесь к файлам моделей как к бинарным файлам. Загрузка модели подразумевает парсинг сырых байтов в структуры памяти — это классическая граница, где непроверенные данные могут привести к сбою процесса или к чему-то худшему.
- Избегайте частичных проверок. Условие, которое охватывает лишь часть необходимого инварианта, создает ложное чувство безопасности. В данном случае «неотрицательного» значения было недостаточно; коду требовалось «положительное».
- Ставьте под сомнение предположения после каждой проверки. Если встречается проверка границ, убедитесь, что последующий код не полагается на более строгое свойство.
- Используйте инструменты фаззинга. Автор обнаружил баг, запустив libFuzzer вместе с AddressSanitizer, который мутирует входные данные и фиксирует недопустимые операции, такие как деление на ноль.
Как было применено исправление
Исправление добавляет защитную проверку, которая пропускает вычисление переполнения, если измерение равно нулю. Это небольшое условие сохраняет поддержку легитимных тензоров нулевого размера — используемых в некоторых вариантах моделей для необязательных функций — одновременно устраняя путь к сбою.
Итог: Один-единственный файл размером 65 байт может вывести из строя широко используемый движок инференса; тщательная валидация и систематический фаззинг обеспечивают безопасность загрузчиков моделей.
Источник: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
