Prozessinjektion ist eine der wichtigsten Techniken in der Cybersicherheit. Bei dieser Technik wird Code in den Adressraum eines anderen bereits laufenden Prozesses eingefügt und dort ausgeführt. Aus Sicht der Sicherheit ist dies eine echte Katastrophe, da der Code unter den Berechtigungen des Zielprozesses ausgeführt werden kann, wodurch Sicherheitskontrollen unter Verwendung der vorhandenen Privilegieneskalation, Erkennungsmechanismen usw. des Zielprozesses umgangen werden können.
Prozessinjektion ist ein Bedrohungsvektor, der viele Formen von Malware hervorgebracht hat, die das Internet und fortgeschrittene persistente Bedrohungen (APTs). Obwohl es sich hierbei um eine in einer Softwareentwicklungsumgebung zum Debuggen oder Erweitern einer Anwendung zulässige Technik handelt, wird sie häufig von Angreifern genutzt, um ohne Autorisierung Code auszuführen, Persistenz zu umgehen und unentdeckt zu bleiben.
Dieser Blogbeitrag analysiert die Prinzipien der Prozessinjektion, ihre Kernmechanismen, gängige Techniken, Erkennungsmethoden und Möglichkeiten zur Prävention. Außerdem werden wir einige Grundlagen wie Speicheroperationen, Injektionstechniken, Erkennungsmethoden und praktische Beispiele für Angriffe untersuchen.
Was ist Prozessinjektion?
Prozessinjektion ermöglicht es, einen Code in den Speicherbereich eines anderen laufenden Prozesses zu injizieren. Bei dieser Technik zwingt der Angreifer den Zielprozess dazu, einen beliebigen Code auszuführen, indem er seinen eigenen Code in den Adressraum dieses Prozesses schreibt. Der injizierte Code wird unter dem Kontext und mit den Rechten des anfälligen Prozesses ausgeführt und erbt somit alle dessen Zugriffsrechte und die Vertrauensstufe auf dem System.
Die Prozessinjektion besteht im Kern aus den folgenden technischen Komponenten: Erfassung des Prozess-Handles, Speicherzuweisung im Zielprozess, Code-Schreibvorgänge und Mechanismen zur Auslösung der Ausführung. Sie verwenden Windows-API-Funktionen wie OpenProcess(), VirtualAllocEx(), WriteProcessMemory() und CreateRemoteThread(), um den Injektionsprozess auszuführen.
Warum ist Prozessinjektion gefährlich?
Mehrere technische Aspekte machen diese Art von Angriff relativ gefährlich. Der aus dem injizierten Thread ausgeführte Code hat dieselben Berechtigungen wie der Zielprozess, was effektiv zu einem erhöhten Zugriff auf das System führt. Diese Methode umgeht alle dateibasierten Sicherheitsscans, da der unsichere Code nur im Speicher vorhanden ist.
Außerdem hat sie schwerwiegende Auswirkungen auf die Stabilität und Sicherheit von Systemen. Injektionsvorgänge können durch die Zielprozesse zum Absturz gebracht werden und zu Instabilität im gesamten System führen. Dies erreichen sie, indem sie Sicherheitsproduktprozesse beenden, Daten aus geschützten Anwendungen stehlen und einen dauerhaften Systemzugriff herstellen, der gängige Bereinigungstechniken umgeht.
Grundlagen des Prozessspeichers
Die technische Grundlage für Prozessinjektionstechniken ist das Verständnis der Strukturen und Vorgänge des Prozessspeichers. Es gibt interne Merkmale des Speicherverwaltungsmodells des Windows-Betriebssystems, die Speicherinteraktionen und den Speicherzugriff zwischen Prozessen ermöglichen, aber auch einschränken. Sie verändern sofort die Funktionsweise der Prozessinjektion und die Art und Weise, wie Verteidiger sie erkennen und sich dagegen schützen können.
Virtueller Speicher und Prozessadressraum
Jeder Windows-Prozess verfügt über einen eigenen virtuellen Adressraum, der von anderen Prozessen, die auf demselben System ausgeführt werden, isoliert ist. Der Bereich dieses virtuellen Adressraums reicht von 0 bis 0x7FFFFFFF für 32-Bit-Prozesse und von 0 bis 0x7FFFFFFFFFF für 64-Bit-Prozesse. Die Zuordnung von virtuellen Adressen zu physischen Speicherorten erfolgt mit Hilfe der Paging-Technik durch den Windows-Speichermanager.
Der Prozess verfügt über eine Reihe von Bereichen in seinem Adressraum, wie z. B. den ausführbaren Code des Prozesses, geladene DLLs, Heap-Zuweisungen und Stack-Speicherplatz. Diese Bereiche haben spezifische Funktionen und Datentypen. Windows verfügt über Seitentabellen, die beschreiben, wo sich Seiten von Speicherrahmen befinden und ob sie sich im virtuellen Adressraum befinden.
Speicherberechtigungen und -schutz
Es gibt Zugriffsberechtigungen für Speicherbereiche, die beschreiben, wie Prozesse mit ihnen interagieren sollen. Diese Berechtigungen umfassen:
- PAGE_EXECUTE: Der Speicher kann als Code ausgeführt werden
- PAGE_READ: Der Speicher kann gelesen werden
- PAGE_WRITE: Der Speicher kann beschrieben werden
- PAGE_EXECUTE_READ: Der Speicher kann ausgeführt und gelesen werden
- PAGE_EXECUTE_READWRITE: Speicher kann ausgeführt, gelesen und beschrieben werden
Diese Berechtigungen werden vom Windows-Speichermanager auf Seitenebene durchgesetzt. Wenn eine Anwendung (oder ein Prozess) versucht, auf nicht zulässige Weise auf den Speicher zuzugreifen, löst das System eine Zugriffsverletzung aus.
Wichtige Windows-APIs für Speicheroperationen
Windows verfügt über einige wichtige APIs für Speichermanipulationen. Diese APIs sind die Bausteine der Prozessinjektion. Die "Ex"-Versionen dieser Funktionen sind für externe Prozesse vorgesehen, während die regulären Nachfolger für den Speicherbereich des aufrufenden Prozesses bestimmt sind. Die Kenntnis dieser APIs ermöglicht die Erkennung potenzieller Injektionsaktivitäten und deren Verfolgung.
- VirtualAlloc/VirtualAllocEx: Reserviert und bindet Speicher in einem Prozess
- VirtualProtect/VirtualProtectEx: Ändert die Berechtigungen für Speicherbereiche
- ReadProcessMemory: Liest Daten aus dem Speicherbereich eines anderen Prozesses
- WriteProcessMemory: Schreibt Daten in den Speicherbereich eines anderen Prozesses
- VirtualFree/VirtualFreeEx: Gibt zugewiesene Speicherbereiche frei
Arten von Prozessinjektionstechniken
Die Prozessinjektion umfasst eine Reihe verschiedener Techniken, die alle eine Form der Codeausführung für Zielprozesse nutzen. Diese Unterschiede bei Windows-API-Aufrufen und der Speichermanipulation führen zu einzigartigen Betriebsmustern und Erkennungssignaturen für jede Technik.
Die Analyse dieser Techniken kann für Sicherheitsteams eine große Hilfe bei der Identifizierung und Reaktion auf bestimmte Injektionsmethoden sein.
1. DLL-Injektion
Bei der DLL-Injektion wird ein Prozess dazu gezwungen, bösartige DLL-Dateien zu laden. Dabei wird eine Reihe von API-Funktionen verwendet: OpenProcess(), VirtualAllocEx() und CreateRemoteThread(). Zunächst wird Speicherplatz innerhalb des Zielprozesses reserviert, um den Pfad der DLL zu speichern. Anschließend wird ein Remote-Thread gestartet, der LoadLibrary() mit dem Pfad als Parameter aufruft, um den Zielprozess anzuweisen, die bösartige DLL zu laden.
Eine injizierte DLL hat vollen Zugriff auf die Funktionen/Prozesse des Zielprozesses mit Speicheradressen des gesamten Speicherbereichs des Zielprozesses und aller anderen Module, die das Ziel in den Speicher geladen hat.
2. Code-Injektion
Code-Injektion ist eine Form des Angriffs, bei der bösartiger Code in den Speicherbereich eines Prozesses injiziert wird und dort ausgeführt wird. Dabei wird einfach ein Code an die Adresse eines Prozessspeicherbereichs geschrieben. Dies ist eine mehrstufige Technik, die das Erlangen eines Handles für den Prozess, die Zuweisung von Speicher mit VirtualAllocEx(), das Schreiben des Codes mit WriteProcessMemory() und schließlich die Ausführung mit CreateRemoteThread() verwendet, um ihn auszuführen.
Der ausgeführte Code verfügt über die Berechtigungen des Zielprozesses, in dem er ausgeführt wird, und alle Sicherheitsprivilegien und Zugriffsrechte werden übernommen.
3. Thread-Ausführungs-Hijacking
Beim Thread-Ausführungs-Hijacking wird ein Thread im Zielprozess angehalten, sein Ausführungskontext so geändert, dass er auf den Code des Angreifers verweist, und die Ausführung fortgesetzt. Bei dieser Technik nutzt der Angreifer die APIs SuspendThread(), GetThreadContext(), SetThreadContext() und ResumeThread().
Da ein legitimer Thread verwendet wird, ist es schwieriger, ihn zu erkennen, da der entführte Thread mit seinen bestehenden Berechtigungen ausgeführt wird, um den bösartigen Code auszuführen.
4. APC-Injektion (Asynchronous Procedure Call)
Bei der APC-Injektion wird bösartiger Code in eine Warteschlange gestellt, der ausgeführt wird, wenn ein Thread in einen Alarmzustand wechselt. Bei dieser Methode wird Code mit QueueUserAPC() in einen Thread gestellt. Der in den Thread injizierte Code wird ausgeführt, wenn dieser seine APC-Warteschlange verarbeitet, was in der Regel bei bestimmten Systemaufrufen oder Warteoperationen geschieht. Diese Methode eignet sich gut für Threads, die wiederholt veränderbare Zustände durchlaufen.
5. Reflektierende DLL-Injektion
Bei der Methode der reflektierenden DLL-Injektion wird eine DLL mit Hilfe eines Windows-Loaders geladen, ohne dass ein Dateisystem-Artefakt geschrieben wird. Es handelt sich um eine benutzerdefinierte DLL mit Anweisungen, wie sie im Speicher zuzuordnen und anzusprechen ist. Bei diesem Trick werden der Loader-Code und die DLL in den Speicher des Zielprozesses injiziert und der Loader ausgeführt, um die DLL vorzubereiten. Dadurch wird die Erkennung durch normale DLL-Lademekanismen und Überwachungsmaßnahmen vermieden.
6. Process Hollowing
Prozess-Hollowing ist eine heimliche Injektionstechnik, bei der Angreifer einen legitimen Prozess in einem angehaltenen Zustand erstellen (mit CreateProcess mit CREATE_SUSPENDED), seinen ursprünglichen Speicherbereich aufheben (über NtUnmapViewOfSection/ZwUnmapViewOfSection), neuen Speicher zuweisen (VirtualAllocEx), bösartigen Code schreiben (WriteProcessMemory), den PE-Header und die Relokationen korrigieren, den Process Environment Block (PEB) aktualisieren und schließlich den Einstiegspunkt umleiten (SetThreadContext), bevor sie die Ausführung fortsetzen (ResumeThread). Auf diese Weise kann der bösartige Code unter der Identität und mit den Berechtigungen eines legitimen Prozesses ausgeführt werden.
Wie funktioniert die Prozessinjektion?
Prozessinjektionen folgen einer Reihe von Schritten, um Code in einem Zielprozess auszuführen. Unabhängig von der Injektionsmethode folgt die technische Umsetzung bestimmten Schritten, die den Prozessspeicher manipulieren und die Ausführung des Prozessablaufs verändern.
Der erste Schritt ist die Identifizierung des Zielprozesses und der Zugriffserwerb. Der bösartige Prozess verwendet OpenProcess(), um einen Handle für den Zielprozess zu erhalten. Die erforderlichen Zugriffsrechte für diesen Handle sind PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE und PROCESS_VM_READ.
Der zweite wichtige Schritt ist die Speicherzuweisung im Zielprozess. VirtualAllocEx() weist Speicherplatz im Adressraum des Zielprozesses zu, indem es Seiten des virtuellen Speichers reserviert und festschreibt.
Der dritte Schritt besteht darin, den Shellcode in den zugewiesenen Speicherbereich zu kopieren. WriteProcessMemory() kopiert die Code-Bytes aus dem Quellpuffer in den Speicherbereich des Zielprozesses. Bei diesem Vorgang sollten die Anforderungen hinsichtlich Ausrichtung und Größe berücksichtigt werden.
Der letzte Schritt der Ausführungsauslösung stellt die letzten Kernkomponenten dar. Jede Technik verwendet den einen oder anderen Mechanismus:
- CreateRemoteThread() erstellt einen neuen Thread, um den injizierten Code auszuführen
- QueueUserAPC() stellt die Codeausführung in einem bestehenden Thread in die Warteschlange
- SetThreadContext() ändert den bestehenden Thread-Ausführungsfluss
- Direkte Änderung von Funktionszeigern oder Hooks
Sobald die Ausführung gestartet ist, wird der injizierte Code im Kontext des Zielprozesses ausgeführt und hat Zugriff auf die Ressourcen und das Sicherheitstoken des Zielprozesses. Dieser Code kann dann alle vorgesehenen Aufgaben ausführen und läuft unter den Berechtigungen und der Vertrauensstufe des Zielprozesses.
Wie lassen sich Prozessinjektionsangriffe erkennen?
Prozessinjektionen sind schwer zu erkennen, da sie mehrere Komponenten und Verhaltensweisen des Systems betreffen. Um Injektionsaktivitäten zu identifizieren, müssen Sicherheitssysteme Speicherbewegungen, API-Aufrufe und das gesamte Prozessverhalten überwachen.
Diese Erkennungsmethoden bilden in Kombination eine umfassende Erkennungsstrategie.
Speichermusteranalyse
Die Speicheranalyse konzentriert sich auf die Suche nach gängigen Mustern in Speicherbereichen von Prozessen. Dies geschieht, weil diese Bereiche des Prozessspeichers von Sicherheitstools gescannt werden, um die Berechtigungseinstellungen des Prozessspeichers und den erwarteten Inhalt zu überprüfen. Dazu gehört unter anderem die Erkennung anomaler ausführbarer Bereiche und Seiten, die nicht den typischen Inhaltssignaturen innerhalb von Prozessen entsprechen.
Speicherscanner suchen nach Abweichungen von den ursprünglichen Prozessbinärdateien, indem sie entweder Änderungen in normalerweise statischen Prozessspeicherstrukturen überwachen oder nach dynamischen Codesegmenten suchen.
API-Aufrufüberwachung
Verdächtige Sequenzen von Speichermanipulationsaufrufen werden durch die Windows-API-Überwachung erkannt. Sicherheitstools überwachen OpenProcess() für den Prozesszugriff, VirtualAllocEx() für die Speicherzuweisung und WriteProcessMemory() für das Schreiben in den Speicher. Wenn ein Thread erstellt oder manipuliert wird, z. B. CreateRemoteThread(), ist dies ein eindeutiges Anzeichen für eine Injektion.
Änderungen am Status von Prozessen und Threads über APIs wie SuspendThread() und SetThreadContext() sollten ebenfalls überwacht werden, da diese häufig in Injektionsketten vorkommen.
Verhaltensindikatoren
Die Überwachung des Verhaltens von Prozessen dient dazu, unerwartete Aktivitätsmuster zu identifizieren, die auf solche Injektionsversuche hindeuten. Intrusion-Detection-Systeme überwachen Threads in einem relativ stabil laufenden Prozess und Änderungen in der Prozessspeicherkarte, um solche Prozesse zu verfolgen.
Diese Verhaltensweisen sind zusammen mit der Änderung der Importadressentabellen und prozessübergreifenden Speicheroperationen relevante Indikatoren für die Erkennung.
Erkennungswerkzeuge
Um Prozessinjektionen zu erkennen, sind einige Sicherheitswerkzeuge mit umfassenden Überwachungsfunktionen erforderlich. Die Echtzeitanalyse erfolgt durch Prozessmonitore, die API-Aufrufe und Systemaktionen überwachen, während Speicheranalyse-Tools eine tiefgehende Analyse der Prozessspeicherbereiche durchführen. Mit Ereignisprotokoll-Analysatoren können Teams den Verlauf von Sicherheitsereignissen innerhalb des Systems aufzeichnen, um einen Überblick über die Vergangenheit zu erhalten.
Enterprise Detection and Response (EDR)-Lösungen wie SentinelOne kombinieren verschiedene Überwachungsmethoden mit Analysefunktionen. Es gibt Systemverwaltungstools wie Prozessmonitore und Prozess-Explorer, die die Prozesse im Detail sowie die Speicherzuweisung pro Prozess anzeigen.
Wie lassen sich Prozessinjektionsangriffe verhindern?
Die Prävention von Prozessinjektionen kann nicht durch eine einzige Sicherheitskontrolle gewährleistet werden, sondern erfordert Kontrollen auf System-, Prozess- und Codeebene. Diese Maßnahmen konzentrieren sich darauf, die Möglichkeiten der Prozessinjektion einzuschränken und potenzielle Zielprozesse für Injektionen zu erschweren.
Prävention auf Systemebene
Präventive Maßnahmen auf Systemebene beginnen mit der korrekten Verwaltung von Zugriffsrechten und Berechtigungen. Systeme sollten über Rechte zur Erstellung und Manipulation von Prozessen verfügen, um nicht-administrative Benutzer so einzuschränken, dass sie nur Handles für sensible Prozesse auf Systemen öffnen können. Diese Einschränkungen werden durch die Benutzerkontensteuerung (UAC) und AppLocker-Richtlinien durchgesetzt, um zu verwalten, welche Prozesse mit welcher Berechtigungsstufe ausgeführt werden können.
Code-Signierung
Eine weitere wichtige Präventionsmaßnahme ist die Durchsetzung der Code-Signierung. Module sollten nur geladen werden, wenn ihre digitalen Signaturen überprüft wurden, und unsachgemäß signierte oder nicht signierte Codes sollten vom System abgelehnt werden. Windows Defender Application Control (WDAC)-Richtlinien setzen Anforderungen an die Codeintegrität durch und deaktivieren das Laden von nicht signierten DLLs und ausführbaren Dateien.
Speicherschutz
Speicherschutzmechanismen sind ein wichtiger Bestandteil der Verteidigung. Die Datenausführungsverhinderung (DEP) schützt vor der Ausführung von Code aus Datenseiten, während die Adressraum-Layout-Randomisierung (ASLR) es erschwert, bestimmte Speicherbereiche anzugreifen.
Zu den mittelschweren Schutzmaßnahmen für geschützte Prozesse gehören Control Flow Guard (CFG), das Ziele auf indirekte Aufrufe überprüft, und Protected Process Light (PPL), das die Fähigkeit von Prozessen einschränkt, vorhandene Prozesse entsprechend den Signaturstufen der Mitglieder zu öffnen.
Anwendungshärtung
Auch für die Anwendungshärtung muss das Sicherheitsteam sichere Codierungspraktiken und Compiler-Optionen befolgen. Entwickler sollten Sicherheitsfunktionen wie /DYNAMICBASE und /NXCOMPAT konfigurieren, eine Ausnahmebehandlung implementieren und Speicheroperationen innerhalb des Anwendungs-Debugging-Prozesses validieren.
KI-gestützte Cybersicherheit
Verbessern Sie Ihre Sicherheitslage mit Echtzeit-Erkennung, maschineller Reaktion und vollständiger Transparenz Ihrer gesamten digitalen Umgebung.
Demo anfordernFazit
Bei der Prozessinjektion wird bösartiger Code neben anderen laufenden Prozessen in den Speicherbereich eingeschleust. Der Angreifer zwingt die Zielprozesse zur Ausführung von beliebigem Code und schreibt zusätzlich seinen eigenen Code in den Adressraum. Das Verfahren ist deshalb so gefährlich, weil es herkömmliche Techniken zur Erkennung von Bedrohungen umgehen kann. Um sie zu erkennen, müssen Sie fortschrittliche Sicherheitslösungen und Präventionsstrategien einsetzen.
Dazu gehören Speicherschutz, Verhaltenskontrollen, Zugriffskontrollen und andere Maßnahmen. Wenn Unternehmen die Mechanismen von Prozessinjektionstechniken verstehen, können sie ihre Systeme entsprechend absichern und Sicherheitskontrollen effektiver einsetzen.
"Häufig gestellte Fragen zur Prozessinjektion
Bei einem Prozess-Injection-Angriff kopiert der Angreifer einen Code in den Speicher eines Prozesses und führt ihn aus. Dadurch kann der Angreifer seinen eigenen Code im Zielprozess ausführen und so Sicherheitsmaßnahmen umgehen.
Prozessinjektion ist eine Technik, die vor allem dazu dient, Aktivitäten und Persistenz zu verbergen sowie Code mit höheren Berechtigungen auszuführen. Wenn die Windows-DLL über normale Prozesse in einen anderen Prozess injiziert wird, führt der ausgeführte Code Operationen mit derselben Vertrauensstufe wie der Zielprozess aus und verfügt über dieselben Zugriffsrechte, wodurch es für Sicherheitstools schwieriger wird, böswilliges Verhalten zu erkennen.
Die Erkennung von Prozessinjektionen erfordert die Überwachung des Speichers, der API und des Prozessverhaltens. Statische Programmanalysatoren markieren solche Injektionsversuche, indem sie nach Mustern wie anomalen Speicherzuweisungen, Thread-Erstellungen und abnormalen API-Sequenzen zur Prozessmanipulation suchen.
Prozessinjektion wird hauptsächlich von Malware verwendet, aber in einigen Szenarien kann diese Technik auch legitim eingesetzt werden, beispielsweise zum Debuggen, zur Malware-Analyse, für Überwachungstechniken und zur Erweiterung der Funktionalität einer Anwendung.
In APT (Advanced Persistent Threat)-Kampagnen spielt die Prozessinjektion eine entscheidende Rolle, um Persistenz zu erreichen und eine Erkennung zu vermeiden. APT-Akteure verwenden fortschrittliche Injektionstechniken, um dauerhaften Zugriff auf infizierte Systeme zu erhalten und sicherzustellen, dass sie während eines längeren Einsatzes niemals entdeckt werden.
