Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье мы попрактикуемся в фаззинге ядра. Но сначала немного поговорим об истории и теории фаззинга, а также обсудим принцип работы нашей цели. Настроим и скомпилируем ядро Linux, настроим Syzkaller и приступим к поиску багов.
Давай быстренько скачаем готовую виртуальную машину, чтобы не тратить время на ее разворачивание из 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 началась примерно в 2014 году.
В начале работы над Syzkaller Вьюков столкнулся с проблемой поиска и исправления уязвимостей в ядре Linux. Традиционные методы тестирования и ручного анализа кода оказались неэффективными из‑за сложности и объема кода ядра. Поэтому он решил создать инструмент, который позволил бы автоматизировать этот процесс.
Syzkaller был разработан как инструмент для генерации и запуска случайных тестов на ядре Linux. Он использует фаззеры для генерации случайных входных данных, которые передаются в системные вызовы ядра. Затем Syzkaller отслеживает поведение системы и реагирует на ошибки, падения или другие аномалии.
Со временем Syzkaller стал широко используемым инструментом в сообществе разработчиков ядра Linux и других операционных систем. Он помог выявить множество уязвимостей и ошибок в ядре, улучшить его качество и надежность.
Сегодня Syzkaller поддерживает не только ядро Linux, но и другие операционные системы, такие как FreeBSD, Fuchsia и даже Windows. Он продолжает развиваться и улучшаться благодаря вкладу сообщества разработчиков и исследователей безопасности.
Что ж, думаю, виртуалка уже скачалась, поэтому сворачиваем исторический экскурс и отправляемся заниматься практикой.
В архиве ты найдешь виртуальный диск, его нужно подключить при создании новой виртуалки.
В случае VirtualBox это выглядит так, как на рисунке ниже.
Очень важно включить вложенную виртуализацию, в этом поможет команда
& 'C:Program FilesOracleVirtualBoxVBoxManage.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
Еще понадобится компилятор C и С++, а также ядро с включенным измерением покрытия кода (первое заполучить элементарно, второе — чуть сложнее), ну и, само собой, нужен Git. И еще всякое по мелочи, полный список есть в документации Syzkaller.
Напоминаю, пароль от скачанной виртуалки — osboxes.org
.
sudo apt update sudo apt install -y gcc g++ git make flex bison libncurses-dev libelf-dev libssl-dev bc
С ядром разберемся чуть позже, а пока клонируем репозиторий Syzkaller и собираем проект.
cd $HOMEgit 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
Источник: xakep.ru