Systém detekce průniků založený na ohodnocování chování procesů

4. 11. 2004
Doba čtení: 7 minut

Sdílet

Článek pojednávající o jednom diplomkovém projektu z oblasti počítačové bezpečnosti. Jelikož byl projekt poměrně pozitivně přijat v zainteresovaných konferencích, požádala mě Johanka o sepsání pár vět. Článek možná nebude stravitelný úplně pro každého, ale pokusím se udělat všechno pro to, aby se z něj nikomu neudělalo nevolno.

Co je to IDS

IDS je zkratka z Intrusion Detection System neboli systém detekce průniků. Takové programy slouží k odhalení neautorizovaných vstupů do počítačového systému. IDS používají v zásadě dvě metody:

  • detekce zneužití – zkoumáme chování systému a porovnáváme ho se známými vzorky z databáze znalostí o průnicích
  • detekce anomálií – zkoumáme dlouhodobé chování systému a hledáme v tomto chování náhlé podezřelé změny

Výhodou prvního přístupu je větší přesnost a menší pravděpodobnost planého poplachu, druhý přístup zase teoreticky může odhalit i dosud neznámé a nepoužité druhy útoků.

Mezi známější open-source IDS patří například Snort, který monitoruje provoz na síti a porovnává ho s databází známých vzorků.

Související zkratka je IPS neboli Intrusion Prevention System. To je program sloužící k prevenci před útoky, tedy snažící se odhalit každý pokus a aktivně mu zabránit, ještě než dojde k jeho úspěšnému dokončení. V praxi se zpravidla při ochraně počítačových systémů používají oba přístupy.

Co je to SpamAssassin

Teď si uděláme malou odbočku k programu SpamAssassin. Tento vynikající software slouží k odhalování spamu (nevyžádané pošty zpravidla reklamního charakteru). Kdo ho používá, jistě potvrdí, že jeho úspěšnost je překvapivě dobrá.

SpamAssassin používá pro detekci spamu následující metodu: na každou e-mailovou zprávu aplikuje sadu testů a výsledek každého testu, kterým e-mail projde, je ohodnocen „trestnými“ body. Pokud celkový součet bodů u jednoho e-mailu překročí stanovenou mez, je zpráva označena za spam. Těchto testů obsahuje SpamAssassin několik stovek a zaměřují se na všechny možné i nemožné atributy e-mailové zprávy.

Jak to souvisí

Klíčová otázka je – nešlo by metodu používanou SpamAssassinem použít i pro detekci průniků? Mohli bychom aplikovat nějaké testy na každý vzorek chování systému a potom podle celkového součtu bodů vyhodnocovat, zda je toto chování bezpečné. Jak ale definovat „vzorek chování“? Vhodným objektem, který by se dal v systému takto zkoumat, by mohl být běžící proces (proces je zde myšlen dle terminologie z oblasti operačních systémů).

Pokud chceme zkoumat činnost procesů, asi bude vhodné navrhnout IDS jako kernelový modul (ne, že by to bylo nutné). Operační systém je pro mne jasná volba – každý, kdo používá FreeBSD, pochopí, a kdo nepoužívá, tomu to vřele doporučuji :).

Bezpečnostní problémy

Za účelem zkoumání tohoto přístupu k detekci průniků jsme se zaměřili na tři typické bezpečnostní problémy.

Buffer overflow

Tento problém je typický pro programy napsané v jazyce C. Spočívá v tom, že dojde k přetečení nějakého pole v paměti a k zápisu útočníkem podstrčených dat do oblasti za tímto polem. Tím může dojít k přepsání návratové adresy z funkce k a vykonání kódu podstrčeného útočníkem. Takový kód zpravidla slouží ke spuštění shellu (na to stačí cca 20bajtový kód).

Útok přes symlinky

Pokud máme privilegovaný program, který pracuje s nějakým souborem, aniž by kontroloval, zda tento soubor není symlink, můžeme podstrčením vhodného symlinku přimět program k tomu, aby změnil/smazal/spus­til soubor s využitím svých práv.

Denial of service

Snažíme se například nadměrným využíváním systémových zdrojů narušit funkčnost systému.

Kernelový modul

Kernelový modul našeho IDS se skládá ze tří částí:

  • Hlavní část – zodpovědná za nahrání modulu, aktivaci ostatních částí, periodické volání testů a za také udržování databáze informací o procesech a výsledcích testů, které na ně byly aplikovány
  • Testy – podmoduly, které testují vlastnosti či chování procesů a přidělují jim trestné body
  • Akce – podmoduly, které se mohou aktivovat, pokud nějaký proces překročí stanovenou bodovou hranici

Navržené testy

Navržené testy se zaměřují na výše uvedené tři bezpečnostní problémy. Detaily o použitých testech jsou k dispozici ve zmíněné práci, zde pouze telegraficky:

  • pro každý bezpečnostní problém se snažíme vypátrat jeho typické znaky a postihnout je v testech,
  • testy zkoumají jak chování procesu (např. „proces vytváří symlink v cizím adresáři“), tak jeho okamžitý stav (např. „proces běží s EUID 0“),
  • součástí IDS je test, který zkoumá anomálie v historii vykonávání systémových volání procesu (zde se snažíme postihnout oblast detekce anomálií, bohužel se to ukázalo jako nepříliš užitečné).

Akce

Systém obsahuje různé akce, které se mohou aktivovat na základě bodového hodnocení, například výpis reportu procesu na konzoli či zaslání reportu e-mailem, uložení obrazu paměti procesu (core dump) nebo zabití procesu a jeho dětí (zde se už dostáváme do oblasti IPS).

Nastavení proměnných

Pokud stanovíme bodovou hranici, od které budou procesy považovány za nebezpečné, musíme vyřešit zásadní otázku: kolik bodů má proces dostat za to, že projde jedním konkrétním testem? Nebudeme znovu objevovat kolo, autoři SpamAssassinu používají pro ohodnocení svých proměnných genetický algoritmus, uděláme to tedy stejně.

Genetický algoritmus

Genetické počítání je metoda založená na evolučních principech, která se používá nejčastěji na optimalizační úlohy. Máme nějakou populaci možných řešení daného problému a ohodnocovací funkci, která nám pro každé možné řešení spočítá jeho vhodnost – čím lepší řešení, tím vyšší (nebo nižší) hodnotu z něj funkce spočítá. Pokud existuje nějaké ideální řešení, nabývá na něm ohodnocovací funkce maxima (či minima). Genetický algoritmus pracuje v iteracích a v každé iteraci aplikuje na populaci řešení principy

  • selekce – odstraní nejméně vhodná řešení,
  • mutace – náhodně vybraná řešení náhodně modifikuje,
  • křížení – náhodně vybraná řešení „promixuje“ mezi sebou.

Po dostatečném množství iterací se vybere z populace nejvhodnější dostupné řešení.

Evaluator

Pro implementaci genetického algoritmu jsme vytvořili nástroj jménem Evaluator. Populace řešení v našem případě představuje množinu různých ohodnocení všech bodových proměnných, genetický algoritmus se pak snaží najít nejvhodnější ohodnocení.

A jak poznáme „vhodnost“ nějakého ohodnocení? Do Evaluatoru se nahrají reporty procesů vygenerované kernelovým modulem IDS. Těchto reportů musí být dostatečné množství a musí pokrývat jak bezpečné, tak nebezpečné procesy (tj. procesy, které prováděly nějaký pokus o průnik). Uživatel potom v Evaluatoru označí, které procesy jsou bezpečné a které jsou podezřelé. Genetický algoritmus hledá takové ohodnocení bodových proměnných, které by způsobilo co nejnižší bodový součet u bezpečných procesů a současně co nejvyšší bodový součet u těch, které byly označeny za nebezpečné.

Screenshot Evaluatoru
Screenshot Evaluatoru

Trénování a testování systému

Pro trénování (učení) systému jsme použili několik vzorků reálných průniků za pomoci exploitů nalezených na Internetu. Reporty vygenerované kernelovým modulem jsme nahráli do Evaluatoru a po označení nebezpečných procesů (těch, které se podílely na průnicích) jsme nechali genetický algoritmus, aby stanovil bodové ohodnocení jednotlivých testů. S tímto bodovým ohodnocením jsme potom systém testovali na nových průnicích, které měl IDS modul odhalit.

Výsledkem testování byla následující zjištění (některá jsou pozitivní, některá spíše negativní):

  • Systém v trénovací fázi celkem úspěšně rozlišil bezpečné a nebezpečné procesy (tj. dokázal stanovit ohodnocení proměnných tak, aby bezpečné procesy měly nízký součet bodů, zatímco nebezpečné procesy překročily stanovenou hranici). Výjimkou byly útoky typu zneužití symlinků, kde zřejmě testy byly napsány příliš obecně.
  • V testovací fázi systém správně rozpoznal všechny průniky.
  • Při běžné práci systém nehlásil falešné poplachy, ale za určitých specifických podmínek měl tendenci generovat falešné poplachy, které se týkaly vytváření symlinků (opět zřejmě z toho důvodu, že testy na symlinky byly napsány příliš obecně).
  • Útoky typu Denial of service byly sice rozpoznány, ale jen díky troše fixlování – testy byly napsány na míru konkrétním vzorkům útoků. Pro tyto útoky není IDS modul (v současné podobě) příliš vhodný.
  • Většina průniků byla rozeznána pomocí nějakého konkrétního znaku typického pro daný typ útoku, takže systém příliš nedokázal využít výhody, kterou má proti jiným IDS (sledování více aspektů současně). To je zřejmě důsledkem malého množství testů, malého množství dostupných testovacích vzorků (exploitů) a také toho, že testování bylo prováděno jen na typických příkladech několika útoků.

Metoda ukázala svůj potenciál, ale pro praktické použití by bylo třeba IDS modul dopracovat a v některých bodech rozšířit. Součástí zmíněné diplomky je i navržení některých vylepšení. Zajímavé by jistě bylo otestovat systém na volně dostupném nezáplatovaném serveru na Internetu (neboli honey-potu).

Závěr

Součástí diplomového projektu je funkční prototyp kernelového modulu a Evaluatoru. Tento prototyp je vhodný pro zkoumání problému, ale nikoli pro reálné nasazení. Jednak má řadu omezení, jednak obsahuje pouze základní myšlenky testů, které by bylo třeba podrobněji rozpracovat.

bitcoin_skoleni

Vzhledem ke kladné odezvě na diplomku nyní uvažuji o založení projektu, jehož cílem by bylo vytvořit prakticky použitelný IDS založený na těchto principech. Pokud čte tento článek někdo, koho tato oblast zajímá a chtěl by se na takovém projektu podílet, neváhejte a ozvěte se :).

Odkaz: Diplomová práce a zdrojové kódy projektu

Autor článku