- Фуз тестирање аутоматизује слање погрешно обликованих уноса како би се открили безбедносни недостаци у софтверу и системима.
- AFL и AFL++ су интелигентни фазери који користе инструментиране компајлере да би се водили покривеношћу и пронашли нове путеве извршавања.
- Анализирање падова система помоћу алата као што су AFLTriage и GDB омогућава вам да процените искоришћавање рањивости као што је Integer Underflow.
- Интегрисање фузинга у развојни циклус побољшава робусност, помаже у испуњавању безбедносних стандарда и смањује ризик од критичних инцидената.
Ако сте заинтересовани за Бинарно оријентисана сајбер безбедност и експлоатацијаПре или касније наићи ћете на фузинг, а посебно на AFL и AFL++. Не говоримо о теоријском лабораторијском алату, већ о нечему што се свакодневно користи за проналажење стварних недостатака у добро познатим програмима, баш као што се десило са рањивостима у... популарне апликације попут 7-Zip-а.
У наредним редовима видећемо, детаљно и пријатељским тоном, Како користити AFL и AFL++ за фузинг бинарне датотекеОбјаснићемо тачно шта је фуз тестирање, зашто је толико моћно у смислу безбедности и како га интегрисати у савремени развојни ток рада. Такође ћемо испитати случај рањивости из стварног света (целобројни подток који омогућава даљинско извршавање кода) и прегледати комплементарне алате као што су ГДБ са екстензијама, АФЛТријажа и оперативни модули.
Шта су AFL/AFL++ и зашто се сматрају паметним фузерима?
AFL (амерички Fuzzy Lop) и његова еволуција AFL++ То су алати отвореног кода за фузинг дизајнирани за аутоматско тестирање бинарних датотека, тражећи грешке као што су преливања, грешке у меморији или неочекивано понашање које доводи до падова система или чак до злоупотребљивих рањивости.
Лепота AFL-а није само слање насумичних података, већ... интелигентни фаззер или фаззер вођен покривеношћуПолазећи од једног или више валидних примерних уноса (тзв. тест цасес), AFL стално генерише варијације и, захваљујући инструментима програма, детектује када нова мутација узрокује да бинарни фајл крене другачијом путањом извршавања.
Да би се постигла ова инструментација, AFL има сопствене компајлере, као што су afl-gcc и afl-g++Оне убацују мале „кукице“ у код током компајлирања. Ове кукице обавештавају AFL да је откривен одређени унос. нове руте у току програмаОво вам омогућава да се фокусирате на мутације које заправо пружају додатну покривеност и да не губите време са подацима који ништа не мењају.
Овакав приступ чини AFL нечим попут „дирб бинарних датотека“: добро познатим алатом, лаким за коришћење када разумете основни ток рада и довољно моћним да откријете озбиљни недостаци у производним програмимаиако постоје напреднији или специјализовани фузери.
Увод у фуз тестирање и његову улогу у сајбер безбедности
Фаз тестирање, или једноставно фузинг, је техника аутоматизовано тестирање безбедности и робусностиИдеја је да се апликацији пошаље поплава неправилно обликованих, случајних или необичних података, са циљем да се види да ли програм престаје да ради, руши се или се понаша неочекивано.
Када је софтвер подвргнут фазингу, циљ је лоцирање грешака као што су препуњавање бафера, грешке у валидацији уноса, проблеми са управљањем меморијом или услови тркеМноге од ових мана могу довести до произвољног извршавања кода, цурења информација или ускраћивања услуге.
У типичном радном току, фуз тестирање прати три јасне фазе: прво, генерише се скуп података за тестирање (било да је потпуно случајан, генерисан пратећи одређени формат или мутирањем валидних улаза); затим... изврши бинарни фајл који се тестира док се надгледа Његово понашање се прати; и коначно, падови или необична понашања се бележе и анализирају како би програмери могли да истраже извор проблема.
Постоје различите стратегије фузинга. Неки алати се фокусирају на генерацијско збркањекреирање уноса који поштују добро дефинисан формат (на пример, структуру датотеке или мрежни протокол); други су засновани на мутација валидних улазаУправо је то приступ у којем AFL и AFL++ блистају. Постоје и случајнији приступи, као и други који се ослањају на специфично знање о систему који се тестира како би циљали на његове најслабије тачке.
У савременој сајбер безбедности, фуз тестирање је основни савезник: помаже у проналажењу рањивости у проактивно, пре него што софтвер крене у производњуи доприноси усклађености са прописима и стандардима као што је ISO 27001 или захтевима за заштиту података. Штавише, смањује ризик по репутацију који би настао услед тога што критична рањивост која се може искористити падне у руке нападача.
Случај из стварног света: Рањивост услед недовољног преливања целог броја и RCE у декомпресору
Да бисмо разумели праву вредност AFL-а и фузинга, веома је корисно погледати специфичну рањивост на основу Целобројни недоток унутар веома популарног декомпресора датотекаОво је грешка удаљеног извршавања кода (RCE) која се покреће приликом обраде компресованих датотека помоћу Zstandard алгоритма, са високим, мада не максималним, CVSS резултатом, управо зато што захтева нешто специфичнији контекст (на пример, да се обрађују одређене датотеке).
До недовољног прекорачења целог броја долази када је целобројна променљива са добро дефинисаним доњим границама Користи се у операцијама одузимања док се не достигне његова минимална вредност.Пошто многи целобројни типови не дозвољавају негативне вредности, приликом „илажења испод нуле“, уместо добијања броја испод нуле, долази до скока на максималну могућу вредност опсега, због начина на који су ти бројеви интерно представљени.
Замислите целобројну променљиву која, теоретски, никада не би требало да буде негативна. Ако наставите да одузимате константу док не дођете до 0 и наставите са одузимањем, Нећете добити -1, -2, итд.Уместо тога, вредност ће се инвертовати и постати гигантски број на горњој граници дозвољеног опсега. Ова апсурдна цифра, ако се користи као индекс или величина у меморијским операцијама, може проузроковати читања или писања ван предвиђених граница.
Проблем постаје критичан када се та целобројна променљива која може имати недовољно ширење користи за да управља бафером или да израчуна помакеТипичан псеудо-пример би био коришћење кориснички контролисане променљиве индиректно као офсет у функцији типа memcpy, у петљи која смањује константу у свакој итерацији док наводно не достигне нулу или непозитиван број.
У таквом сценарију, ако почетна вредност никада не успе да „чисто“ задовољи излазни услов, недовољан ток ће на крају учинити број огромним, петља ће наставити да се извршава и масовно оштећење памћењаТо се претвара у падове система и, уз довољно експлоатационог рада, у могућност извршавања произвољног кода.
Како AFL помаже у лоцирању ових врста рањивости
Када се разуме концепт целобројног недовољног тока, постаје јасно зашто су AFL и AFL++ толико корисни: почевши од једна или неколико савршено валидних улазних датотекаФазер може да генерише десетине хиљада варијација, док не наиђе на ону која покреће одређену грешку у погођеној путањи декомпресије.
Током фузинга, AFL прати инструментовани бинарни фајл како би утврдио када улаз изазива извршавање другачије путање контроле протока. Сваки пут када детектује нову путању, Означи тај унос као занимљив и чува га као основу за будуће мутације. На овај начин се не истражују само уобичајене путање извршавања, већ и оне комбинације података које активирају необичне руте кода, као што је процес декомпресије са чудним параметрима.
У случају недовољног тока целобројних вредности, AFL може пронаћи узорак који узрокује да променљива која је укључена никада не достигне очекивану излазну вредност у петљи. Резултат је детектовани пад, који ће бити сачуван у одговарајућој фасцикли са AFL резултатима, спреман за даљу анализу.
Након неколико минута или сати извршења, уобичајено је да AFL назначи први релевантни падНеће све грешке које пронађете бити експлоатабилне, али су јасан показатељ да нешто у управљању меморијом, валидацији уноса или унутрашњој логици бинарног фајла не функционише како треба.
Тада долазе до изражаја алати за подршку попут AFLTriage-а или дебагера попут GDB-а, који вам омогућавају да дубље зароните у пад система, посматрате стање регистара и меморије и процените да ли се квар може поуздано искористити или је то једноставно проблем од мале користи са становишта нападача.
Основна инсталација AFL / AFL++ и аналитичког окружења
Подешавање минималног окружења за фузинг са AFL-ом на стандардном Linux систему је прилично једноставно. У многим дистрибуцијама, довољно је инсталирати пакет који одговара инструментираним компајлерима, на пример, користећи команду као што је инсталирајте afl-g++ или еквивалентни AFL++ пакет доведите цео апартман.
На тај начин се инсталирају оба алата за фузинг (као што су афл-фуз) као што су специјализовани компајлери (afl-gcc, afl-g++ и њихове модерне варијанте у AFL++). Ови компајлери су они које ћете користити када желите да поново компајлирате свој циљ са инструментацијом, што је неопходно да бисте извукли максимум из фузинга вођеног покривеношћу.
Поред самог фазера, добро окружење за дебаговање је практично обавезно. Проширени GDB са додаци попут PEDA или GEF Живот чини много лакшим захваљујући додатним командама, практичном форматирању меморије, визуелизацији стека и пречицама за проверу регистара и мапа меморије.
Ако већ немате GDB, можете га инсталирати користећи менаџер пакета ваше дистрибуције. Затим, једноставно интегришите изабрани додатак (на пример, преузимањем GEF-а или PEDA-е из њихових репозиторијума и додавањем у вашу GDB конфигурациону датотеку или коришћењем команде `source` унутар самог дебагера).
Имање овог „GDB-а на стероидима“ ће вам омогућити да анализирате инструментоване бинарне датотеке које се колабирају под фузингом, преузмете уноси који узрокују пад и пратите корак по корак шта се дешава у извршењу тачно у тренутку квара.
Компајлирајте циљни бинарни фајл са AFL-ом за фузинг
Када имате спреман AFL или AFL++, следећи корак за озбиљно фузинг је компајлирајте циљ помоћу AFL компајлераи да то учине са одговарајућим опцијама како би се олакшала и анализа и потенцијална експлоатација, у случају да је циљ вежбе офанзивно истраживање.
У великим пројектима, као што су декомпресор или пакет услужних програма за архивирање, добра је идеја омогућити симболе за отклањање грешака (опција DEBUG или заставице попут -gи минимизирати оптимизације (на пример, коришћење -O0 уместо -O2). Ово у великој мери помаже у разумевању шта се дешава у изворном коду у вези са уоченим падом.
Обично ћете морати да пронађете одговарајући makefile или build фајл и измените линије где су дефинисане заставице компајлирањаОво може укључивати активирање DEBUG променљиве, присиљавање одређеног нивоа оптимизације и, што је најважније, замену CC и CXX са afl-gcc и afl-g++ (или еквивалентним AFL++ алатима).
На пример, можете покренути изградњу са нечим попут CC=afl-gcc и CXX=afl-g++ заједно са одговарајућим makefile-ом. Резултат ће бити инструментовани бинарни фајл који укључује неопходне hooks-ове тако да AFL може да мери покривеност током извршавања.
Када је компилација завршена, добра је идеја проверити да ли резултујући бинарни фајл заиста има симболе за отклањање грешака и исправну архитектуру, користећи команду попут датотека о извршној датотециОво осигурава да не користите фазинг слепо и да можете лако да отклоните грешке у свим падовима који се појаве.
Припрема тест случајева и извршавање AFL-а
Пре него што покренете AFL против вашег бинарног фајла, потребно је да припремите сет минимални број важећих уносаАко тестирате декомпресор који не успева са датотекама компресованим помоћу одређеног алгоритма, мораћете да креирате барем једну добро обликовану датотеку која користи тај метод компресије.
Уобичајена пракса је креирање директоријума, на пример названог testcases, и чување једног или више радних примера у њему. Они ће служити као почетна тачка за AFL. генерише све агресивније мутацијепокушавајући да открију нове путеве извршења и, на крају, доживљавају падове система.
Типична команда за покретање AFL-а изгледа отприлике овако: наведите име сесије или синхронизације, улазну фасциклу са тест случајевима, излазну путању где ће се резултати чувати и неке додатне параметре као што је време чекања како бисте избегли заглављивање у бесконачним петљама.
Командна линија такође одређује како се циљни програм извршава помоћу семафор @@који ће AFL аутоматски заменити путањом сваког тест случаја који генерише. Дакле, можете навести нешто попут ./бинарни аргументи @@ и AFL ће бити одговоран за покретање извршне датотеке хиљадама пута са различитим датотекама.
Важно је знати да се AFL у почетку може жалити на конфигурацију система (због ограничења ресурса, избацивања језгра итд.). У том случају, обично постоји помоћни скрипт или алат који подешава параметре језгра и сесије како би се оптимизовало фазинг окружење, а који треба покренути са одговарајућим дозволама пре понављања теста.
Анализа судара помоћу AFLTriage-а и GDB-а
Након периода „fuzzing“-а, AFL ће постепено попуњавати излазни фолдер занимљивим новим уносима и, пре свега, са датотеке које су изазвале падове системаОбично се чувају у одређеном поддиректоријуму (на пример, падови система унутар фасцикле сесије).
Да бисте избегли да претерате са прегледањем сваког уноса појединачно, постоје алати попут AFLTriage-а који вам омогућавају да Аутоматски покрени бинарну датотеку за сваку датотеку о паду система и генеришите структуриране извештаје са детаљима о томе где и како је дошло до квара.
Приликом покретања AFLTriage-а, наводите улазни директоријум (фасциклу за пад система), излазни директоријум за чување извештаја и команду за покретање бинарне датотеке користећи @@. Алат ће анализирати сваки случај и Генерисаће текстуалне датотеке са информацијама од интереса. за аналитичара.
Типичан садржај ових извештаја укључује врсту сигнала који је изазвао пад система, смер у ком је дошло до грешке, основни траг стека и, у многим случајевима, функцију или макро где је дошло до грешке кода (на пример, одређена операција копирања, петља компресије или макро COPY_CHUNKS који одузима величине у свакој итерацији).
Када се лоцира занимљив пад система, следећи корак је његова репродукција у GDB-у. Да би се то урадило, дебагер се покреће са бинарном датотеком и улазном датотеком кривца као аргументима, а програм се извршава унутар GDB-а. Када се пад система репродукује, стање Кључни записи као што су RAX, RDX итд., проверите тачну инструкцију која се извршава и консултујте меморијске мапе (vmmap) да бисте видели у који регион се чита или у који се уписује.
Од пада до потенцијалне експлоатације: модули за анализу у GDB-у
Пад бинарног фајла не значи увек да је рањивост искоришћена. Ту долазе до изражаја GDB екстензије попут модула. искористив, дизајниран да анализира контекст пада система и понуди грубу класификацију да ли се квар може искористити или не.
Ове врсте екстензија проучавају аспекте као што су валидност показивача инструкције, стање показивача стека, меморијске дозволе адресе на којој се врши покушај читања или писања и природа сигнала који је изазвао пад система. Са свим овим информацијама, оне пружају... индикативна пресуда о потенцијалу експлоатације (на пример, категоризацијом грешке као вероватно искоришћене, могуће искоришћене или од малог интереса).
У случају недовољног тока целобројних вредности који на крају уписује у меморију само за читање, додатак може да сугерише да је ово потенцијално злоупотребљив случај јер се операција писања извршава ван очекиваних ограничења у региону где ништа не би требало да се додирује.
Неће сви сценарији бити тако једноставни, али ова комбинација AFL-а за откривање пада, AFLTriage-а за груписање и описивање случајева и GDB-а са проширењима за процену експлоатабилности, формира Веома робустан бинарни ревизијски цевоводОдатле, преостали посао је чисто истраживање и развој експлоита, нешто што може енормно да варира у сложености у зависности од бинарне и активне заштите.
Још један кључни део анализе, посебно када се објави CVE и повезана закрпа, јесте преглед како је рањивост исправљена у изворном коду. То обично укључује промене у врсти коришћених података (на пример, прелазак са потписаног бајта на непотписани бајт, проширивање опсега) и укључивање додатних провера (if провере које враћају кодове грешака ако су прекорачена одређена ограничења) како би се спречило недовољно ширење или оштећење меморије.
Остали релевантни фузери и алати у екосистему
Иако су AFL и AFL++ међу најпознатијим опцијама за фузинг нативних бинарних датотека, екосистем фуз тестирања је много шири и вреди га пратити ако редовно радите са... безбедност софтвера.
Међу најчешће коришћеним опцијама је LibFuzzer, библиотека коју је првобитно развио Google, а која се директно интегрише са C/C++ кодом и обавља фузинг на нивоу специфичних функција, идеално за тестирање појединачних компоненти са високо контролисаним улазима.
Постоји и Peach Fuzzer, платформа општије намене и конфигурабилнија која вам омогућава да дефинишете тачни модели протокола, формата датотека и сложених структураВеома је популаран у секторима где је поузданост критична, као што су индустријски системи или IoT окружења.
У веб домену, алати попут OWASP ZAP укључују фузинг модуле намењене веб апликацијама, способне за слање манипулисани захтеви, погрешно обликована учитавања и тестови убризгавања HTTP крајње тачке за откривање рањивости као што су SQL инјекције, проблеми са валидацијом уноса или грешке у обради образаца.
Све ово допуњује AFL/AFL++ бинарно фузинг, јер омогућава покривеност од нисконивоског нативног кода до слојева апликације који су највише изложени крајњем кориснику. Заједнички циљ у свим случајевима је исти: аутоматизовати претрагу рањивости пре него што то ураде нападачи.
Како интегрисати фуз тестирање у развојни циклус
Да би фузинг константно пружао праву вредност, није довољно само повремено покретати AFL или AFL++ и заборавити на то. Много је ефикаснији. интегрисање фуз тестирања у животни циклус развоја софтвера, на сличан начин као што се то ради са јединичним или интеграционим тестовима.
Први корак је дефинисање који делови система су најкритичнијиПарсери датотека, мрежни модули, компоненте које обрађују корисничке податке или екстерно изложене услуге. Специфичне фузинг кампање могу се дизајнирати око ових циљева, користећи пажљиво одабране тест случајеве.
Затим, потребно је да изаберете прави алат за сваки случај. За сложене нативне бинарне датотеке, AFL++ или LibFuzzer су обично природни кандидати, док ће за веб API-је или HTTP апликације, веб-оријентисан алат имати више смисла. Важно је да се фузинг правилно изврши. поновљиво и аутоматизовано.
Интеграција са CI/CD системима је веома корисна: цевовод се може конфигурисати тако да се, у одређеним гранама или пре одређених имплементација, покреће фузинг батерија са ограниченим временом, чувајући све новооткривене падове и неуспешно изградњавајући ако се појаве потенцијално озбиљне рањивости.
Коначно, важно је разумети да је фузинг итеративни процес. Сваки пут када се грешка исправи, погођена компонента треба поново фузирати како би се проверило да ли закрпа ради и да нису уведене нове грешке. нема нових регресија или рањивостиНа овај начин, фуз тестирање постаје додатни слој континуиране заштите, а не изолована ревизија.
Узето заједно, све горе наведено показује како нам AFL, AFL++ и fuzz тестирање уопште омогућавају да пређемо са безбедносног приступа заснованог искључиво на ручним прегледима на свеобухватнији приступ. много аутоматизованије и темељнијеСпособан је да открије грешке које би иначе остале скривене. Рад са случајевима из стварног света, као што су рањивости услед недовољног преливања у широко коришћеним декомпресорима, такође помаже да се разуме да ово није само теорија, већ проблеми који се већ искоришћавају. Стога, ажурирање софтвера и редовно излагање фазингу може направити разлику између компромитованог и отпорног система.
Страствени писац о свету бајтова и технологије уопште. Волим да делим своје знање кроз писање, и то је оно што ћу радити на овом блогу, показивати вам све најзанимљивије ствари о гаџетима, софтверу, хардверу, технолошким трендовима и још много тога. Мој циљ је да вам помогнем да се крећете у дигиталном свету на једноставан и забаван начин.

