Hackers kunnen de controle over een systeem overnemen door de opslagcapaciteit van een service te maximaliseren. Dus hoe voeren hackers dergelijke bufferoverloopaanvallen uit?
Hoe vallen hackers systemen aan met behulp van virussen en malware? Soms kan het ransomware zijn; soms kan het een aanval zijn die uw systeemvereisten verbruikt. Bufferoverloop is een van deze aanvalsmethoden, maar wat is het eigenlijk? Hoe werken deze aanvallen?
Wat is een bufferoverloop?
Dus wat zijn eigenlijk een buffer en een stapel? De buffer is een veld waar bepaalde invoerinformatie die u aan uw computer geeft, wacht voordat ze het geheugen bereiken. Het oproepen van gegevens uit het geheugen is een systeemvermoeiende operatie. Dus wanneer er voldoende ruimte is in het buffergebied, roep je de data direct van hieruit op. Dit betekent een prestatieverbetering voor uw apparaat. Wanneer de beschikbare ruimte voor de buffer vol is, wordt het natuurlijk noodzakelijk om deze in het geheugen te schrijven.
Stack is in wezen een datastructuur waarin data push (toevoegen) en pop (verwijderen) operaties plaatsvinden. De concepten buffer en stapel lijken veel op elkaar; de buffer werkt echter als een stapel die inkomende gegevens tijdelijk opslaat.
Bufferoverflows kunnen een uitdagend onderwerp zijn, maar zoals de naam al doet vermoeden, treedt het op wanneer er een overload aan gegevens is. U wilt bijvoorbeeld inloggen op een systeem. De ontwikkelaars kunnen 250 bytes aan ruimte toewijzen voor de gebruikersnaam. Als u 300 bytes aan gegevens invoert, loopt de buffer over. Deze overflow kan andere gegevens in het geheugen beïnvloeden en schade veroorzaken.
Dit is geweldig voor hackers. Cybercriminelen kunnen deze puinhoop combineren met verschillende aanvalsvectoren om bijvoorbeeld het systeem te hacken en in te loggen als beheerder.
Om bufferoverloop te begrijpen, zijn de belangrijkste onderwerpen die u moet herkennen de Interne architectuur van de CPU, geheugenregisters en hoe het geheugen gegevens verwerkt. Hier zijn enkele termen over de CPU die u moet kennen.
Montage Code |
Een programmeertaal op laag niveau, d.w.z. dicht bij machinetaal. |
Buffer |
Een vaste maat toegewezen geheugenruimte. |
Bytecode |
Een compileerbare intermediaire taalvorm van code geschreven in een taal op hoog niveau. |
Compiler |
Een programma dat programmeertaal omzet in machinecode. |
Hoop |
Dynamische, variabele geheugenruimte. |
De grondbeginselen van de geheugentheorie
Zonder de geheugentheorie te begrijpen, kan het in de praktijk moeilijk zijn om problemen met bufferoverloop aan te pakken. Je kunt het zien als proberen een huis te bouwen zonder te weten hoe je een muur moet maken.
Stel je voor dat je een bufferoverloop wilt uitvoeren vanuit het oogpunt van een hacker. Daarvoor moet je het geheugen manipuleren en de CPU je code laten uitvoeren. Als u iemand met kwade bedoelingen was, zou uw doel hier zijn om het geheugen te overbelasten en ook aangrenzende geheugengebieden te manipuleren.
Maar allereerst moet u zich concentreren op de concepten heap, stack en tekstsegment.
Terwijl de stapel wordt gemaakt, gebruikt het geheugen hoge geheugenadressen. Hoge geheugenadressen betekenen het uitgebreide geheugengebied. Dan beginnen de adreswaarden te dalen. De geheugenstack gebruikt tijdens het geheugengebruik een methode genaamd LIFO (Last In, First Out). Variabelen in het stapelgeheugen zijn alleen geldig binnen het bereik waarin ze zijn gedefinieerd. Als ze buiten dit bereik vallen, treedt er een fout op.
Stackgeheugen daarentegen werkt dynamisch en hoeft niet op hoge adressen te beginnen. Er is geen vaste limiet voor heapgeheugen; alle limieten worden bepaald door het besturingssysteem. Het is mogelijk om het heapgeheugen dynamisch te wijzigen en deze limieten kunnen tijdens heapgebruik veranderen volgens de behoeften van de gebruiker. De limieten van het heapgeheugen zijn afhankelijk van factoren die worden bepaald door het besturingssysteem en de hardware. Met andere woorden, het biedt een dynamisch gebruik binnen deze grenzen.
Het tekstsegment bevat de programmacode en de gegevenssegmenten bevatten globale gegevens. Hoge adressen delen stack- en heap-geheugen onder henzelf. Het systeem wijst beide geheugen toe tijdens runtime.
Om bufferoverloop beter te begrijpen, moet u de gegevensregisters voor algemeen gebruik onderzoeken die uw computerarchitectuur gebruikt om gegevens op te slaan. In plaats van elk record afzonderlijk te analyseren, concentreert u zich op de essentie.
- ESP (uitgebreide stapelaanwijzer): Dit register bevat het adres bovenaan de stapel.
- EBP (uitgebreide basisaanwijzer): Dit houdt de basiswijzer vast.
- EIP (Extended Instruction Pointer): En dit register bevat het adres van de volgende uit te voeren instructie.
Deze technische termen klinken misschien een beetje verwarrend, maar stel je ze allemaal voor als kleine partities in het geheugen.
Hoe werken bufferoverloopaanvallen?
Wanneer u nieuwe gegevens aan een stapel toevoegt, worden deze gegevens bovenaan geplaatst. Alle nieuwe gegevens worden dan naar beneden verplaatst. ESP staat bovenaan de stapel. In dit geval gaat de ESP dus naar een lager geheugenadres. Stel je voor dat de hierboven toegevoegde gegevens de ESP naar beneden duwen.
Wanneer een programma wordt gestart, maakt het systeem een stapelframe met lokale variabelen. Het belangrijkste doel van een bufferoverloopaanval is om toegang te krijgen tot het EIP- of retouradres. Een hacker met toegang tot dit adres kan het opdracht geven om naar elke gewenste kwaadaardige code te verwijzen, die vervolgens het bredere systeem zal beïnvloeden.
Met elk nieuw stukje data groeit de stapel richting de EBP. De echte vraag hier is, als we te veel gegevens invoeren, kunnen we de EBP naar de EIP duwen? Op die manier staat de gewenste data of code op het EIP en kunt u de gewenste resultaten zien. Het enige dat overblijft is om het uit te voeren. Wanneer u het programma uitvoert, wijst het naar uw EIP-code en begint de uitvoering. Als gevolg hiervan, als je een hacker was, heb je je eerste bufferoverloopaanval uitgevoerd.
Om het voorbeeld vanuit een andere hoek te bekijken, kunt u vloeistoffen met verschillende dichtheden beschouwen, ESP, EBP en EIP genoemd, in een container. Stel je voor dat de ESP zich bovenaan de container bevindt omdat de dichtheid lager is. Net als olijfolie en water mogen ze niet mengen. De kwaadaardige code is dus een andere vloeistof: wanneer u deze aan de container toevoegt, verstoort deze deze balans, verdringt wat vloeistof en vermengt zich met de EIP. Dit duidt op een bufferoverloop.
Hoe te beschermen tegen bufferoverloopaanvallen
Dus hoe voorkom je dat dit gebeurt?
Ten eerste is het belangrijk om gedurende het hele softwareontwikkelingsproces goede codeerpraktijken toe te passen om beveiligingsproblemen te minimaliseren. Zorgvuldig geschreven code kan de kans op bufferoverflows verkleinen.
Een andere stap is het gebruik van verdedigingsmechanismen om geheugenregio's te bewaken, de limieten van buffers te controleren en aanvallen te detecteren. Ten slotte moet u regelmatig systemen bijwerken en patches toepassen. Updates die kwetsbaarheden verhelpen, maken het voor aanvallers moeilijker om bekende kwetsbaarheden te misbruiken. Ook het gebruik van verdedigingstools zoals software en firewall zorgt voor een extra beveiligingslaag.
Actie ondernemen tegen bufferoverflows
Bufferoverloopaanvallen vormen een aanzienlijke bedreiging voor uw cyberbeveiliging en het is natuurlijk belangrijk om voorzorgsmaatregelen te nemen. Gelukkig is het mogelijk om deze aanvallen te blokkeren en verdedigingsmechanismen te versterken. Veel goede beveiligingspraktijken, zoals het up-to-date houden van software om patches te repareren, helpen beschermen tegen dergelijke aanvallen en andere kwetsbaarheden.