Алексей Махоткин

домашняя страница

Trinity: Fuzz-тестирование системных вызовов Linux

Очень интересный проект Trinity предназначен для fuzz-тестирования системных вызовов ядра Linux.

Каждый системный вызов аннотирован информацией об аргументах системного вызова — например, является ли аргумент набором флагов, адресом памяти или номером файлового дескриптора. При работе Trinity генерирует случайные входные данные для каждого известного syscall, и вызывает его. Так как структура аргументов известна, то эффективность тестирования существенно выше, чем при использовании наивного тестирования, которое просто генерирует случайные числа и скармливает их ядру. Например, можно особое внимание уделить адресам памяти, которые находятся рядом с четырехкилобайтными границами страниц, чтобы отлавливать ошибки off-by-one.

Практика, описанная в статье ”LCA: The Trinity fuzz tester” на прекрасном ресурсе LWN.net, демонстрирует интересные результаты. За 2012 год только сам автор обнаружил больше 150 багов в ядре. Еще больше багов нашли другие пользователи системы. Помимо багов в коде системных вызовов, были обнаружены различные проблемы с сетевой и дисковой подсистемами, а также в многочисленных драйверах. При тестировании системного вызова execve также можно очень быстро обнаружить множество ошибок в системных утилитах, которые запускаются со случайными аргументами командной строки (и падают от того).

В планах автора, помимо прочего — улучшение работы с системным вызовом ioctl, который в силу своей природы традиционно неряшлив — как по структуре (диспетчеризация через номер запроса), так и в силу того, что в коде для работы с оборудованием сложно обработать все возможные варианты.

Comments