Psyzkaller: Learning from Historical and On-the-Fly Execution Data for Smarter Seed Generation in OS kernel Fuzzing
Liu, Zhang, Cheng et al.
Fuzzing has become a cornerstone technique for uncovering vulnerabilities and enhancing the security of OS kernels. However, state-of-the-art kernel fuzzers, including the de facto standard Syzkaller, struggle to generate valid syscall sequences that respect implicit Syscall Dependency Relations (SDRs). Consequently, many generated seeds either fail kernel validation or cannot penetrate deep execution paths, resulting in significant inefficiency.
We hypothesize that SDRs can be effectively learned from both historic and present kernel execution data, and that incorporating these learned relations into fuzzing can substantially improve seed validity and diversity. To validate this, we propose an approach that utilizes the N-gram model to mine SDRs from the Dongting dataset-one of the largest Linux kernel execution datasets available-as well as from execution traces collected on the fly during fuzzing. The resulting model is used to continuously augment the Choice Table of Syzkaller to improve its seed generation and demonstrably increases the Shannon Entropy of the Choice Table throughout fuzzing, reflecting more empirically-grounded choices in expanding syscall sequences into valid and diverse seeds. In addition, we introduce a Random Walk strategy that instructs Syzkaller to construct seeds in a bidirectional manner to further diversify the generated seeds.
We implement our approach in a prototype, Psyzkaller, built on top of Syzkaller. Experiments on three representative Linux kernel versions show that Psyzkaller improves Syzkaller's code coverage by 4.6%-7.0% in 48-hour fuzzing, while triggering 110.4%-187.2% more crashes. Moreover, our investigation shows that Psyzkaller discovered eight previously unknown kernel vulnerabilities, compared to only one found by Syzkaller.
academic
Psyzkaller: Обучение на исторических и оперативных данных выполнения для более умного генерирования начальных значений при фаззинге ядра ОС
Фаззинг стал краеугольным камнем технологии обнаружения уязвимостей ядра операционной системы и повышения безопасности. Однако передовые фаззеры ядра, включая де-факто стандарт Syzkaller, испытывают трудности при генерировании эффективных последовательностей системных вызовов, которые соответствуют неявным зависимостям между системными вызовами (SDRs). Следовательно, многие сгенерированные начальные значения либо не проходят проверку ядра, либо не могут глубоко проникнуть в пути выполнения, что приводит к значительной неэффективности. В данной работе предполагается, что SDRs могут быть эффективно изучены из исторических и текущих данных выполнения ядра, и что включение этих изученных отношений в фаззинг может значительно повысить валидность и разнообразие начальных значений. Для проверки этого предположения авторы предлагают метод, использующий N-граммовую модель для извлечения SDRs из набора данных DongTing (одного из крупнейших наборов данных выполнения ядра Linux) и траекторий выполнения, собираемых в реальном времени во время фаззинга.
Ядро операционной системы является критическим компонентом современных вычислительных платформ, и компрометация на уровне ядра позволяет злоумышленникам получить полный контроль над системой. Основные проблемы, с которыми сталкиваются текущие фаззеры ядра:
Сложность идентификации зависимостей системных вызовов (SDRs): Многие сгенерированные последовательности системных вызовов (SCS) являются недействительными из-за нарушения SDRs
Неэффективность генерирования начальных значений: Недействительные тестовые случаи преждевременно завершаются, внося минимальный вклад в исследование кода
Сложность достижения глубоких путей выполнения: Отсутствие понимания семантических ограничений между системными вызовами
Авторы предлагают новый подход к изучению SDRs непосредственно из траекторий выполнения ядра, сочетая широкое покрытие исторических данных с адаптивностью онлайн-обучения.
Предложена новая стратегия изучения SDRs путем объединения исторических и оперативных данных выполнения ядра, сочетающая широкое покрытие и адаптивность к версиям ядра
Разработан прототип Psyzkaller, интегрирующий обучение SDRs на основе Bigram и стратегию RandomWalk в рабочий процесс Syzkaller
Использован предварительный тренинг на крупнейшем историческом наборе данных выполнения ядра Linux (DongTing) для модели Bigram
Подтверждена эффективность на трех репрезентативных версиях ядра Linux, демонстрирующая превосходство в покрытии ветвей и обнаружении уязвимостей
Входные данные: Исторический набор данных выполнения ядра C и результаты фаззинга в реальном времени
Выходные данные: Улучшенная таблица выбора для направления более эффективного генерирования последовательностей системных вызовов
Цель: Повышение валидности начальных значений, разнообразия и способности обнаружения уязвимостей
Построение матрицы RPM, где RPM[i]j записывает вероятность вызова системного вызова wj сразу после wi.
Алгоритм 1: LearnSDR
Входные данные: C (корпус последовательностей системных вызовов), CallNum (общее количество системных вызовов в ядре)
Выходные данные: M (N-граммовая модель, изученная из C)
1. Инициализировать матрицу M и массив счетчиков Count
2. Для каждой последовательности sc в корпусе C:
- Подсчитать последовательно появляющиеся пары системных вызовов
- Обновить статистику счетчиков
3. Вычислить вероятности переходов: M[i][j] = M[i][j] / Count[i]
Статья ссылается на 44 связанные работы, охватывающие:
Инструменты фаззинга ядра (Syzkaller, Healer и т.д.)
Методы машинного обучения (N-граммы, Word2Vec, Transformers)
Наборы данных выполнения ядра (DongTing, ADFA-LD и т.д.)
Методы извлечения зависимостей системных вызовов
Общая оценка: Это высококачественная исследовательская работа в области безопасности систем, предлагающая инновационный метод, управляемый данными, для решения ключевых проблем фаззинга ядра. Экспериментальный дизайн строг, результаты убедительны, работа имеет значительную академическую ценность и практическое значение.