Фаз­зинг, как ты, навер­ное, зна­ешь, — это тех­ника, которая поз­воля­ет авто­мати­зиро­вать поиск уяз­вимос­тей в соф­те. Быва­ет фаз­зинг методом «чер­ного ящи­ка», ког­да у нас нет исходни­ков прог­раммы, а быва­ет осно­ван­ный на пок­рытии — то есть при­меня­емый к исходни­кам. В этой статье сос­редото­чим­ся на вто­ром виде и на при­мере AFL++ раз­берем, какую роль здесь игра­ют санитай­зеры и как их при­менять.

info

О фаз­зинге методом чер­ного ящи­ка читай в статье «WinAFL на прак­тике. Учим­ся работать фаз­зером и искать дыры в соф­те».

Суть фаз­зинга зак­люча­ется в том, что­бы авто­мати­чес­ки подавать прог­рамме неп­равиль­ные или испорчен­ные дан­ные и отлавли­вать потен­циаль­ные уяз­вимос­ти.

На све­те сущес­тву­ет мно­жес­тво фаз­зеров: AFL++, libfuzz, WinAFL, CI Fuzz, PeachTech Peach Fuzzer, FuzzDB, go-fuzz и про­чие, в том чис­ле самопис­ные. Фаз­зеры при­мени­мы не толь­ко для прог­рамм, но и для сай­тов. Нап­ример, wfuzz — это веб‑фаз­зер, который нужен, что­бы вво­дить любые дан­ные в любое поле HTTP-зап­роса.

В этой статье идет речь о фаз­зинге прог­рамм. Нашим инс­тру­мен­том будет AFL++ — фаз­зер, ори­енти­рован­ный на пок­рытие. Это зна­чит, что он собира­ет информа­цию о пок­рытии для каж­дого изме­нен­ного вхо­да, что­бы обна­ружить новые пути выпол­нения и потен­циаль­ные ошиб­ки. Если у тебя есть исходник прог­раммы, AFL может встав­лять вызовы фун­кций в начало каж­дого базово­го бло­ка, нап­ример в фун­кции и цик­лы.

О том, как при помощи AFL тес­тировать блек­боксы, написа­но мно­жес­тво ста­тей, в том чис­ле о том, как его рас­парал­леливать. Но этот фаз­зер уме­ет ком­пилиро­вать прог­раммы и делать свои встав­ки в код, что облегча­ет фаз­зинг. Такие встав­ки называ­ются санитай­зерами.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

 

Что такое санитайзеры?

Са­нитай­зеры — это ути­литы, которые обыч­но пос­тавля­ются вмес­те с ком­пилято­рами. Они помога­ют искать ошиб­ки в коде во вре­мя исполне­ния. Если обоб­щить, мож­но выделить три раз­новид­ности санитай­зеров:

  • address — ищет ошиб­ки работы с памятью;
  • thread — ищет проб­лемы в мно­гопо­точ­ных вычис­лени­ях (сос­тояние гон­ки);
  • undefined — ищет неоп­ределен­ное поведе­ние в прог­рамме.

Ис­поль­зование санитай­зеров вмес­те с AFL++ — это хороший тон при фаз­зинге, потому что с ними фаз­зер будет луч­ше знать, какого рода ошиб­ки ему нуж­но искать. С санитай­зерами фаз­зинг всег­да будет про­ходить успешнее, чем без них.

В AFL++ дос­тупны раз­ные санитай­зеры, которые помога­ют обна­ружи­вать ошиб­ки в коде. Вот крат­кое опи­сание каж­дого из них.

  1. AddressSanitizer (ASAN) пред­назна­чен для обна­руже­ния оши­бок чте­ния или записи в память, таких как перепол­нение буфера или исполь­зование осво­бож­денной памяти. Он обес­печива­ет деталь­ную информа­цию об ошиб­ках и помога­ет в их отладке.
  2. MemorySanitizer (MSAN) приз­ван обна­ружить неини­циали­зиро­ван­ную память. Он помога­ет выявить ошиб­ки, свя­зан­ные с исполь­зовани­ем неини­циали­зиро­ван­ных дан­ных и спо­соб­ные при­вес­ти к неп­ред­ска­зуемо­му поведе­нию прог­раммы.
  3. ThreadSanitizer (TSAN) пред­назна­чен для поис­ка гонок дан­ных в мно­гопо­точ­ных прог­раммах. Он помога­ет выявить ситу­ации, ког­да нес­коль­ко потоков одновре­мен­но обра­щают­ся к одним и тем же дан­ным, что иног­да при­водит к неп­ред­ска­зуемым резуль­татам.
  4. UndefinedBehaviorSanitizer (UBSAN) помога­ет обна­ружить неоп­ределен­ное поведе­ние в прог­рамме, такое как деление на ноль, перепол­нение целочис­ленных типов или неп­равиль­ное исполь­зование ука­зате­лей. Он пре­дуп­режда­ет о таких проб­лемах и помога­ет пре­дот­вра­тить воз­можные ошиб­ки.
  5. Control Flow Integrity (CFI) обес­печива­ет защиту от атак, свя­зан­ных с изме­нени­ем потока управле­ния прог­раммы. Он про­веря­ет целос­тность вызовов фун­кций и пре­дот­вра­щает нежела­тель­ные изме­нения потока выпол­нения.
  6. Safe-stack пред­назна­чен для защиты от перепол­нения сте­ка. Он обес­печива­ет допол­нитель­ные механиз­мы безопас­ности, что­бы пре­дот­вра­тить воз­можные ата­ки, свя­зан­ные с перепол­нени­ем сте­ка.

В раз­ных слу­чаях могут при­годить­ся раз­ные санитай­зеры, в том чис­ле это зависит от осо­бен­ностей и тре­бова­ний про­екта.

Нап­ример, санитай­зер ASAN может выявить сле­дующие проб­лемы:

  • Use-After-Free — исполь­зование чан­ка кучи пос­ле его осво­бож­дения;
  • HeapOverflow — перепол­нение одно­го чан­ка и добав­ление дан­ных в дру­гой чанк;
  • StackOverflow — клас­сичес­кое перепол­нение буфера.

info

Под­робнее о воз­можнос­тях ASAN читай в до­кумен­тации на GitHub.

 

Теневая память

Од­на из тех­ник, которую исполь­зуют санитай­зеры, — это теневая память. По сути, они под­держи­вают парал­лель­ную струк­туру дан­ных наряду с фак­тичес­кой памятью прог­раммы, при этом каж­дый бит в теневой памяти соот­ветс­тву­ет 8 битам в фак­тичес­кой памяти. Такая схе­ма поз­воля­ет хра­нить метадан­ные о каж­дом выделе­нии памяти и обна­ружи­вать наруше­ния при записи в нее.

Нап­ример, в прог­рамме опре­деля­ется какой‑то ука­затель:

*address = ...; // or: ... = *address;

Са­нитай­зер меня­ет его исполь­зование на такое:

if (IsPoisoned(address)) {
ReportError(address, kAccessSize, kIsWrite);
}
*address = ...; // or: ... = *address;

Са­нитай­зер помеча­ет любую выс­вобож­даемую память как «отравлен­ную», а затем сле­дит за дос­тупом к ней. Если про­изош­ло перепол­нение буфера, который выделял­ся через malloc, то получа­ется, что кто‑то пишет в отравлен­ную область, а в эту область писать нель­зя. Так фаз­зер обна­ружи­вает баг.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии