Ядерный фаззинг. Настраиваем Syzkaller для поиска багов в ядре Linux

Содержание статьи

  • Стенд
  • Краткая история фаззинга
  • Краткая история Syzkaller
  • Собираем фаззер
  • Сборка ядра
  • Качаем ядро
  • Настраиваем и собираем
  • Создаем образ
  • Ставим QEMU и проверяем образ
  • Запуск фаззинга
  • Выводы

В этой статье мы поп­ракти­куем­ся в фаз­зинге ядра. Но сна­чала нем­ного погово­рим об исто­рии и теории фаз­зинга, а так­же обсу­дим прин­цип работы нашей цели. Нас­тро­им и ском­пилиру­ем ядро 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 — это инс­тру­мент для авто­мати­зиро­ван­ного тес­тирова­ния ядра опе­раци­онной сис­темы, раз­работан­ный Дмит­рием Вьюко­вым. Исто­рия 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

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *