В этой статье мы попрактикуемся в фаззинге ядра. Но сначала немного поговорим об истории и теории фаззинга, а также обсудим принцип работы нашей цели. Настроим и скомпилируем ядро Linux, настроим Syzkaller и приступим к поиску багов.
Готовые виртуалки можно найти на сайте osboxes.org. Там есть образы ВМ для VMware Player и VirtualBox.
Для этой статьи я взял образ Ubuntu для VirtualBox. Но ты волен выбрать любой другой дистрибутив и систему виртуализации.
Качаем Ubuntu 22.04 Jammy Jellyfish.
Пока виртуалка скачивается, повторим теорию про фаззинг и Syzkaller.
Термин «фаззинг» был впервые использован в научной статье «An Empirical Study of the Reliability of UNIX Utilities» в 1988 году. Однако сам метод фаззинга стал активно развиваться в начале двухтысячных годов благодаря работе исследователей и хакеров, которые широко использовали его для поиска уязвимостей в ПО.
Один из первых известных случаев успешного применения фаззинга был в 2005 году, когда команда исследователей безопасности нашла уязвимость в Internet Explorer, используя автоматический фаззинг. Этот случай показал, что фаззинг может быть эффективным инструментом для поиска уязвимостей даже в очень популярных продуктах.
Со временем фаззинг стал широко распространенным методом тестирования программ и используется как разработчиками, так и хакерами для поиска уязвимостей и повышения безопасности. А с появлением специализированных инструментов и фреймворков для фаззинга он стал еще доступнее и эффективнее.
В начале работы над Syzkaller Вьюков столкнулся с проблемой поиска и исправления уязвимостей в ядре Linux. Традиционные методы тестирования и ручного анализа кода оказались неэффективными из‑за сложности и объема кода ядра. Поэтому он решил создать инструмент, который позволил бы автоматизировать этот процесс.
Syzkaller был разработан как инструмент для генерации и запуска случайных тестов на ядре Linux. Он использует фаззеры для генерации случайных входных данных, которые передаются в системные вызовы ядра. Затем Syzkaller отслеживает поведение системы и реагирует на ошибки, падения или другие аномалии.
Со временем Syzkaller стал широко используемым инструментом в сообществе разработчиков ядра Linux и других операционных систем. Он помог выявить множество уязвимостей и ошибок в ядре, улучшить его качество и надежность.
Сегодня Syzkaller поддерживает не только ядро Linux, но и другие операционные системы, такие как FreeBSD, Fuchsia и даже Windows. Он продолжает развиваться и улучшаться благодаря вкладу сообщества разработчиков и исследователей безопасности.
Что ж, думаю, виртуалка уже скачалась, поэтому сворачиваем исторический экскурс и отправляемся заниматься практикой.
В архиве ты найдешь виртуальный диск, его нужно подключить при создании новой виртуалки.
В случае VirtualBox это выглядит так, как на рисунке ниже.
Очень важно включить вложенную виртуализацию, в этом поможет команда
И не забудь включить буфер обмена, чтобы можно было копировать команды в виртуалку.
Если копирование не заработает, то можно поставить в виртуалке openssh-server и просто работать с ней через SSH. Только перед этим нужно поменять у виртуалки тип соединения с NAT на сетевой мост.
Дальше узнаем адрес и подключаемся.
Я использую именно этот метод, поскольку работаю на выделенном сервере, а не в ВМ.
Перво‑наперво — Go. Фаззер написан на Golang, поэтому нам понадобится компилятор этого языка. Для сборки нужна версия 1.21 или старше.
Еще понадобится компилятор C и С++, а также ядро с включенным измерением покрытия кода (первое заполучить элементарно, второе — чуть сложнее), ну и, само собой, нужен Git. И еще всякое по мелочи, полный список есть в документации Syzkaller.
Напоминаю, пароль от скачанной виртуалки — osboxes.org.
С ядром разберемся чуть позже, а пока клонируем репозиторий Syzkaller и собираем проект.
Собранные бинарники будут находиться в директории bin.
Операция не особенно быстрая. Поэтому прервемся на очередной ликбез — я вкратце расскажу о том, как работает Syzkaller.
Компонент syz-manager отвечает за запуск и мониторинг виртуалок, генерацию входных данных и хранение корпуса фаззинга и крашей. Он же запускает syz-fuzzer.
Они взаимодействуют через RPC (remote procedure call): syz-manager передает syz-fuzzer программу, которую нужно запустить, а syz-fuzzer передает syz-manager результаты выполнения.
Затем syz-fuzzer запускает syz-execurtor, который выполняет переданную на вход программу с системными вызовами.
Весь процесс делится на четыре этапа, они описаны ниже.
Эта команда создаст конфиг. Далее вписываем в него параметры, необходимые для фаззинга. В этом нам поможет sed.
В конфигурации ядра активируется сбор покрытия кода, отладочная информация, санитайзер KASAN для обнаружения багов, специфичные для Debian опции и отключается механизм Predictable Network Interface Names. Подробнее — в документации.
После редактирования нужно перегенерить конфиг.
Все готово, собираем ядро. Это тоже займет какое‑то время, которое зависит от мощности машины.
Теперь запускаем make:
Должны появиться файлы vmlinux и bzImage. Проверить их наличие можно следующими командами:
Сначала понадобится установить инструмент debootstrap.
И следом создаем тот самый образ такими командами:
Результатом будет файл
Устанавливаем:
Проверяем, работает ли наш образ. Для этого запускаем его на QEMU. Понадобится второй терминал, чтобы проверить подключение к запущенному образу.
Нужно добавить текущего пользователя (в данном случае osboxes) в группу kvm.
И еще одно заклинание для KVM.
После этого нужно перелогиниться.
В текущем окне терминала должно появиться вот такое приглашение.
В другом окне терминала тоже подключаемся к виртуалке (или серверу), затем проверяем подключение к запущенному на QEMU образу.
Подключились, все работает, и теперь можно выключить систему. Вводим во втором терминале:
Машина выключится. Мы готовы к фаззингу ядра!
В конфиге нужно будет указать рабочую директорию, поэтому создадим ее:
Создаем конфиг Syzkaller:
В конфиге можно поменять количество процессоров (cpu) и оперативной памяти (ram), выделяемых каждой машине. Также можно указать количество виртуальных машин (count). Все зависит от возможностей машины.
Конфиг готов, можем запускать фаззинг!
После запуска пройдет какое‑то время, прежде чем появится коннект от тестовой машины.
Если очень долго нет коннекта, запусти фаззер снова, при этом передав флаг -debug, и внимательно смотри вывод, обычно там сразу видно, ели что‑то пошло не так. Например, может быть ошибка подключения по SSH.
У фаззера есть веб‑инерфейс.
Здесь можно посмотреть всю статистику. Также здесь будет отображаться информация о найденных багах. Для каждого приводится лог и исходный код программы, которая вызывает крэш ядра.
Чтобы смотреть эту страницу на хосте, убедись, что у виртуальной машины выбран тип адаптера «Сетевой мост».
И перед запуском Syzkaller нужно вписать в конфиг IP-адрес виртуальной машины (или IP-адрес сервера в случае VPS), вместо стандартного 127.0.0.1.
Желаю терпения в ожидании крашей! В качестве следующего шага можешь попробовать самостоятельно освоить фаззер ядра Trinity.
Автор sploitem
cyberprotect.ru
Источник xakep.ru
СТЕНД
Давай быстренько скачаем готовую виртуальную машину, чтобы не тратить время на ее разворачивание из ISO-образа.Готовые виртуалки можно найти на сайте osboxes.org. Там есть образы ВМ для VMware Player и VirtualBox.
Для этой статьи я взял образ Ubuntu для VirtualBox. Но ты волен выбрать любой другой дистрибутив и систему виртуализации.
Качаем Ubuntu 22.04 Jammy Jellyfish.
Пока виртуалка скачивается, повторим теорию про фаззинг и Syzkaller.
Краткая история фаззинга
Фаззинг (fuzzing) — это метод тестирования программ, который заключается в автоматической генерации и вводе случайных или некорректных данных в программу с целью поиска ошибок, уязвимостей и возможных сбоев.Термин «фаззинг» был впервые использован в научной статье «An Empirical Study of the Reliability of UNIX Utilities» в 1988 году. Однако сам метод фаззинга стал активно развиваться в начале двухтысячных годов благодаря работе исследователей и хакеров, которые широко использовали его для поиска уязвимостей в ПО.
Один из первых известных случаев успешного применения фаззинга был в 2005 году, когда команда исследователей безопасности нашла уязвимость в Internet Explorer, используя автоматический фаззинг. Этот случай показал, что фаззинг может быть эффективным инструментом для поиска уязвимостей даже в очень популярных продуктах.
Со временем фаззинг стал широко распространенным методом тестирования программ и используется как разработчиками, так и хакерами для поиска уязвимостей и повышения безопасности. А с появлением специализированных инструментов и фреймворков для фаззинга он стал еще доступнее и эффективнее.
Краткая история Syzkaller
Syzkaller — это инструмент для автоматизированного тестирования ядра операционной системы, разработанный Дмитрием Вьюковым. История Syzkaller началась примерно в 2014 году.В начале работы над Syzkaller Вьюков столкнулся с проблемой поиска и исправления уязвимостей в ядре Linux. Традиционные методы тестирования и ручного анализа кода оказались неэффективными из‑за сложности и объема кода ядра. Поэтому он решил создать инструмент, который позволил бы автоматизировать этот процесс.
Syzkaller был разработан как инструмент для генерации и запуска случайных тестов на ядре Linux. Он использует фаззеры для генерации случайных входных данных, которые передаются в системные вызовы ядра. Затем Syzkaller отслеживает поведение системы и реагирует на ошибки, падения или другие аномалии.
Со временем Syzkaller стал широко используемым инструментом в сообществе разработчиков ядра Linux и других операционных систем. Он помог выявить множество уязвимостей и ошибок в ядре, улучшить его качество и надежность.
Сегодня Syzkaller поддерживает не только ядро Linux, но и другие операционные системы, такие как FreeBSD, Fuchsia и даже Windows. Он продолжает развиваться и улучшаться благодаря вкладу сообщества разработчиков и исследователей безопасности.
Что ж, думаю, виртуалка уже скачалась, поэтому сворачиваем исторический экскурс и отправляемся заниматься практикой.
В архиве ты найдешь виртуальный диск, его нужно подключить при создании новой виртуалки.
В случае VirtualBox это выглядит так, как на рисунке ниже.
Очень важно включить вложенную виртуализацию, в этом поможет команда
Код:
& 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm Ubuntu.22.04.x64 --nested-hw-virt on
Если копирование не заработает, то можно поставить в виртуалке openssh-server и просто работать с ней через SSH. Только перед этим нужно поменять у виртуалки тип соединения с NAT на сетевой мост.
Дальше узнаем адрес и подключаемся.
Я использую именно этот метод, поскольку работаю на выделенном сервере, а не в ВМ.
СОБИРАЕМ ФАЗЗЕР
Теперь, когда скачан виртуальный диск и развернута виртуальная машина, приступаем к сборке фаззера.Перво‑наперво — Go. Фаззер написан на Golang, поэтому нам понадобится компилятор этого языка. Для сборки нужна версия 1.21 или старше.
Код:
wget https://dl.google.com/go/go1.21.4.linux-amd64.tar.gz
tar -xf go1.21.4.linux-amd64.tar.gz
export GOROOT=`pwd`/go
export PATH=$GOROOT/bin:$PATH
Напоминаю, пароль от скачанной виртуалки — osboxes.org.
Код:
sudo apt update
sudo apt install -y gcc g++ git make flex bison libncurses-dev libelf-dev libssl-dev bc
Код:
cd $HOME
git clone https://github.com/google/syzkaller
cd syzkaller
make
Собранные бинарники будут находиться в директории bin.
СБОРКА ЯДРА
Переходим к подготовке ядра, так как это и есть наша цель для фаззинга. Клонируем репозиторий, настроим и скомпилируем ядро.Качаем ядро
Тут всё стандартно. Сначала клонируем репозиторий исходного кода ядра.
Код:
export KERNEL=$HOME/linux
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $KERNEL
Как работает Syzkaller
Для начала картинка из документации фаззера.
Компонент syz-manager отвечает за запуск и мониторинг виртуалок, генерацию входных данных и хранение корпуса фаззинга и крашей. Он же запускает syz-fuzzer.
Они взаимодействуют через RPC (remote procedure call): syz-manager передает syz-fuzzer программу, которую нужно запустить, а syz-fuzzer передает syz-manager результаты выполнения.
Затем syz-fuzzer запускает syz-execurtor, который выполняет переданную на вход программу с системными вызовами.
Весь процесс делится на четыре этапа, они описаны ниже.
- Генерация тестовых данных. Syzkaller генерирует случайные входные данные (тестовые программы) для ядра Linux. Эти тестовые программы представляют собой системные вызовы, структуры данных и другие элементы.
- Запуск тестов. Syzkaller запускает тестовые программы на целевой системе, взаимодействуя с ядром Linux через системные вызовы, и при этом отслеживает поведение ядра и реакцию на входные данные.
- Мониторинг и анализ. Syzkaller мониторит работу ядра, отслеживая возможные ошибки, аварийные завершения или другие аномалии. Обнаружив проблему, Syzkaller собирает информацию о ней для последующего анализа.
- Создание отчетов. Syzkaller создает отчеты о найденных уязвимостях, ошибках и других проблемах в ядре Linux.
Настраиваем и собираем
Идем дальше. Теперь нужно сгенерировать конфиг для ядра и вписать в него пару опций.
Код:
cd $KERNEL
make defconfig
make kvm_guest.config
Код:
sed -i "s/# CONFIG_KCOV is not set/CONFIG_KCOV=y/" .config
sed -i "s/# CONFIG_DEBUG_INFO_DWARF4 is not set/CONFIG_DEBUG_INFO_DWARF4=y/" .config
sed -i "s/# CONFIG_KASAN is not set/CONFIG_KASAN=y\nCONFIG_KASAN_INLINE=y/" .config
sed -i "s/# CONFIG_CONFIGFS_FS is not set/CONFIG_CONFIGFS_FS=y/" .config
sed -i "s/# CONFIG_SECURITYFS is not set/CONFIG_SECURITYFS=y/" .config
sed -i "s/# CONFIG_CMDLINE_BOOL is not set/CONFIG_CMDLINE_BOOL=y\nCONFIG_CMDLINE="net.ifnames=0"/" .config
После редактирования нужно перегенерить конфиг.
Код:
make olddefconfig
Теперь запускаем make:
Код:
make -j`nproc`
Код:
ls $KERNEL/vmlinux
ls $KERNEL/arch/x86/boot/bzImage
Создаем образ
Когда ядро собрано, нужно создать образ системы на основе его. Из этого образа фаззер будет создавать виртуальные машины под фаззинг.Сначала понадобится установить инструмент debootstrap.
Код:
sudo apt install -y debootstrap
Код:
export IMAGE=$HOME/image
mkdir -p $IMAGE
cd $IMAGE/
wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh -O create-image.sh
chmod +x create-image.sh
./create-image.sh
$IMAGE/bullseye.img
Ставим QEMU и проверяем образ
Чтобы все получилось, понадобится эмуляция железа. В этом нам поможет небезызвестный QEMU.Устанавливаем:
Код:
sudo apt install -y qemu-system-x86
Нужно добавить текущего пользователя (в данном случае osboxes) в группу kvm.
Код:
sudo usermod -a -G kvm user
Код:
sudo modprobe kvm-intel
Код:
export KERNEL=$HOME/linux
export IMAGE=$HOME/image
qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel $KERNEL/arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=$IMAGE/bullseye.img,format=raw \
-net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
-net nic,model=e1000 \
-enable-kvm \
-nographic \
-pidfile vm.pid \
2>&1 | tee vm.log
В другом окне терминала тоже подключаемся к виртуалке (или серверу), затем проверяем подключение к запущенному на QEMU образу.
Код:
export IMAGE=$HOME/image
ssh -i $IMAGE/bullseye.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost
Подключились, все работает, и теперь можно выключить систему. Вводим во втором терминале:
Код:
poweroff
ЗАПУСК ФАЗЗИНГА
Теперь нужно создать конфиг для самого фаззера, после чего его можно будет запускать.В конфиге нужно будет указать рабочую директорию, поэтому создадим ее:
Код:
mkdir -p $HOME/workdir
Код:
{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "workdir",
"kernel_obj": "linux",
"image": "image/bullseye.img",
"sshkey": "image/bullseye.id_rsa",
"syzkaller": "syzkaller",
"procs": 8,
"type": "qemu",
"vm": {
"count": 4,
"kernel": "linux/arch/x86/boot/bzImage",
"cpu": 2,
"mem": 2048
}
}
Конфиг готов, можем запускать фаззинг!
Код:
syzkaller/bin/syz-manager -config=my.cfg
Если очень долго нет коннекта, запусти фаззер снова, при этом передав флаг -debug, и внимательно смотри вывод, обычно там сразу видно, ели что‑то пошло не так. Например, может быть ошибка подключения по SSH.
У фаззера есть веб‑инерфейс.
Здесь можно посмотреть всю статистику. Также здесь будет отображаться информация о найденных багах. Для каждого приводится лог и исходный код программы, которая вызывает крэш ядра.
Чтобы смотреть эту страницу на хосте, убедись, что у виртуальной машины выбран тип адаптера «Сетевой мост».
И перед запуском Syzkaller нужно вписать в конфиг IP-адрес виртуальной машины (или IP-адрес сервера в случае VPS), вместо стандартного 127.0.0.1.
ВЫВОДЫ
Мы рассмотрели кратко историю и теорию фаззинга, разобрались, как устроен фаззер Syzkaller и как его запускать. Затем настроили и скомпилировали ядро Linux. И наконец, начали поиск багов в нем при помощи Syzkaller.Желаю терпения в ожидании крашей! В качестве следующего шага можешь попробовать самостоятельно освоить фаззер ядра Trinity.
Ссылки
- Syzkaller
- Документация Syzkaller
- Решение частых проблем с Syzkaller
- Решение частых проблем с Linux
- Репозиторий ядра
- Как работает фаззер
- Про добавление описания вызовов
Автор sploitem
cyberprotect.ru
Источник xakep.ru