
Wussten Sie, dass ein völlig legitimer Treiber einem Angreifer die Möglichkeit geben kann, sich für lange Zeit in Ihrem System zu registrieren und auch nach einer Neuinstallation im System zu bleiben? Oder verwandeln Sie Ihren Computer in einen Stein? Beispielsweise sind einige harmlose, scheinbar vertrauenswürdige (signierte) Treiber übrigens Werkzeuge zum Überschreiben des BIOS. Nach einem solchen Angriff wird nur der Programmierer speichern.
In Windows gibt es vertrauenswürdige Anwendungen / Skripte / Bibliotheken mit zusätzlichen interessant gefährliche Funktionen wie das Ausführen von beliebigem Code, das Herunterladen von Dateien, das Umgehen der Benutzerkontensteuerung usw. Wenn eine solche zusätzliche Funktionalität in einer Kernelkomponente gefunden wird, wird sie noch interessanter.
Ab Windows Vista x64 gilt die DSE-Richtlinie (Driver Signature Enforcement). Alle Treiber auf Kernelebene müssen signiert sein. Wenn ein Angreifer (mit Benutzer- / Administratorrechten) nach dem Eindringen in das System die maximale Zugriffsebene erhalten möchte (Kernel-Rootkit / Bootkit / SMM-Rootkit / BIOS-Rootkit installieren), muss er die Signaturanforderungen für den Treiber irgendwie umgehen. Die Möglichkeit, bestimmte Funktionen oder Anweisungen im Kernelmodus im Kernelmodus aufzurufen, kann einem Angreifer ein Tool bieten, mit dem er Berechtigungen erhöhen, Informationen offenlegen oder einen Denial-of-Service verursachen kann. Wir bezeichnen diese Funktionalität als Doppelfunktionalität (in einigen Fällen kann dies als Sicherheitslücke oder Hintertür bezeichnet werden, die Diskussion über die korrekte Definition geht jedoch über den Rahmen dieses Artikels hinaus).
DSE-Problemumgehungen
Schauen wir uns an, welche Optionen ein Angreifer im Allgemeinen hat, um DSE zu umgehen (Sie müssen irgendwie in ring0 eindringen). In der folgenden Tabelle sind die Möglichkeiten zur Umgehung von DSE mit ihren Vor- und Nachteilen zusammengefasst (für den Angreifer und die Sicherheitskräfte zur Kenntnis zu nehmen). Es ist erwähnenswert, dass diese Informationen für Windows x64 gelten, beginnend mit Vista.
Wie Sie der Tabelle entnehmen können, ist ein signierter Treiber mit Dual-Purpose-Funktionalität die attraktivste Möglichkeit, DSE für einen Angreifer zu umgehen.
Gefährliche oder doppelte Funktionalität
Schauen wir uns Beispiele für böswillige Funktionen an, die ein Angreifer in Gegenwart eines Treibers mit gefährlichen Funktionen für zwei Zwecke zeigt.
- Eskalation von Berechtigungen auf Administratorebene / SYSTEM. Physischer Lese- / Schreibspeicher erforderlich. Dieser Angriff kann beispielsweise mit dem ASMMAP-Treiber von ASUS ausgeführt werden. Lesen Sie dazu den physischen Speicher und suchen Sie die EPROCESS-Struktur (sie ist ein Element einer verknüpften Liste). Durchsuchen Sie dann die Liste nach dem Prozess, dessen Berechtigungsstufe wir erhöhen möchten, sowie nach einem bekannten Prozess mit der SYSTEM-Ebene (z. B. lsass, wininit). Kopieren Sie dann den Wert des Token-Felds der Systemprozessstruktur in die Struktur des Zielprozesses. Eine detailliertere Beschreibung des Angriffs finden Sie hier .
- SMEP deaktivieren. Dazu müssen Sie in das Steuerregister cr4 schreiben (genauer gesagt, setzen Sie das 20. Bit zurück). Beispielsweise deaktiviert der bandainamcoonline.sys-Treiber nicht nur SMEP, sondern führt auch Code entsprechend dem vom Benutzer übergebenen Zeiger hilfreich aus. Für Interessierte gibt es einen Artikel mit einer detaillierten Beschreibung des Fahrers.
Ausführung von beliebigem Code im Kernelmodus. Physischer Lese- / Schreibspeicher und MSR erforderlich. Die Bedeutung besteht darin, die Adresse (in einem der MSRs), zu der beim Tätigen eines Systemaufrufs übergegangen wird, durch die Adresse des Speicherorts des Codes des Angreifers zu ersetzen. Hier finden Sie weitere Informationen dazu. PatchGuard wird auf dem Weg stören, aber Sie können es herausfinden, wenn Sie möchten.
Da sowohl der Treiber als auch PatchGuard in Ring 0 ausgeführt werden, hindert nichts den Treiber daran, PatchGuard-Überprüfungen zu deaktivieren (bis natürlich Microsoft Intel hört und mit zwei Schutzringen über das Modell hinausgeht). Die Kernel-Entwickler von Microsoft sind sich dieser Tatsache bewusst und führen verschiedene Aktionen aus, um den Speicherort dieses Codes zu verbergen, seine Aktionen und die verwendeten internen Strukturen zu verschleiern. Mit anderen Worten, da Sie nicht daran gehindert werden können, den PatchGuard-Code zu ändern, versuchen sie ihr Bestes, ihn auszublenden.
- Blunden B. Das Rootkit-Arsenal: Flucht und Ausweichen in den dunklen Ecken des Systems.
Das OriginalAngesichts der Tatsache, dass sowohl Treibercode als auch PatchGuard-Code in Ring 0 ausgeführt werden, hindert nichts ein KMD daran, PatchGuard-Überprüfungen zu deaktivieren (es sei denn, Microsoft nimmt einen Hinweis von Intel und geht über ein Zwei-Ring-Berechtigungsmodell hinaus). Die Kernel-Ingenieure von Microsoft sind sich dieser Tatsache sehr bewusst und führen alle Arten von Programmierakrobatik durch, um zu verschleiern, wo sich der Code befindet, was er tut und welche internen Datenstrukturen er manipuliert. Mit anderen Worten, sie können Sie nicht davon abhalten, PatchGuard-Code zu ändern, also werden sie höllisch versuchen, ihn zu verbergen.
- Blunden B. Das Rootkit-Arsenal: Flucht und Ausweichen in den dunklen Ecken des Systems.
- BIOS-Eintrag. Ein Beispiel in freier Wildbahn ist Lojax . Angreifer nahmen das bekannte RwDrv.sys und verwendeten es für ihre schmutzigen Zwecke: Sie lasen das BIOS, modifizierten es und schrieben es zurück. Eine Neuinstallation von Windows hilft hier nicht weiter, da sich der Schadcode in der Firmware von SPI-Flash befindet. Wenn das Überschreiben des BIOS nicht erfolgreich ist (oder speziell überschrieben wurde), ist dies ebenfalls unangenehm. In jedem Fall müssen Sie dem Programmierer nachfahren, um die lästigen Folgen zu beheben.
- Rufen Sie den SMI-Handler auf. Erstens sind nicht alle BIOSs im ring0-Modus gleichermaßen schutzlos gegen Code: Es gibt verschiedene Mechanismen für den Lese- / Schreibschutz. Daher kann es vorkommen, dass Sie tiefer gehen müssen - in den SMM-Modus (den privilegiertesten). Eine Möglichkeit, vom Kernel-Modus dorthin zu gelangen, besteht darin, den SMI-Handler zu ziehen (häufig gibt es gefährdete unter ihnen). Um den SMI-Handler aufzurufen, müssen Sie in der Lage sein, auf den E / A-Port zu schreiben. Dies ist nur mit ring0-Berechtigungen möglich. Das heißt, ein Treiber, der in E / A-Ports schreiben kann, kann einen anfälligen SMI-Handler erkennen, mit dem ein Angreifer Code im SMM-Modus ausführen kann. In diesem Beispiel verwendet der Autor den Treiber RwDrv.sys.
- Informationen zum System. Lesen des Kernelspeichers (durch Lesen des physischen Speichers), Lesen des BIOS, Informationen zu Systemeinstellungen, angeschlossenen Geräten und aktivierten / deaktivierten Schutzmechanismen (durch Lesen von MSR, Steuerregistern, Zugriff auf Eingabe- / Ausgabeports) In einigen Fällen kann ein bekannter Hypervisor erkannt werden ( wie VirtualBox über MSR ). Für diese Aufgabe ist meistens sogar ein Treiber geeignet, der nur lesen kann, nicht unbedingt schreiben muss. Beispielsweise eignet sich RamCaptureDriver64.sys von Belkasoft zum Lesen des physischen Speichers.
Wenn wir verschiedene Artikel und Hinweise zu CVE analysieren, können wir eine Klassifizierung als potenziell gefährlich beim Zugriff auf Ring3-Funktionen in den Treibern unterscheiden. In der folgenden Tabelle sind die gefährlichen Funktionen und Informationsquellen aufgeführt.
Und dies ist nicht die ganze Liste möglicher gefährlicher Funktionen. Sie können auch über das Lesen / Schreiben des virtuellen Kernelspeichers, das Lesen / Schreiben von MMIO, den Zugriff auf PCI-Geräte usw. sprechen.
Die ersten drei Funktionen sind sowohl von größtem Interesse als auch von größter Gefahr (und am wahrscheinlichsten, einen Treiber mit solchen Funktionen zu finden): Lesen / Schreiben von MSR-Registern, Lesen / Schreiben von E / A-Ports, Lesen / Schreiben von physischem Speicher. Mithilfe von Steuerregistern können Sie einige Schutzmechanismen umgehen. Durch Schreiben in das Flag-Register können Sie Lese- / Schreib-Ein- / Ausgabeports in Ring3 aktivieren (dies wird übrigens in diesem Artikel über Habr erwähnt), den Erfolg von Angriffen auf Kanäle von Drittanbietern (durch Zugriff auf den Cache, Überwachung von Zählern) Leistung / Zyklen) ist höchstwahrscheinlich unwahrscheinlich.
Während der Erstellung dieses Materials auf der DEFCON 27-Konferenz in Las Vegas stellten die Forscher Jesse Michael und Mickey Shkatov die Arbeit „ Verlassen Sie den Kernel, wenn Sie nicht fahren können“ vor , in der auch dieses Problem behandelt wird. Wir empfehlen Ihnen, dieses Material zu studieren, um das Bild zu vervollständigen. Die Szenarien für die Verwendung solcher Treiber sind sehr einfach und klar, und es werden Beispiele für Codeabschnitte vorgestellt, die für die kritischsten Funktionen verantwortlich sind. Und bietet auch Code zum Arbeiten und Finden ähnlicher Treiber.
Generell ist anzumerken, dass sich dieses Thema seit langem mit Sicherheitsforschern befasst. Bereits 2018 schrieb der Forscher Alexander Matrosov in seinem Artikel "Was macht Betriebssystemtreiber für das BIOS gefährlich?" hat diese Frage aufgeworfen und gezeigt, wie einfach es ist, das BIOS zu nutzen.
Doppelfunktionstreiber
Nachfolgend sind die bekanntesten Vertreter von Fahrern mit Doppelfunktionen aufgeführt.
RwDrv.sys ist ein sehr beliebter Treiber (wird mit dem Dienstprogramm RWeverything geliefert ). Liest und schreibt physischen Speicher, E / A-Ports, MSR- und Steuerregister. Es wurde wiederholt in verschiedenen PoCs und dann im zuvor erwähnten Lojax-Rootkit verwendet. Eine Schnittstelle ist dafür in C ++ geschrieben und wird auch in Chipsec verwendet .
cpuz / gpuz
Liest und schreibt physischen Speicher, Ports und MSR. Es gibt mehrere PoC-Dienstprogramme, die es verwenden ( hier und hier ).
pcdsrvc_x64 - Treiber von Dell, für weitere Informationen kontaktieren Sie diesen Beitrag. Ermöglicht das Lesen / Schreiben von physischem Speicher in E / A-Ports.
AsIO64.sys

Es bietet die Möglichkeit, physischen Speicher und E / A-Ports zu lesen / schreiben und verfügt über eine praktische DLL zum Ausführen dieser Anforderungen.
Asmmap64.sys ist ein weiterer Treiber von ASUS, mit dem Sie physischen Speicher, E / A-Ports und MSR lesen / schreiben können. Für einen Angreifer wäre dies besonders angenehm, da der Zugriff auf den Treiber von einem normalen Benutzer ohne Administratorrechte erfolgen kann. Neugierige können sich an die Quelle wenden.
ntiolib_x64.sys / winio64.sys - Treiber von MSI, die im zuvor genannten Artikel ausführlich beschrieben werden. Mit ntiolib_x64.sys können Sie physischen Speicher, E / A-Ports und MSR lesen / schreiben. Winio64.sys bietet alle diese Funktionen außer MSR.
Normalerweise werden die beschriebenen gefährlichen Funktionen als Sicherheitslücken erkannt, wenn der Treiber für den Benutzer ohne Administratorrechte zugänglich ist (falsche ACL) oder wenn er die direkte Ausführung von beliebigem Code ermöglicht (wie in bandainamcoonline.sys). In anderen Fällen handelt es sich nur um Funktionen. Da der Benutzer über Administratorrechte verfügt, kann er alle Treiberfunktionen verwenden. Dies ist die Norm.
Wenn Sie glauben, dass es nicht mehr als ein Dutzend solcher Treiber gibt, irren Sie sich sehr. Sie können diese Auswahl interessanter Treiber sehen. Diese Liste enthält Treiber von ASUS, AVAST, Razer, LG, American Megatrends und anderen bekannten Unternehmen. Es gibt also viele davon, Sie müssen nur suchen. Sie stellen also eine echte Bedrohung dar.
Diese Bedrohung wird auch von Microsoft-Mitarbeitern verstanden. Und sie werden für Informationen über solche Fahrer dankbar sein;)

Empfehlungen
Für Benutzer:
- Sie sollten nicht unnötig unter dem Administratorkonto sitzen und die Benutzerkontensteuerung deaktivieren (obwohl es nicht schwierig ist, sie zu umgehen ).
- Sie können den Detektor installieren, der versucht, Treiber zu installieren (z. B. hier ).
- Wenn Dienstprogramme mit solchen Treibern verwendet werden müssen (Diagnose, Aktualisierung des BIOS usw.), entfernen Sie die Treiber nach der Verwendung.
- Richten Sie Device Guard ein (wenn Sie ein glücklicher Besitzer von Windows 10 sind). Mit dieser Technologie können Sie Ihre eigene Code-Integritätsrichtlinie erstellen und weiße Listen mit Programmen und Zertifikaten hinzufügen. Fügen Sie der Richtlinie beispielsweise die Anforderung hinzu, dass jeder Kernelmodustreiber eine Microsoft WHQL-Signatur haben muss. In diesem Beitrag können Sie sich besser mit dem Einstellen von Device Guard für diesen Zweck vertraut machen.
Hersteller sind besser dran, solche Treiber nicht zu unterschreiben. Wenn der Benutzer das BIOS aktualisieren, das System auf Schwachstellen (Hallo, Chipsec) überprüfen, die Leistung messen oder andere Manipulationen durchführen muss, die die Installation solcher Treiber erfordern, kann er sehr gut in den Testmodus wechseln, all dies tun und dann beenden. Die Benutzerfreundlichkeit wird dann sinken, aber die Sicherheit wird zunehmen.
Schlussfolgerungen
Wenn etwas signiert ist, können Sie ihm trotzdem nicht vertrauen. Erstens können Sie so etwas signieren, und zweitens kann ein Angreifer diesen signierten nutzen (selbst wenn er von einem vertrauenswürdigen Hersteller stammt).
Spezialisten für Informationssicherheit sollten Situationen, in denen ein Angreifer einen Fahrer mit gefährlichen Funktionen benötigt, um einen Angriff auszuführen, nicht von den Bedrohungsmodellen ausschließen. Es gibt genug solche Treiber, das ist ganz einfach. Wenn der Angriff nicht mit einem Pop-Treiber wie RwEverything ausgeführt wird, sondern mit einem weniger bekannten, ist es noch schwieriger, ihn zu erkennen. Sie müssen also auf der Hut sein, solche Dinge überwachen und nicht jedem Treiber erlauben, das System zu starten.
Verfasser: Elizaveta Khomenko