Biztonsági tesztelés forráskód alapú hibainjektálással 1



Hasonló dokumentumok
Adatstruktúrák, algoritmusok, objektumok

Pénzügyi algoritmusok

Verifikáció és validáció Általános bevezető

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Használati alapú és modell alapú tesztelés kombinálása szolgáltatásorientált architektúrák teszteléséhez az ipari gyakorlatban

Programrendszerek tanúsítása szoftverminőség mérése

Beszédfelismerés alapú megoldások. AITIA International Zrt. Fegyó Tibor

A programkód átvizsgálásának hatékonyságát két ok magyarázza:

A modellellenőrzés érdekes alkalmazása: Tesztgenerálás modellellenőrzővel

Smart Strategic Planner

Modell alapú tesztelés mobil környezetben

Automatikus tesztgenerálás modell ellenőrző segítségével

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Szoftver újrafelhasználás

Kölcsönhatás diagramok

Bevezetés a Python programozási nyelvbe

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

Intervenciós röntgen berendezés teljesítményszabályozójának automatizált tesztelése

III. Alapfogalmak és tervezési módszertan SystemC-ben

Fogalomtár Etikus hackelés tárgyban Azonosító: S2_Fogalomtar_v1 Silent Signal Kft. Web:

Turing-gép május 31. Turing-gép 1. 1

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

A modellellenőrzés érdekes alkalmazása: Tesztgenerálás modellellenőrzővel

IT biztonsági szintek és biztonsági kategorizálási minta

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

Integráci. ciós s tesztek. ciós s tesztek (folyt.) Integration Level Testing (ILT) Ficsor Lajos. Miskolci Egyetem Általános Informatikai Tanszék

Univerzális munkafolyamat szimulátor

A szoftver-folyamat. Szoftver életciklus modellek. Szoftver-technológia I. Irodalom

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán

Petőfi Irodalmi Múzeum. megújuló rendszere technológiaváltás

Modellinformációk szabványos cseréje. Papp Ágnes, Debreceni Egyetem EFK

Teszt terv Új funkció implementációja meglévı alkalmazásba

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Hibabehatárolási útmutató [ß]

Pénzügyi algoritmusok

Programozás alapjai Bevezetés

Hálózati architektúrák laborgyakorlat

13. Fájlformátumok. Schulcz Róbert Madarassy László 13. Fájlformátumok v

Mai program. Web Technológiák. Webalkalmazások. Webalkalmazás, mint UI

PDF DOKUMENTUMOK LÉTREHOZÁSA

Szoftver karbantartási lépések ellenőrzése

Szoftver-technológia II. Szoftver újrafelhasználás. (Software reuse) Irodalom

Multimédiás adatbázisok

E-Számlázás az ECOD rendszeren belül. Horváth Péter, Senior Projekt Menedzser Synergon Retail Systems Kft.

S01-8 Komponens alapú szoftverfejlesztés 2

Digitális technika (VIMIAA02) Laboratórium 1

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Az adatszolgáltatási rendszer kliens felülete

Programtervezés. Dr. Iványi Péter

A SEPA fizetésekre történı felkészülés

Digitális technika (VIMIAA02) Laboratórium 1

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

Biztonságos szoftverek fejlesztése, a by design elv a gyakorlatban. Hétpecsét LXXXIV. Szakmai Fórum január 16. Hornák Zoltán

Mutatók és mutató-aritmetika C-ben március 19.

Mobil Peer-to-peer rendszerek

1. Bevezető. 2. Sérülékenységek

7. fejezet: Mutatók és tömbök

Biztonsági folyamatirányító. rendszerek szoftvere

Szoftverspecifikáció fázis: Követelmény specifikáció. 2. fázis: Követelmények feltárása és elemzése

Alprogramok, paraméterátadás

Podoski Péter és Zabb László

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

SOA modell: Ez az interfész definiálja az elérhető adatokat, és megadja, hogy hogyan lehet azokhoz hozzáférni.

OOP. Alapelvek Elek Tibor

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Nyilvántartási Rendszer

Kommunikáció. 3. előadás

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Folyamatmodellezés és eszközei. Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék

C programozási nyelv

Hibatűrés. Majzik István Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék

SSL elemei. Az SSL illeszkedése az internet protokoll-architektúrájába

Autóipari beágyazott rendszerek Dr. Balogh, András

Számítógépes Hálózatok. 7. gyakorlat

Ez idézte elı az olyan fejlesztési folyamatokat, amelyek a gyors szoftverfejlesztésre és átadásra összpontosítanak.

Szakdolgozat feltöltése a DEA-ba

DSD DSD. Egy országos méretű orvosi adatbázissal kapcsolatos informatikai kihívások. Kovács László Pataki Balázs Pataki Máté MTA SZTAKI DSD

Titkosítás NetWare környezetben

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bevezetés az SAP világába. 5. Kommunikációs és integrációs technológiák

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

Programozási nyelvek Java

Norway Grants. Az akkumulátor mikromenedzsment szabályozás - BMMR - fejlesztés technológiai és műszaki újdonságai. Kakuk Zoltán, Vision 95 Kft.

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Object Orgy PROJEKTTERV 1 (9) Adattípusok menedzselése Palatinus Endre

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

A prototípus gyors, iteratív fejlesztése azért nagyon fontos, mert a költségek így ellenırizhetık.

Operációs rendszerek. Az X Window rendszer

Flex tutorial. Dévai Gergely

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Szoftverminőségbiztosítás

Ajax és Echo 2. Bokor Attila

Webes alkalmazások fejlesztése

Simon Balázs Dr. Goldschmidt Balázs Dr. Kondorosi Károly. BME, Irányítástechnika és Informatika Tanszék

Hardver leíró nyelvek (HDL)

Irányítástechnika Elıadás. PLC rendszerek konfigurálása

Átírás:

Biztonsági tesztelés forráskód alapú hibainjektálással 1 Tóth Gergely, Hornák Zoltán SEARCH-LAB Kft. gergely.toth, zoltan.hornak@search-lab.hu Az informatikai rendszerekben megbújó kihasználható biztonsági szoftverhibák hatalmas károkat okoznak világszerte. A bemutatásra kerülı biztonsági hibákat hibainjektálás alapú teszteléssel felderítı módszer célja, hogy költséghatékony alternatívát nyújtson a jelenlegi drága biztonság-növelı lehetıségeknek, a formális validálásnak illetve a kimerítı tesztelésnek. Az új módszer lényege, hogy a használt adatstruktúrák leírójára támaszkodva képes generikus teszt algoritmusokat futtatni, melyek közvetlenül a tesztelni kívánt kódrészletekbe injektálnak automatizáltan generált teszt vektorokat, majd képes megfigyelni, hogy ezen szélsıséges esetekben a vizsgált rendszer le tudja-e kezelni a hibát, vagy biztonsági hibához hasonló reakciót vált-e az ki. Kulcsszavak: biztonsági tesztelés, hibainjektálás, forráskód alapú tesztelés Bevezetés A programozói hibákat három csoportra oszthatjuk: (1) általános, funkcionalitást befolyásoló hibák; (2) biztonsági szempontból veszélyes hibák, melyek bizonyos esetekben azt okozhatják, hogy az adott rendszer biztonsági tulajdonságai sérülnek (de ebben a kategóriában még nem feltétlenül kihasználható a hiba, csupán fennáll annak veszélye); (3) végül pedig kihasználható biztonsági lyukak, amelyeken keresztül közvetlen támadás intézhetı a rendszer ellen. A gyakorlatban akkor nevezhetünk egy rendszert biztonságosnak, ha nincs benne kihasználható biztonsági lyuk. Ennek bizonyításához azonban komplex formális módszerek vagy kimerítı tesztelés szükséges. Ha azonban nem csak közvetlenül a kihasználható biztonsági lyukak felderítésére koncentrálunk, hanem azok okait, a biztonsági szempontból veszélyes hibákat kívánjunk felfedezni és kiküszöbölni, akkor bár látszólag szélesebb körő tesztelést kell végrehajtani költséghatékonyabban aránylag magas fokú biztonságot tudunk elérni. A leggyakoribb biztonsági szempontból veszélyes hiba típusokhoz ugyanis léteznek algoritmusok, melyek ezeket költséghatékonyan, mégis nagy megbízhatósággal detektálni tudják és a legtöbb felhasználási területen az így elérhetı biztonsági szint lényeges is javulást eredményezne. A bemutatásra kerülı módszer illetve a Flinder keretrendszer lényege, hogy a tesztelendı programban (Target of Evaluation, ToE) felkutassa a biztonsági szempontból veszélyes hibákat mielıtt kihasználható biztonsági lyukakká válnának. Flinder erre két lehetıséget biztosít: az úgynevezett black-box (amikor a forráskód nem ismert) és a forráskód alapú tesztelést. Black-box tesztelés Black-box tesztelés során Flinder a ToE és az úgynevezett Input Generátor (IG) eszköz közötti (pl. egy kliens-szerver alkalmazás esetén a kliens és a szerver közötti) üzeneteket manipulálja oly módon, hogy az algoritmikusan módosított teszt vektorok minél nagyobb 1 A projektet a Gazdasági Versenyképesség Operatív Program támogatta (GVOP 3.3.1 2004 04 0094/3.0).

valószínőséggel okozzanak anomáliát (pl. lefagyást, védelmi hibát) a ToE-ben, amit utána detektálni lehet és így fény derülhet a biztonsági hibára. Flinder az üzenetmódosítást a következıképpen végzi: beépül a tesztelendı program (ToE) és az azt input üzenetekkel mőködésre bíró Input Generátor (IG) közé, majd megfigyeli és manipulálja a közöttük folyó kommunikációt. Miután a ToE és IG közötti üzeneteket Flinder elkapta, szükség van a nyers bináris formátum értelmezésére, egységes formátumra való transzformációjára. A Flinder értelmezı (parser) moduljának feladata, hogy a bináris üzenetet egy belsı, általános fa struktúrába, ún. MSDL-be (Message Structure Description Language) konvertálja. Ehhez egy formátum leíróra van szüksége, ami a bináris üzenetek formátumát specifikálja. A formátum leíró az MFDL (Message Format Description Landuage) követelményeinek megfelelı XML dokumentum (egy példát az 2. ábrán mutatunk be). Ezek után a konkrét teszt vektort a megfelelı algoritmus az MSDL módosításával generálja, amit az ún. szerializáló modul (az értelmezı ellentettje) transzformál vissza bináris formába, ami így jut el a címzetthez, a ToE-hez. A tesztelés és a kommunikáció során használt protokoll állapotát Flinder egy állapotgépben tárolja, melynek segítségével nem csak egy kérés-válasz jellegő kommunikációt, hanem több üzenetváltást is magába foglaló protokollt is értelmezni tud. Fontos megjegyezni, hogy az MSDL általános volta miatt a konkrét bináris formátumtól függetlenül generikus tesztelı algoritmusok futhatnak (így tehát pl. ugyanaz az algoritmus tud futni a DER kódolású üzenetek tesztelésénél és a szöveg alapú HTTP-nél is). Forráskód alapú tesztelés Forráskód alapú tesztelés során a cél, hogy a tesztelı algoritmusok a teszt vektorokat a program belsı függvényeibe (pl. mint függvényparaméterek) tudják bejuttatni, a mi szóhasználatunkban injektálni. Ehhez a munkamódszer adaptálásra szorul: az architektúrát úgy kell módosítani (lásd 1. ábra), hogy a tesztelni kívánt programhoz hozzá kell fordítani az MFDL formátum leíró alapján automatizáltan generált forráskódú értelmezıt (MSDL író) és szerializálót (MSDL olvasó), melyek képesek Flinder számára a tesztelendı adatstruktúrákat MSDL formátumba átírni (MSDL író), majd a teszt vektort Flindertıl fogadva az adott nyelv belsı adatstruktúrájának megfelelıen visszafordítani (MSDL olvasó). Maga a teszt vektor elıállítása így továbbra is általános: eredeti MSDL-bıl kell az algoritmikusan generált teszt MSDL-t elıállítani.

Tesztelendı program int testee(char* p1,...) int result = doprocess(p1,...); return result; Flinder Forráskódhoz adott modulok, melyek az MFDL alapján automatizáltan generálódtak Formátum leíró int testee(char* p1,...) // hivás-átadás, hogy Flinder // tesztelje az adatokat TestWithFlinder(p1,...); MSDL író // normál mőködés folytatása // a megváltoztatott értékekkel int result = doprocess(p1,...); return result; MSDL olvasó MSDL író MSDL olvasó Teszt algoritmus Állapotgép Generikus Flinder modulok 1. ábra Forráskód alapú hibainjektálás Flinderrel A black-box tesztelés menetét és a felmerült problémákat [1]-ben publikált írásunk elemzi, ebben a cikkben a forráskód alapú tesztelésre fókuszálunk, mivel ez integrálható legjobban a szoftverfejlesztési életciklusba. Itt kell megemlíteni, hogy Flinder tervezésénél fontos szempont volt, hogy minél több modult tudjunk mind black-box, mind pedig forráskód alapú tesztelésnél is használni ezért is hasonlít a két megközelítés architektúrája. Flinder fı tulajdonságai Flinder fı célja a biztonsági szempontból veszélyes hibák felderítése függetlenül attól, hogy azok kihasználhatók-e, vagy sem. Erre a feladatra számos módszer és termék létezik már, azonban Flinder több újdonsággal is rendelkezik, melyek automatizmusokkal és új megközelítésekkel csökkentik a tesztelık által végrehajtandó munka mennyiségét: Formátum leíró alapú tesztelés: a Flinder által alkalmazott módszer lényege, hogy a teszt vektorok elıállításához csak a formátum leírót használja, melyet más leírónyelvekbıl (pl. XML Schema [4]) akár automatizáltan is elı lehet állítani. Bár az MFDL pontos specifikációját terjedelmi okokból ez a cikk nem tartalmazza, egy könnyen megérthetı példát az 2. ábra tartalmaz. A már meglevı módszerekkel szemben a nem megfelelı mőködés felismeréséhez Flinder nem igényli a helyes mőködés részletes specifikációját a rendszer képes a teszt vektorokat helyes bemenetek és a formátum leírók alapján generálni. Generikus, cserélhetı teszt algoritmusok: az architektúra további elınye, hogy a tesztelı algoritmusok generikus adatstruktúrán, az MSDL-en dolgoznak, így nem szükséges azok adaptációja az éppen tesztelni kívánt környezethez, ezek az algoritmusok ún. plug-in rendszerben mőködnek Flinderen belül. Fontos hangsúlyozni, hogy számos gyakori biztonsági hiba osztályhoz lehet ilyen általános tesztelı algoritmust készíteni (pl. puffertúlcsordulás, egész szám túlcsordulás, vagy kódolási hibák detektálására).

Állapotgép: megemlítendı még, hogy Flinder bonyolultabb tesztek futtatásának segítéséhez egy ún. protokoll állapotgépet is futtat, mely az éppen tesztelni kívánt forgatókönyv UML state machine [2] alapú leírását tartalmazza. Ily módon a rendszer képes komplex folyamatok illetve protokollok követésére is. Forráskód alapú tesztelésnél ez az állapotgép használható akár a program futásának nyomon követésére is. Kriptogrammok támogatása: Flinder annak érdekében, hogy kriptográfiai eszközöket felvonultató protokollok implementációját is tesztelni tudja (pl. SSL) támogatja a különbözı kriptográfiai primitíveket (lenyomatkészítés, titkosítás, digitális aláírás stb.). Az MFDL megfelelı kialakításával az értelmezı képes pl. egy eredetileg titkosított üzenetet elıször dekódolni, majd tovább értelmezni (természetesen a szerializáló is támogatja ezeket a mőveleteket), így akár egy teljesen rejtjelezett protokoll implementációja is tesztelhetı Flinderrel. Forráskód alapú tesztelés Flinderrel Flinder általános ismertetése után most következzék a konkrét tesztelési módszer ismertetése: 1. Elsı lépésként el kell készíteni a tesztelendı adatstruktúráknak megfelelı formátum leírót. Egy egyszerő példát C nyelvő adatstruktúrákhoz az 2. ábrán láthatunk. 2. Ezután az MFDL alapján Flinder olyan függvények forráskódját generálja, melyek képesek az MFDL-nek megfelelı adatstruktúra illetve objektum példányokat MSDL-lé konvertálni, illetve MSDL alapján egy konkrét példány változóit értékekkel feltölteni. 3. A generált forráskódot a tesztelendı programhoz fordítva elıáll ezeket a belsı kapcsolódási lehetıségeket (ún. hook-okat) tartalmazó ToE, melyet Flinder különbözı konfigurációkkal fog futtatni. 4. Flinder futtatja a ToE-t, majd a megfelelı pontokon a tesztelı algoritmus módosítja a generált MSDL-t. A teszt vektor visszainjektálása után Flinder figyeli a korrekt futást (nem terminálódik-e abnormálisan a ToE, az állapotgépnek megfelelı állapotba kerül-e a tesztelt program stb.). Ezt a lépést Flinder többször is végrehajthatja, amennyiben egy többlépéses, ún. iteratív tesztelı algoritmust hajt végre. 5. Végül a tesztelések eredményeirıl Flinder jegyzıkönyvet készít, melyben részletesen összefoglalja a végzett teszteket, rögzíti a felhasznált teszt vektorokat és a ToE reakcióit. MFDL példa A 2. ábrán a C nyelvő adatstruktúra-mfdl megfeleltetés kerül bemutatásra, valamint részlet látható az MFDL alapján generált C nyelvő MSDL író és olvasó funkciókból. Fontos megemlíteni, hogy bár az MFDL automatikusan generálható a típus definíciókból, a tesztelı számára megtartottuk annak lehetıségét, hogy az MSDL-változó konverziót befolyásolja. Erre szolgálnak az MFDL-ben elhelyezendı preparseaction és postserializeaction mezık, melyek olyan, a forráskód nyelvének megfelelı kódrészleteket tartalmazhatnak, amik az adott mezı konvertálását hivatottak elvégezni.

C stílusú változó deklaráció és típus definíciók. MFDL, mely megfelel a változó deklarációnak, a típus definícióknak és ami tartalmazza a mőveleteket, amelyek segítségével az adatokat Flinder számára elı lehet készíteni, illetve tıle vissza lehet olvasni. <mfdl> A_t avar; struct A_t unsigned int a; ; char* p; B_t* bptr; struct B_t int c; ; std::string d; <element name="avar" type="a_t" /> <sequence name="a_t"> <element name="a" type="uint32_t"> <preparseaction>parse_uint32_t(in->a);</preparseaction> <postserializeaction>out->a=serialize_uint32_t();</postserializeaction> <element name="p" type="string_t"> <preparseaction>parse_string_t(in->p);</preparseaction> <postserializeaction>out->p=serialize_string_t();</postserializeaction> <element name="bptr" type="b_t"> <preparseaction>parse_b_t(in->bptr);</preparseaction> <postserializeaction>serialize_b_t(out->bptr);</postserializeaction> </sequence> <sequence name="b_t"> <element name="c" type="int32_t"> <preparseaction>parse_int32_t(in->c);</preparseaction> <postserializeaction>out->c=serialize_int32_t();</postserializeaction> <element name="d" type="bytestream_t"> <preparseaction>parse_bytestream_t(in->d);</preparseaction> <postserializeaction>out->d=serialize_bytestream_t();</postserializeaction> </sequence> </mfdl> Az MFDL alapján automatizáltan generált forráskód, amely az adatokat áradja Flindernek, illetve visszaolvassa a módosított értékeket. void TestWithFlinder(A_t* ptr) // MSDL elıkészítése MSDL_c msdlout; // Munka kontextus beállítása SetContext(msdlOut.rootNode(), avar ); // C változó kiírása MSDL-be Parse_A_t(ptr); // MSDL elküldése Flindernek, illetve válasz fogadása MSDL_c msdlin=transformbyflinder(msdlout); // Munka kontextus beállítása SetContext(msdlIn.rootNode(), avar ); // MSDL visszaolvasása a tesztelendı változóba Serialize_A_t(ptr); A fı tesztelı függvény automatizáltan generálódik. Feladata 1) a tesztelendı változóból MSDL készítése és annak Flinderhez történı továbbítása, illetve 2) a Flinder által elıállított teszt MSDL visszaolvasása a tesztelendı változóba. void Parse_A_t(A_t *in) // MSDL konténer készítése A_t-nek MSDLNode *curnode=getcontextnode().createnewcompoundchildnode( A_t, GetContextName()); // Gyermek elemek feldolgozása MFDL alapján generált lista SetContext(curNode, a ); Parse_uint32_t(in->a); SetContext(curNode, p ); Parse_string_t(in->p); SetContext(curNode, bptr ); Parse_B_t(in->bPtr); A preparseaction-ök bemásolódnak az MFDL-bıl. void Parse_uint32_t(unsigned int ui) MSDLNode* curnode=getcontextnode(). CreateNewElementChildNode( uint32_t, GetContextName()); curnode->setvalue(ui); Beépített primitív típusokhoz Flinder biztosít transzformációs függvényeket. void Serialize_A_t(A_t* out) // Aktuális MSDL konténer elıkészítése MSDLNode *curnode=getcontextnode().child(); // Gyerek elemek felöltése a Flindertıl származó // értékekkel MFDL alapján generált lista SetContextNode(curNode); out->a=serialize_uint32_t(); SetContextNode(curNode=curNode->Next()); out->p=serialize_string_t(); SetContextNode(curNode=curNode->Next()); out->bptr=serialize_b_t(out->bptr); A postserializeaction-ök bemásolódnak az MFDL-bıl. unsigned int Serialize_uint32_t() return GetContextNode().GetUint32Value(); Beépített primitív típusokhoz Flinder biztosít transzformációs függvényeket. 2. ábra Példa adatstruktúra, hozzá tartozó MFDL és generált kódrészlet

Teszt algoritmus példa Az MFDL példát folytatva tekintsünk át egy egyszerő tesztelı algoritmust. Tételezzük fel, hogy a 3. ábrán látható tipikus, puffer túlcsordulásos biztonsági hibát tartalmazó kódrészletet teszteljük Flinderrel. 3. ábra Puffertúlcsordulásos hibát tartalmazó függvény Amennyiben a fenti függvény futtatása során az A_t típusú struktúra p mezıje 10 bájtnál hosszabb sztringre mutat, úgy a másolás túl fogja írni a lokális fix mérető tömböt. A túlírás adott esetben elérheti a veremben tárolt vezérlési adatstruktúrákat is, sıt akár a függvény visszatérési címét is módosíthatja. Ily módon egy támadó eltérítheti a program futását a függvénybıl való visszatéréskor. Ha pedig nem támadó szándékkal véletlenszerő értékkel íródik felül ez a terület, akkor a program nagy valószínőséggel védelmi hibát fog okozni. 2 Flinder ezen hibatípus felderítésére egy egyszerő algoritmust használ: az MFDL alapján a kapott MSDL-ben megkeresi a változó mérető mezıket (a példánkban ezek az A_t típus p tagváltozója és a B_t típus d tagválozója) és minden meghíváskor megduplázza azok méretét (így pl. p tartalma elıször XX, majd XXXX stb. lesz). Ez az algoritmus gyorsan képes a programozók által feltételezett értéktartományon kívülre jutni és túlméretes értékeket generálni, amik a méretellenırzés hiánya vagy hibája miatt védelmi hibát okozhatnak. A hibásan lekezelt vagy nem ellenırzött méretkorlátokat így Flinder már detektálni tudja, és fény derülhet a biztonsági hibára. Gyorsítási lehetıség még, ha a különbözı mezıket egyszerre nyújtjuk, de opció lehet a mezık soros tesztelése is. Fontos megjegyezni, hogy mivel a tesztalgoritmusok (ebben az esetben a puffertúlcsordulásos hibákat keresı algoritmus) az általános MSDL-en dolgoznak, ugyanaz az algoritmus alkalmazható függetlenül attól, hogy mi is volt a konkrét bemenet. Terjedelmi okokból további algoritmusok ismertetését mellızzük, de hasonló elven számos gyakori típushibára készíthetı effektív algoritmus, melyek együttes alkalmazása lényegesen javíthatja a tesztelt programok biztonsági tulajdonságait. Összefoglalás A cikkben biztonsági hibák automatizált felderítésére mutattuk be a Flinder keretrendszert, mely forráskód alapú hibainjektáláson alapul. A módszer lényege, hogy egy állapotgéppel követett programfutás közben generikus tesztelı algoritmusok gépesek egy univerzális formátum leíró alapján a program belsı függvényeibe teszt vektorokat injektálni, melyek célja a biztonsági hibák miatti abnormális mőködés elıidézése, amit aztán Flinder detektálni tud. Flinder újdonsága, hogy a teszteléshez nem szükséges a helyes mőködés formális 2 A puffertúlcsordulásos hibák veszélyérıl és kihasználásuk módszerérıl [3] részletes áttekintést nyújt.

specifikációja, a tesztelınek helyes bemeneteket, a kommunikáció állapotgépét (UML) és egy XML-alapú formátumleírót kell csak elkészítenie. Ezek alapján már számos gyakori biztonsági hiba típusra automatizáltan végezhetı el a tesztelés. Irodalomjegyzék [1] Tóth G., Hornák Z.: Semi-automated detection of security-relevant programming bugs with Flinder, 2006, www.flinder.hu [2] Object Management Group: UML Unified Modeling Language, 2005 [3] Aleph One: Smashing the stack for fun and profit, Phrack 7, 1996 [4] W3C World Wide Web Consortium: XML Schema, 20004