Puffer túlcsordulás: okok, hatékony módszerek a probléma megoldására és a szükséges védelem

Minden programozó tisztában van a puffer túlcsordulás potenciális veszélyével a programjaiban. Számos fenyegetés kapcsolódik hozzá, mind az új, mind a régi szoftverekben, függetlenül az elvégzett javítások számától. A támadók kihasználhatják az ilyen hibát azáltal, hogy olyan kódot hajtanak végre, amelyet kifejezetten az adatkészlet kezdeti részének túlcsordulására terveztek, majd a fennmaradó részeket a túlcsordult memóriacímre írják.

Az adatok futtatható kódot tartalmazhatnak, amely lehetővé teszi a támadók számára, hogy nagyobb és összetettebb programokat futtassanak, vagy hozzáférést biztosítsanak számukra a rendszerhez. A hibát nagyon nehéz megtalálni és kijavítani, mert a szoftverkód több millió sorból áll. Ezeknek a hibáknak a kijavítása meglehetősen bonyolult, viszont hibára hajlamos is, ami bonyolítja a megszüntetés folyamatát.

Puffertúlcsordulás észlelése

Puffertúlcsordulás észlelése

Mielőtt túlcsordulást keresne, , tudnia kell, mi ez. Ahogy a neve is sugallja, ezek a biztonsági rések a pufferekhez vagy a memóriafoglaláshoz kapcsolódnak olyan nyelveken, amelyek közvetlen alacsony szintű olvasási és írási hozzáférést biztosítanak.

A C és Assembler nyelvek használatakor az ilyen disztribúciók olvasása vagy írása nem ellenőrzi automatikusan a határokat. Ezért, ha verem puffer túlcsordulást észlel ebben az alkalmazásban, akkor nincs ellenőrzés a bájtok számának a kérdéses pufferbe helyezésének lehetőségéről. Ilyen esetekben a program" túlcsordulhat " kapacitásával. Ez ahhoz a tényhez vezet, hogy a kitöltés után írt adatok felülírják a veremben lévő későbbi címek tartalmát, és további címeket olvasnak. A túlcsordulás véletlenül előfordulhat a felhasználói hibák miatt.

Előfordul, hogy ezt az okozza, hogy egy rosszindulatú alany gondosan kidolgozott rosszindulatú bemenetet küld egy programnak, amely ezt követően megpróbálja elégtelen pufferbe menteni. Ha ebben az alkalmazásban verem puffer túlcsordulást észlel, akkor a felesleges adatokat a szomszédosra írja, ahol a meglévő adatok felülíródnak.

Általában tartalmaznak egy mutatót a működtetett funkció visszatérésére - arra a címre, amelyen a folyamatnak tovább kell lépnie. A támadó új értékeket állíthat be úgy, hogy a választott címre mutasson. A támadó általában új értékeket állít be a hasznos teher helyének jelzésére. Ez megváltoztatja a folyamat végrehajtási útvonalát, és azonnal átadja az irányítást a rosszindulatú kódnak.

A puffertúlcsordulás lehetővé teszi a támadó számára, hogy vezéreljen vagy leállítson egy folyamatot, vagy megváltoztassa annak belső változóit. Ez a jogsértés a világ 25 legveszélyesebb programozási hibája közé tartozik (2009 CWE/SANS Top 25 legveszélyesebb programozási hiba), a gyenge rendszerhelyek felsorolásának szótárában pedig CWE-120-ként definiálják. Annak ellenére, hogy jól tanulmányozták őket, továbbra is károsítják a népszerű programokat.

Egyszerű pufferhasználati vektor

A forráskód használatakor különös figyelmet kell fordítani arra, hogy hol használják a puffereket. Különös figyelmet érdemelnek a felhasználó vagy más külső forrás által biztosított bemenethez kapcsolódó funkciók,mivel egyszerű vektort biztosítanak a verem puffer túlcsordulásának észlelésekor. Például, amikor egy felhasználó felteszi az "IGEN" vagy "nem" kérdést, tanácsos a felhasználó karakterlánc-adatait egy kis pufferbe menteni az "igen" karakterlánchoz, amint az a következő példában látható.

Egyszerű pufferhasználati vektor

A kódot tekintve látható, hogy a határellenőrzést nem hajtják végre. Ha a felhasználó belép a "talán" - be, a program összeomlik, nem pedig választ kér tőle, amelyet a pufferbe írnak, függetlenül annak hosszától. Ebben a példában, mivel a felhasználói válasz az egyetlen deklarált változó, a verem következő értékei lesznek a visszatérési cím vagy a memóriában lévő hely értéke, ahová a program visszatér a Kérdezzen függvény végrehajtása után.

Ez azt jelenti, hogy ha a Felhasználó négy bájt adatot ad meg, ami elegendő az ügyfél parancspufferének túlcsordulásához, akkor érvényes visszatérési cím következik, amely megváltozik. Ez azt eredményezi, hogy a program a kód egy másik pontján lép ki a funkcióból, mint az eredetileg tervezték, és a szoftver veszélyes és nem szándékos viselkedését okozhatja.

Ha az első lépés a puffer túlcsordulás észlelésére a forráskódban az, hogy megértsük, hogyan működnek, a második lépés a külső bemenet és a puffer manipuláció tanulmányozása, akkor a harmadik lépés az lesz, hogy megtudja, mely funkciók érzékenyek erre a sebezhetőségre, és amelyek "vörös zászlóként"működhetnek. A gets funkció kiválóan alkalmas a számára biztosított pufferen kívüli írásra. Valójában ez a minőség kiterjed a kapcsolódó képességek teljes családjára, beleértve az strcpy - t, az strcmp-t és a printf/sprintf-et, bárhol is használják ezeket a túlcsordulási sebezhetőségi funkciókat.

Eltávolítás a kódbázisból

Ha verem puffer túlcsordulást észlel a forráskódban, akkor következetesen el kell távolítani őket az adatbázisból. Ehhez ismernie kell a biztonságos munkamódszereket. A sebezhetőségek megelőzésének legegyszerűbb módja egy olyan nyelv használata, amely nem teszi lehetővé őket. A C nyelv rendelkezik ezekkel a sérülékenységekkel a közvetlen memóriahozzáférés és a szigorú objektum-gépelés hiánya miatt. Azok a nyelvek, amelyek nem osztják ezeket a szempontokat, általában sebezhetetlenek. Ezek a Java, Python és .NET, más nyelvekkel és platformokkal együtt, amelyek nem igényelnek speciális ellenőrzéseket vagy változtatásokat.

Természetesen nem mindig lehet teljesen megváltoztatni a fejlesztési nyelvet. Ebben az esetben biztonságos módszereket alkalmaznak dolgozni parancs puffer túlcsordulással. A karakterlánc-feldolgozási funkciók esetében sok vita folyt arról, hogy mely módszerek állnak rendelkezésre, melyek biztonságosak, amelyeket el kell kerülni. A strcpy és strcat függvények egy karakterláncot másolnak egy pufferbe, és az egyik tartalmát hozzáadják a másikhoz. Ez a két módszer nem biztonságos viselkedést mutat, mert nem ellenőrzik a célpuffer határait, és kívülről írnak, ha elegendő bájt van ehhez.

Alternatív védelem

Az egyik gyakran javasolt alternatíva a kapcsolt verziók, amelyek a célpuffer maximális méretére írnak. Első pillantásra úgy néz ki, mint egy ideális megoldás. Sajnos ezeknek a funkcióknak van egy kis árnyalata, amely problémákat okoz. A határérték elérésekor, ha a végződő karakter nem illeszkedik az utolsó bájtba, súlyos puffer olvasási hibák.

Alternatív védelem

Ebben az egyszerűsített példában a nem nulla végű húrok veszélye látható. Amikor a foo-t a normál pufferbe helyezzük, nullával végződik, mert extra hely van. Ez a legjobb eset. Ha a verem puffertúlcsordulási bájtjai egy másik karakterpufferben vagy egy másik nyomtatható karakterláncban vannak, a nyomtatási funkció addig folytatja az olvasást, amíg el nem éri a karakterlánc végső karakterét.

Hátránya, hogy a C nyelv nem nyújt szabványos, biztonságos alternatívát ezekre a funkciókra. Mindazonáltal van egy pozitív-több megvalósítás elérhetősége egy adott platform számára. Az OpenBSD biztosítja a strlcpy és a strlcat funkciókat, amelyek hasonlóan működnek, mint az strn függvények, azzal a különbséggel, hogy egy karakterrel korábban csonkolják a karakterláncot szoba A null terminator.

Hasonlóképpen, a Microsoft saját biztonságos implementációt biztosít az általánosan használt karakterlánc-feldolgozási funkciókhoz: strcpy_s, strcat_s és sprintf_s.

Előnyösebb a fent felsorolt biztonságos alternatívák használata. Ha ez nem lehetséges, végezzen kézi határellenőrzést és null lezárást a karakterlánc-pufferek feldolgozásakor.

Összeállítási sebezhetőségek

Összeállítási sebezhetőségek

Ha egy nem biztonságos funkció nyitva hagyja a puffer túlcsordulás lehetőségét C, akkor minden nem vész el. EGY program futtatásakor a fordítóprogramok gyakran véletlenszerű értékeket hoznak létre, amelyeket Kanári-szigeteknek neveznek, és a verembe helyezik őket, így veszélyesek. A Kanári értékének az eredeti értékhez viszonyított ellenőrzése meghatározhatja, hogy történt-e Windows puffertúlcsordulás. Ha az érték megváltozott, a program bezáródik, vagy hibaállapotba kerül, nem pedig potenciálisan megváltozott visszatérési címre.

Néhány modern operációs rendszer kiegészítő puffertúlcsordulás elleni védelmet nyújt nem végrehajtható halmok és címtér-allokációs randomizálás (ASLR)formájában. Nem végrehajtható halmok-Adatvégrehajtás megelőzése (dep) - jelölje meg a veremet, és bizonyos esetekben más struktúrákat olyan területekként, ahol a kód nem kerül végrehajtásra. Ez azt jelenti, hogy a támadó nem tudja beadni az exploit kódot a verembe, és várni a sikeres végrehajtásra.

A puffer túlcsordulás rögzítése előtt csomagolja ki az ASLR-t a számítógépen. Úgy tervezték, hogy megvédje a visszatérésorientált programozást, mint a nem végrehajtható halmok megkerülését, ahol a meglévő kódfragmensek láncolva vannak a címeltolásuk alapján.

Úgy működik, hogy randomizálja a struktúrák memóriarégióit, hogy azok eltolását nehezebb meghatározni. Ha ez a védelem az 1980-as évek végén létezett volna, a Morris férget meg lehetett volna akadályozni. Ez annak köszönhető, hogy részben úgy működött, hogy kitöltött egy puffert a UNIX finger protokollban exploit kóddal, majd túlcsordult, hogy megváltoztassa a visszatérési címet, és a kitöltött pufferre mutasson.

Az ASLR és a DEP bonyolítja a megadandó cím pontos meghatározását azáltal, hogy ez a memóriaterület teljesen nem működik. Előfordul, hogy egy biztonsági rés átcsúszik a puffertúlcsordulási támadásokra nyitott repedéseken, annak ellenére, hogy fejlesztői, fordítói vagy operációs rendszer szintű vezérlők vannak jelen.

Statikus lefedettség elemzés

Puffer túlcsordulási helyzetben két kulcsfontosságú feladat van. Először is meg kell határozni a biztonsági rést, és módosítani kell a kódbázist oldja meg a problémát. Másodszor, biztosítják a puffer túlcsordulási sebezhetőségi kód összes verziójának cseréjét. Ideális esetben ez az összes internethez csatlakoztatott rendszer automatikus frissítésével kezdődik.

Nem feltételezhető, hogy egy ilyen frissítés elegendő lefedettséget biztosít. Szervezetek vagy magánszemélyek használhatják a szoftvert korlátozott Internet-hozzáféréssel rendelkező rendszereken, amelyek kézi frissítést igényelnek. Ez azt jelenti, hogy a frissítéssel kapcsolatos híreket el kell juttatni minden olyan rendszergazdához, aki használhatja a szoftvert, és a javításnak könnyen letölthetőnek kell lennie. A javítások létrehozása és terjesztése a lehető legközelebb történik a biztonsági rés észleléséhez, ami minimálisra csökkenti a biztonsági rés időtartamát.

A biztonságos pufferfeldolgozó funkciók és a megfelelő fordító és az operációs rendszer biztonsági funkciói megbízható puffer túlcsordulás elleni védelmet hozhat létre. Ezeket a lépéseket szem előtt tartva, a hibák következetes azonosítása döntő lépés a kizsákmányolás megelőzésében.

A forráskód sorainak kombinálása a potenciális fenyegetések keresése során unalmas lehet. Ezenkívül mindig van esély arra, hogy az emberi szemek valami fontosat hagyjanak ki. A statikus elemző eszközöket a kódminőség biztosítására használják, kifejezetten a fejlesztés során a biztonsági rések észlelésére tervezték.

Statikus lefedettség analízis készletek "piros címkék" potenciális puffertúlcsordulások esetén. Ezután külön feldolgozzák és javítják őket, hogy ne keressenek manuálisan az adatbázisban. Ezek az eszközök a rendszeres ellenőrzésekkel és a túlcsordulások kiküszöbölésének ismeretével együtt lehetővé teszik a hiányosságok túlnyomó többségének azonosítását és kiküszöbölését a szoftverfejlesztés befejezése előtt.

Támadás végrehajtása root-on keresztül

A kódolási hibák általában a puffer túlcsordulásának okai. Gyakori hibák az ehhez vezető alkalmazások fejlesztésekor magában foglalja az elég nagy pufferek kiosztásának képtelenségét, valamint a problémák ellenőrzésére szolgáló mechanizmus hiányát. Az ilyen hibák különösen problematikusak a c / c++ nyelvekben, amelyek nem rendelkeznek beépített túlcsordulás elleni védelemmel, és gyakran puffer túlcsordulási támadások célpontjai.

Bizonyos esetekben a támadó rosszindulatú kódot szúr be a memóriába, amely a verem puffertúlcsordulás miatt sérült meg. Más esetekben egyszerűen kihasználják a szomszédos memória sérülését. Például egy olyan program, amely a felhasználó jelszavát kéri, hogy hozzáférést biztosítson neki a rendszerhez. Az alábbi kódban a helyes jelszó root jogosultságokat biztosít. Ha a jelszó helytelen, a program nem ad felhasználói jogosultságokat.

A program nem ad jogosultságokat a felhasználónak

A fenti példában a program root jogosultságokat ad a felhasználónak, még akkor is, ha helytelen jelszót adott meg. Ebben az esetben a támadó olyan bemenetet biztosít, amelynek hossza hosszabb, mint amennyit a puffer képes tárolni, túlcsordulást hozva létre, amely felülírja az egész átadás memóriáját. Ezért a helytelen jelszó ellenére a pass érték nem nulla lesz, a támadó pedig root jogokat kap.

Ideiglenes Tárolási Terület Támadása

A puffer egy ideiglenes terület az adatok tárolására. Amikor egy program vagy rendszerfolyamat több adatot helyez el, mint amennyit eredetileg tárolásra szántak, további adatok túlcsordulnak. Ez azt okozza, hogy némelyikük más pufferekbe szivárog, megsérül vagy felülírja az adatokat.

Túlcsordulási támadás esetén a kiegészítő adatok speciális utasításokat tartalmaznak egy hacker vagy rosszindulatú felhasználó által tervezett műveletekre, például olyan választ okoznak, amely károsítja a fájlokat, módosítja az adatokat vagy közzéteszi a személyes adatokat.

A támadó túlcsordulási kihasználást használ a felhasználói bevitelre váró program előnyeinek kihasználására. A puffertúlcsordulásnak két típusa van: verem-alapú és kupac-alapú. Heap-alapú nehéz végrehajtani, és a legkevésbé gyakori, miközben támadják az alkalmazás kitöltésével fenntartott hely a program.

Stack - a felhasznált memóriaterület a felhasználó tárolása bemenet. Ez a túlcsordulás gyakoribb az alkalmazásokat használó támadóknál.

A Modern fordítóprogramok általában lehetővé teszik a túlcsordulás ellenőrzését a fordítás/összekapcsolás során, de futásidőben meglehetősen nehéz ellenőrizni ezt a problémát minden további kivételkezelés nélkül védelmi mechanizmus.

Támadás végrehajtása root-on keresztül

A program működési lehetőségei:

  1. Bemenet: 12345678 (8 bájt), a program hibák nélkül működik.
  2. Bemenet: 123456789 (9 bájt), megjelenik a "szegmentációs hiba" üzenet, a program véget ér.

A biztonsági rés túlcsordulás miatt áll fenn, ha a felhasználói argv bemenet meghaladja a 8 bájtot. 32 bites rendszer (4 bájt) esetén a memória kettős szóval (32 bit)van kitöltve. , a karakterméret 1 bájt, tehát ha 5 bájtos puffert kér, a rendszer 2 dupla szót (8 bájtot)oszt ki. Ezért, ha több mint 8 bájtot ad meg, a puffer túlcsordul.

Hasonló szabványos funkciók, amelyek technikailag kevésbé sérülékenyek, léteznek. Például strncpy (), strncat () és memcpy(). A probléma ezekkel a funkciókkal, hogy a felelősség a puffer méretének meghatározásához a programozó tartozik, nem a fordító.

Minden C/C++ programozónak ismernie kell a problémát a kódolás megkezdése előtt. Sok generált probléma a legtöbb esetben megvédhető a túlcsordulástól.

Veszélyek A C/C-ben++

http://blogs.grammatech.com/eliminating-the-danger-of-uninitialized-variables

C a felhasználóknak kerülniük kell a veszélyes funkciók használatát, amelyek nem ellenőrzik a határokat, kivéve, ha biztosak abban, hogy a határokat nem lépik túl. Azok a funkciók, amelyeket a legtöbb esetben el kell kerülni a védelem érdekében, magukban foglalják az strcpy funkciókat. Ezeket olyan funkciókkal kell helyettesíteni, mint a strncpy. A strlen függvény használatát kerülni kell, ha a felhasználó biztos abban, hogy a végződő nulla karakter megtalálható. scanf () család: scanf(3), fscanf (3), sscanf (3), vscanf (3), vsscanf (3) és vfscanf (3) - veszélyes használni, nem használható adatok küldésére egy karakterláncra maximális hosszszabályozás nélkül, "%s formátum" különösen gyakori kudarc.

Hivatalosan az snprintf () nem szabványos C függvény az ISO 1990 osztályozásban. Ezek a rendszerek nem védenek a puffer túlcsordulás ellen, csak közvetlenül hívják a sprintf-et. Ismeretes, hogy a Linux snprintf jelenlegi verziója megfelelően működik, vagyis valójában tiszteletben tartja a megállapított határt. Az snprintf () visszatérési értéke is változik.

A Unix specifikáció (SUS) és a C99 szabvány 2-es verziója abban különbözik, hogy az snprintf () értéket adja vissza. Az snprintf egyes verziói nem garantálják, hogy a karakterlánc nullára végződik, és ha a karakterlánc túl hosszú, akkor egyáltalán nem tartalmaz nullát. A glib könyvtárnak van g_snprintf() szekvenciális visszatérési szemantikával, mindig nullával végződik, és ami a legfontosabb, mindig figyelembe veszi a puffer hosszát.

Kommunikációs port puffer túlcsordulása

Kommunikációs port puffer túlcsordulása

Néha a soros port Puffertúlcsordulást jelent. Ezt a problémát több tényező okozhatja. Ezek közé tartozik a számítógép sebessége, az alkalmazott adatátviteli sebesség, a soros port FIFO mérete, valamint az adatokat a soros portra továbbító eszköz FIFO mérete.

Az áramlásszabályozás addig vár, amíg egy bizonyos számú bájt meg nem jelenik a pufferben, mielőtt a processzor üzenetet vagy jelet küld egy másik eszköznek az átvitel leállítására. Magasabb átviteli sebesség esetén a soros port több bájtot fog kapni attól a pillanattól kezdve, hogy eléri a pufferáramlás-szabályozási szintet, és leállítja az eszköz továbbítását.

Ezek az extra bájtok nagyobbak lesznek, ha egy magas prioritású folyamat valós időben figyeli a célprocesszort. Mivel a kommunikációs port puffer túlcsordulásának folyamata nagyobb prioritást élvez, mint a VISA megszakítás, a processzor addig nem tesz semmilyen lépést, amíg egy ilyen folyamat valós időben be nem fejeződik.

A VISA és a Windows alapértelmezett beállításai egy 16 bájtos FIFO esetében 14 bájtok, így 2 bájt marad a FIFO-ban, amikor az eszköz megpróbál üzenetet küldeni a forrásból. Nagyobb átviteli sebességnél lassabb számítógépeken több mint 4 bájtot lehet fogadni abban a pillanatban, amikor a soros port kéri a processzort, jelet küldve az átvitel leállítására.

A probléma megoldásához, ha verem puffer túlcsordulást észlel a Windows 10 rendszerben, meg kell nyitnia az Eszközkezelőt. Ezután keresse meg azt a COM portot, amelyhez a beállításokat módosítják, majd nyissa meg a tulajdonságokat. Ezután kattintson a" Speciális " fülre, megjelenik egy csúszka, amely megváltoztatja a vágólap túlcsordulásának méretét, hogy az UART gyorsabban lehetővé tegye az áramlásszabályozást.

Az alapértelmezett érték a legtöbb esetben elegendő. Ha azonban puffertúlcsordulási hiba érkezik, csökkentse az értéket. Ez több megszakítást fog küldeni a processzornak byte lassítással az UART - ban.

A biztonságos fejlődés módszerei

A biztonságos fejlődés módszerei

A biztonságos fejlesztési módszerek közé tartozik a rendszeres tesztelés a túlcsordulás kimutatására és kiküszöbölésére. A legmegbízhatóbb annak elkerülése vagy megakadályozása az automatikus védelem használata nyelvi szinten. Egy másik javítás a futásidejű határellenőrzés, amely megakadályozza a túlcsordulást azáltal, hogy automatikusan ellenőrzi, hogy a pufferbe írt adatok elfogadható határokon belül vannak-e.

A Veracode felhőszolgáltatás azonosítja a kód sérülékenységeit, például a Puffertúlcsordulást, így a fejlesztők használatuk előtt kiküszöbölik azokat. Az iparágban egyedülálló, szabadalmaztatott bináris statikus alkalmazásbiztonsági tesztelési (SAST) technológia a Veracode elemzi az it-t, beleértve a nyílt forráskódú és harmadik féltől származó összetevőket, anélkül, hogy hozzá kellene férnie.

A sast kiegészíti a fejlesztők által végzett fenyegetésmodellezést és kódvizsgálatokat azáltal, hogy gyorsabban és alacsonyabb költséggel észleli a kód hibáit és hiányosságait az automatizálás révén. Általános szabály, hogy a szoftverfejlesztés életciklusának korai szakaszában indul, mert könnyebb és olcsóbb a problémák megoldása a termelés telepítése előtt.

A sast azonosítja az olyan kritikus sebezhetőségeket, mint az SQL injekció, a helyek közötti szkriptek (XSS), a puffer túlcsordulási hiba, a feldolgozatlan hibaállapotok és a potenciális zugok. Ezenkívül a sast bináris technológia hasznos információkat nyújt, amelyek a súlyosságtól függően prioritást élveznek részletes javítási utasítások .

A puffer túlcsordulás sebezhetősége már majdnem fennáll 3 évtizedek, de még mindig terhes. A hackerek szerte a világon továbbra is alapértelmezett taktikájuknak tekintik a fogékony webes alkalmazások hatalmas száma miatt. A fejlesztők és a programozók hatalmas erőfeszítéseket tesznek az informatikai technológiák gonoszságának leküzdésére, új és új módszerekkel.

Az utóbbi megközelítés fő gondolata egy olyan javító eszköz megvalósítása, amely több másolatot készít a visszatérési címekről a veremben, majd a szám mellett randomizálja az összes példány helyét. Minden másolat párhuzamosan frissül és ellenőrizhető, így a köztük lévő bármilyen eltérés egy lehetséges támadási kísérletet jelez, és kivételt okoz.

Cikkek a témában