Procesinjectie is een van de belangrijkste technieken in cyberbeveiliging. Deze techniek werkt door code in een andere, reeds actieve procesadresruimte te plaatsen en de code in die ruimte uit te voeren. Vanuit veiligheidsoogpunt is dit een ramp, omdat de code kan worden uitgevoerd onder de rechten van het doelproces, waardoor beveiligingsmaatregelen kunnen worden omzeild door gebruik te maken van de bestaande privilege-escalatie, detectiemechanismen enz. van het doelproces.
Procesinjectie is een bedreigingsvector die heeft geleid tot vele vormen van malware die het internet teisteren en geavanceerde persistente bedreigingen (APT's). Hoewel dit een geldige techniek is in een softwareontwikkelingsomgeving om een applicatie te debuggen of uit te breiden, wordt het vaak gebruikt door bedreigingsactoren om zonder toestemming code uit te voeren, persistentie te omzeilen en onopgemerkt te blijven.
Deze blog analyseert de principes van procesinjectie, de kernmechanismen, veelgebruikte technieken, detectiemethoden en hoe dit te voorkomen. We zullen ook enkele basisprincipes onderzoeken, zoals geheugenbewerkingen, injectietechnieken, detectiemethoden en praktische voorbeelden van aanvallen.
Wat is procesinjectie?
Met procesinjectie kan code worden geïnjecteerd in de geheugenruimte van een ander lopend proces. Bij deze techniek dwingt de aanvaller het doelproces om willekeurige code uit te voeren door zijn eigen code in de adresruimte van dat proces te schrijven. De geïnjecteerde code wordt uitgevoerd onder de context en rechten van het kwetsbare proces en erft dus alle toegangsrechten en het vertrouwensniveau op het systeem.
Procesinjectie bestaat in de kern uit de volgende technische componenten: het verkrijgen van een proceshandle, geheugentoewijzing in het doelproces, code-schrijfbewerkingen en mechanismen voor het activeren van de uitvoering. Ze gebruiken Windows API-functies zoals OpenProcess(), VirtualAllocEx(), WriteProcessMemory() en CreateRemoteThread() om het injectieproces uit te voeren.
Waarom is procesinjectie gevaarlijk?
Verschillende technische aspecten maken dit type aanval relatief gevaarlijk. De code die wordt uitgevoerd vanuit de geïnjecteerde thread heeft dezelfde rechten als het doelproces, wat in feite resulteert in verhoogde toegang tot het systeem. Deze methode omzeilt elke op bestanden gebaseerde beveiligingsscan, aangezien de onveilige code alleen in het geheugen bestaat.
Het heeft ook een ernstig effect op de stabiliteit en beveiliging van systemen. Injectiebewerkingen kunnen worden gecrasht door de doelprocessen en leiden tot instabiliteit in het hele systeem. Ze bereiken dit door beveiligingsproductprocessen te beëindigen, gegevens te stelen uit beveiligde applicaties en permanente systeemtoegang tot stand te brengen die veelgebruikte opschoontechnieken omzeilt.
Basisprincipes van procesgeheugen
De technische basis voor procesinjectietechnieken is het begrijpen van procesgeheugenstructuren en -bewerkingen. Er zijn interne kenmerken van het geheugenbeheermodel van het Windows-besturingssysteem die geheugeninteracties en toegang tussen processen mogelijk maken en ook beperken. Ze veranderen onmiddellijk de manier waarop procesinjectie werkt en de manier waarop verdedigers dit kunnen detecteren en zich ertegen kunnen beschermen.
Virtueel geheugen en procesadresruimte
Elk Windows-proces heeft zijn eigen virtuele adresruimte, geïsoleerd van andere processen die op hetzelfde systeem draaien. Het bereik van deze virtuele adresruimte is 0 tot 0x7FFFFFFF voor 32-bits processen en 0 tot 0x7FFFFFFFFFF voor 64-bits processen. Het toewijzen van virtuele adressen aan fysieke geheugenlocaties gebeurt met behulp van de paging-techniek door de Windows Memory Manager.
Het proces heeft een aantal regio's in zijn adresruimte, zoals de uitvoerbare code van het proces, geladen DLL's, heap-toewijzingen en stackruimte. Deze regio's hebben specifieke functies en soorten gegevens. Windows heeft paginatabellen die beschrijven waar pagina's van geheugenframes zich bevinden en of ze zich in de virtuele adresruimte bevinden.
Geheugenrechten en -beveiliging
Er zijn toegangsrechten voor geheugengebieden, die beschrijven hoe processen hiermee moeten omgaan. Deze rechten omvatten:
- PAGE_EXECUTE: Geheugen kan worden uitgevoerd als code
- PAGE_READ: Geheugen kan worden gelezen
- PAGE_WRITE: Geheugen kan worden beschreven
- PAGE_EXECUTE_READ: Geheugen kan worden uitgevoerd en gelezen
- PAGE_EXECUTE_READWRITE: Geheugen kan worden uitgevoerd, gelezen en beschreven
Deze machtigingen worden door Windows Memory Manager op paginaniveau afgedwongen. Als een toepassing (of proces) op een niet-toegestane manier toegang probeert te krijgen tot het geheugen, genereert het systeem een toegangsschending.
Kritieke Windows-API's voor geheugenbewerkingen
Windows heeft een aantal belangrijke API's voor geheugenbewerkingen. Deze API's vormen de bouwstenen van procesinjectie. De 'Ex'-versies voor deze functies zijn bedoeld voor externe processen, terwijl de reguliere opvolgers bedoeld zijn voor de geheugenruimte van het aanroepende proces. Kennis van deze API's maakt het mogelijk om potentiële injectieactiviteiten te detecteren en te volgen.
- VirtualAlloc/VirtualAllocEx: Reserveert en vastlegt geheugen in een proces
- VirtualProtect/VirtualProtectEx: Wijzigt de machtigingen voor geheugengebieden
- ReadProcessMemory: Leest gegevens uit de geheugenruimte van een ander proces
- WriteProcessMemory: Schrijft gegevens naar de geheugenruimte van een ander proces
- VirtualFree/VirtualFreeEx: Geeft toegewezen geheugengebieden vrij
Soorten procesinjectietechnieken
Procesinjectie omvat een aantal verschillende technieken die allemaal gebruikmaken van een vorm van code-uitvoering voor doelprocessen. Dit verschil in Windows API-aanroepen en geheugenmanipulatie zorgt voor unieke werkingspatronen en detectiesignaturen voor elke techniek.
Het analyseren van deze technieken kan een goede hulp zijn voor beveiligingsteams bij het identificeren van en reageren op specifieke injectiemethoden.
1. DLL-injectie
DLL-injectie is het proces waarbij een proces wordt gedwongen om kwaadaardige DLL-bestanden te laden. Hierbij wordt gebruikgemaakt van een reeks API-functies: OpenProcess(), VirtualAllocEx() en CreateRemoteThread(). Dit begint met het reserveren van geheugen binnen het doelproces om het pad van de DLL op te slaan. Vervolgens wordt een externe thread gestart die LoadLibrary() aanroept met het pad als parameter om het doelproces te instrueren de kwaadaardige DLL te laden.
Een geïnjecteerde DLL heeft volledige toegang tot de functies/processen van het doelproces met geheugenadressen van de volledige geheugenruimte van het doelproces en alle andere modules die het doel in het geheugen heeft geladen.
2. Code-injectie
Code-injectie is een vorm van aanval waarbij kwaadaardige code in de geheugenruimte van een proces wordt geïnjecteerd, waarna de code wordt uitgevoerd. Hierbij wordt eenvoudigweg een code naar het adres van een procesgeheugenruimte geschreven. Dit is een techniek die uit meerdere stappen bestaat, waaronder het verkrijgen van een handle op het proces, het gebruik van VirtualAllocEx() om geheugen toe te wijzen, WriteProcessMemory() om de code te schrijven en ten slotte CreateRemoteThread() om deze uit te voeren.
De code die wordt uitgevoerd, heeft de machtigingen van het doelproces waarin deze wordt uitgevoerd, en alle beveiligingsprivileges en toegangsrechten worden overgenomen.
3. Thread Execution Hijacking
Bij het kapen van thread-uitvoering wordt een thread in het doelproces opgeschort, wordt de uitvoeringscontext ervan gewijzigd om naar de code van de aanvaller te verwijzen en wordt de uitvoering voortgezet. Bij deze techniek maakt de aanvaller gebruik van de API's SuspendThread(), GetThreadContext(), SetThreadContext() en ResumeThread().
Omdat het een legitieme thread gebruikt, is het moeilijker te detecteren, aangezien de gekaapte thread met zijn bestaande privileges wordt uitgevoerd om de kwaadaardige code uit te voeren.
4. APC (asynchrone procedureaanroep) injectie
APC-injectie zet kwaadaardige code in de wachtrij om te worden uitgevoerd wanneer een thread in een waarschuwingsstatus komt. Deze methode plaatst code in een wachtrij op een thread met behulp van QueueUserAPC(). De code die in de thread wordt geïnjecteerd, wordt uitgevoerd wanneer deze de APC-wachtrij verwerkt, wat meestal gebeurt tijdens bepaalde systeemaanroepen of wachtbewerkingen. Deze methode is zeer geschikt voor threads die herhaaldelijk veranderlijke statussen bezoeken.
5. Reflectieve DLL-injectie
De methode van reflectieve DLL-injectie laadt een DLL met behulp van een Windows-loader en schrijft geen bestandssysteemartefact. Het is een aangepaste DLL met instructies over hoe deze in het geheugen moet worden toegewezen en geadresseerd. Deze truc houdt in dat de loader-code en DLL in het doelprocesgeheugen worden geïnjecteerd en dat de loader wordt uitgevoerd om de DLL voor te bereiden. Hierdoor wordt detectie door normale DLL-laadmechanismen en monitoring voorkomen.
6. Process Hollowing
Process Hollowing is een heimelijke injectietechniek waarbij aanvallers een legitiem proces in een opgeschorte toestand creëren (met behulp van CreateProcess met CREATE_SUSPENDED), de oorspronkelijke geheugenruimte ervan ontkoppelen (via NtUnmapViewOfSection/ZwUnmapViewOfSection), nieuw geheugen toewijzen (VirtualAllocEx), schadelijke code schrijven (WriteProcessMemory), de PE-header en herplaatsingen repareren, het Process Environment Block (PEB) bijwerken en ten slotte het startpunt omleiden (SetThreadContext) voordat de uitvoering wordt hervat (ResumeThread). Hierdoor kan schadelijke code worden uitgevoerd onder de identiteit en met de privileges van een legitiem proces.
Hoe werkt procesinjectie?
Procesinjecties volgen een reeks stappen in een poging om code uit te voeren in een doelproces. Ongeacht de injectiemethode volgt de technische implementatie bepaalde stappen die het procesgeheugen manipuleren en de uitvoering van de processtroom wijzigen.
De eerste stap is het identificeren van het doelproces en het verkrijgen van toegang. Het kwaadaardige proces gebruikt OpenProcess() om grip te krijgen op het doelproces. De vereiste toegangsrechten voor deze grip zijn PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE en PROCESS_VM_READ.
De tweede cruciale stap is het toewijzen van geheugen in het doelproces. VirtualAllocEx() wijst geheugenruimte toe in de adresruimte van het doelproces door pagina's van het virtuele geheugen te reserveren en vast te leggen.
De derde stap is het kopiëren van de shellcode naar het toegewezen geheugengebied. WriteProcessMemory() kopieert de codebytes van de bronbuffer naar het geheugengebied van het doelproces. Bij deze bewerking moet rekening worden gehouden met de uitlijnings- en groottevereisten.
De laatste stap van het activeren van de uitvoering vertegenwoordigt de laatste kerncomponenten. Elke techniek maakt gebruik van een of ander mechanisme:
- CreateRemoteThread() maakt een nieuwe thread aan om de geïnjecteerde code uit te voeren
- QueueUserAPC() plaatst de uitvoering van de code in de wachtrij van een bestaande thread
- SetThreadContext() wijzigt de bestaande uitvoeringsstroom van de thread
- Directe wijziging van functiepointers of hooks
Zodra de uitvoering is gestart, wordt de geïnjecteerde code uitgevoerd binnen de context van het doelproces, met toegang tot de bronnen en het beveiligingstoken van het doelproces. Deze code kan vervolgens doen waarvoor hij is ontworpen, onder de privileges en het vertrouwensniveau van het doelproces.
Hoe procesinjectieaanvallen detecteren?
Procesinjectie is moeilijk te detecteren omdat het verschillende componenten en gedragingen van het systeem omvat. Om injectieactiviteit te identificeren, moeten beveiligingssystemen geheugenbewegingen, API-aanroepen en al het procesgedrag monitoren.
Deze detectiemethoden vormen samen een algemene detectiestrategie.
Geheugenpatroonanalyse
Geheugenanalyse is gericht op het zoeken naar veelvoorkomende patronen in geheugengebieden van processen. Dit gebeurt omdat deze gebieden van het procesgeheugen worden gescand door beveiligingstools om de machtigingsinstellingen van het procesgeheugen en de verwachte inhoud te controleren. Dit omvat onder andere het detecteren van afwijkende uitvoerbare gebieden en pagina's die niet voldoen aan hun typische inhoudssignaturen binnen processen.
Geheugenscanners zoeken naar afwijkingen van de oorspronkelijke procesbinaries, hetzij door veranderingen in normaal gesproken statische procesgeheugenstructuren te monitoren, hetzij door te zoeken naar dynamische codesegmenten.
API-oproepmonitoring
Verdachte reeksen van geheugenmanipulatie-oproepen worden gedetecteerd door Windows API-monitoring. Beveiligingstools monitoren OpenProcess() voor proces toegang, VirtualAllocEx() voor geheugentoewijzing en WriteProcessMemory() voor geheugenschrijven. Als een thread wordt aangemaakt of gemanipuleerd, bijvoorbeeld CreateRemoteThread(), is dit een duidelijk teken van injectie.
Wijzigingen in de status van processen en threads via API's zoals SuspendThread() en SetThreadContext() moeten ook worden gecontroleerd, aangezien deze vaak voorkomen in injectieketens.
Gedragsindicatoren
Het gedrag van processen wordt gecontroleerd om onverwachte activiteitspatronen te identificeren die wijzen op deze injectiepogingen. Inbraakdetectiesystemen letten op threads in een relatief stabiel draaiend proces en op wijzigingen in de procesgeheugenkaart om dergelijke processen bij te houden.
Dit gedrag, samen met wijzigingen in de importadrestabellen en procesoverschrijdende geheugenbewerkingen, zijn relevante indicatoren voor detectie.
Detectietools
Voor het opsporen van procesinjectie zijn enkele beveiligingstools met diepgaande monitoringmogelijkheden nodig. Realtime analyse wordt uitgevoerd door procesmonitors die API-aanroepen en systeemacties monitoren, terwijl geheugenanalysetools een diepgaande analyse van de procesgeheugenruimtes uitvoeren. Met gebeurtenislogboekanalysatoren kunnen teams de geschiedenis van beveiligingsgebeurtenissen binnen het systeem vastleggen, zodat ze inzicht krijgen in het verleden.
Enterprise detection and response (EDR)-oplossingen zoals SentinelOne combineren verschillende manieren van monitoring met analytische mogelijkheden. Er zijn systeembeheertools zoals procesmonitor en procesverkenner, die de processen in detail weergeven, evenals de geheugentoewijzing per proces.
Hoe kunnen procesinjectieaanvallen worden voorkomen?
Preventie van procesinjectie kan niet worden geboden door één enkele beveiligingsmaatregel, maar vereist maatregelen op systeem-, proces- en codeniveau. Deze maatregelen zijn gericht op het beperken van de mogelijkheden voor procesinjectie en het moeilijker maken om potentiële doelprocessen te injecteren.
Preventie op systeemniveau
Preventieve maatregelen op systeemniveau beginnen met het correct beheren van toegang en privileges. Systemen moeten zo zijn geconfigureerd dat niet-beheerders alleen gevoelige processen op systemen kunnen openen. Deze beperkingen worden afgedwongen door gebruikersaccountbeheer (UAC) en AppLocker-beleidsregels om te beheren welke processen kunnen worden uitgevoerd en op welk privilege-niveau.
Codeondertekening
Een andere belangrijke preventielaag is het afdwingen van codeondertekening. Modules moeten worden geladen met geverifieerde digitale handtekeningen en onjuist ondertekende of niet-ondertekende codes moeten door de systemen worden geweigerd. Windows Defender Application Control (WDAC)-beleidsregels handhaven de vereisten voor code-integriteit en schakelen het laden van niet-ondertekende DLL's en uitvoerbare bestanden uit.
Geheugenbeveiliging
Geheugenbeveiligingsmechanismen vormen een belangrijk onderdeel van de verdediging. Data Execution Prevention (DEP) beschermt tegen het uitvoeren van code vanuit gegevenspagina's, terwijl Address Space Layout Randomization (ASLR) het moeilijk maakt om specifiek geheugen aan te vallen.
Matige bescherming van processen omvat Control Flow Guard (CFG), dat doelen controleert op indirecte oproepen, en Protected Process Light (PPL), dat de mogelijkheid van processen om bestaande processen te openen beperkt op basis van lidmaatschapssignatuurniveaus.
Applicatieversterking
Zelfs voor applicatieversterking moet het beveiligingsteam veilige coderingspraktijken en compileropties volgen. Ontwikkelaars moeten beveiligingsfuncties configureren, zoals /DYNAMICBASE en /NXCOMPAT, uitzonderingsafhandeling implementeren en geheugenbewerkingen valideren binnen het applicatie-debuggingproces.
AI-gestuurde cyberbeveiliging
Verhoog uw beveiliging met realtime detectie, reactiesnelheid en volledig overzicht van uw gehele digitale omgeving.
Vraag een demo aanConclusie
Procesinjectie injecteert kwaadaardige code in geheugenruimten naast andere lopende processen. De aanvaller dwingt doelprocessen om willekeurige code uit te voeren en schrijft bovendien zijn eigen code naar adresruimten. De reden waarom dit zo gevaarlijk is, is dat het traditionele technieken voor dreigingsdetectie kan omzeilen. U moet geavanceerde beveiligingsoplossingen en preventiestrategieën gebruiken om het op te sporen.
Deze omvatten geheugenbescherming, gedragscontroles, toegangscontroles en andere zaken. Door inzicht te krijgen in de werking van procesinjectietechnieken kunnen organisaties hun systemen op de juiste manier beveiligen en beveiligingsmaatregelen effectiever inzetten.
Veelgestelde vragen over procesinjectie
Procesinjectie is een aanval waarbij de aanvaller een code kopieert en uitvoert in het geheugen van een proces. Hierdoor kan een kwaadwillende actor zijn eigen code uitvoeren in het doelproces, waardoor hij beveiligingsmaatregelen kan omzeilen.
Procesinjectie is een techniek die voornamelijk wordt gebruikt om activiteiten en persistentie te verbergen en om code met hogere privileges uit te voeren. Als de Windows DLL via normale processen in een ander proces wordt geïnjecteerd, voert de uitgevoerde code bewerkingen uit met hetzelfde vertrouwensniveau als het doelproces en heeft deze dezelfde toegangsrechten, waardoor het voor beveiligingstools moeilijker wordt om kwaadaardig gedrag te detecteren.
Voor het detecteren van procesinjectie is monitoring van het geheugen, de API en het procesgedrag vereist. Statische programma-analysers markeren dergelijke injectiepogingen door te zoeken naar patronen zoals abnormale geheugentoewijzingen, threadcreaties en abnormale API-sequenties voor procesmanipulatie.
Procesinjectie wordt voornamelijk gebruikt door malware, maar in sommige scenario's kan deze techniek legitiem worden gebruikt, bijvoorbeeld voor foutopsporing, malware-analyse, monitoringtechnieken en om de functionaliteit van een applicatie uit te breiden.
In APT (Advanced Persistent Threat)-campagnes speelt procesinjectie een cruciale rol bij het bereiken van persistentie en het vermijden van detectie. APT-actoren gebruiken geavanceerde injectietechnieken om permanente toegang te krijgen tot geïnfecteerde systemen en om te garanderen dat ze nooit ontdekt zullen worden tijdens een langdurige operatie.

