ELAM-Treiberanforderungen
Bei der Treiberinstallation müssen vorhandene Tools für die Online- und Offlineinstallation verwendet werden, wobei ein Treiber über die typische INF-Verarbeitung registriert wird. Beispielcode für ELAM-Treiber finden Sie in den folgenden Artikeln: https://github.com/Microsoft/Windows-driver-samples/tree/main/security/elam
INSTALLATION des AM-Treibers
Um die Kompatibilität der Treiberinstallation sicherzustellen, kündigt sich ein ELAM-Treiber ähnlich wie alle anderen Starttreiber als Starttreiber an. Das INF legt den Starttyp auf SERVICE_BOOT_START (0) fest, was angibt, dass der Treiber vom Startladeprogramm geladen und während der Kernelinitialisierung initialisiert werden soll. Ein ELAM-Treiber kündigt seine Gruppe als "Early-Launch" an. Das Frühstartverhalten für Treiber in dieser Gruppe wird in Windows implementiert, wie im nächsten Abschnitt beschrieben.
Im Folgenden finden Sie ein Beispiel für den Treiberinstallationsabschnitt eines ELAM-Treibers INF.
[SampleAV.Service]
DisplayName = %SampleAVServiceName%
Description = %SampleAVServiceDescription%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 3 ; SERVICE_ERROR_CRITICAL
LoadOrderGroup = “Early-Launch”
Da ein AM-Treiber keine Geräte besitzt, ist es erforderlich, den AM-Treiber als Legacy zu installieren, damit der Treiber nur als Dienst zur Registrierung hinzugefügt wird. (Wenn der AM-Treiber als normaler PNP-Treiber installiert ist, wird er dem Enumerationsabschnitt der Registrierung hinzugefügt und verfügt daher über einen PDO-Verweis, was beim Entladen des Treibers zu unerwünschtem Verhalten führt.)
Sie müssen auch einen Abschnitt SignatureAttributes in die INF-Datei für den ELAM-Treiber einschließen.
Installation des Sicherungstreibers
Um einen Wiederherstellungsmechanismus für den Fall bereitzustellen, dass der ELAM-Treiber versehentlich beschädigt wird, installiert das ELAM-Installationsprogramm auch eine Kopie des Treibers an einem Sicherungsspeicherort. Dadurch kann WinRE die sauber Kopieren abrufen und die Installation wiederherstellen.
Das Installationsprogramm liest den Speicherort der Sicherungsdatei aus dem in gespeicherten BackupPath-Schlüssel .
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\EarlyLaunch
Das Installationsprogramm platziert dann die Sicherungskopie in dem Ordner, der im Registrierungsschlüssel angegeben ist.
INITIALISIERUNG des AM-Treibers
Der Windows-Startladeprogramm Winload lädt alle Starttreiber und ihre abhängigen DLLs vor der Übergabe an den Windows-Kernel in den Arbeitsspeicher. Die Starttreiber stellen die Gerätetreiber dar, die initialisiert werden müssen, bevor der Datenträgerstapel initialisiert wurde. Zu diesen Treibern gehören unter anderem der Datenträgerstapel- und Volume-Manager sowie Dateisystemtreiber und Bustreiber für das Betriebssystemgerät.
AM-Treiberrückrufschnittstelle
Die ELAM-Treiber verwenden Rückrufe, um dem PnP-Manager eine Beschreibung jedes Starttreibers und der abhängigen DLL bereitzustellen, und jedes Startimage kann als bekannte gute Binärdatei, bekannte schlechte Binärdatei oder unbekannte Binärdatei klassifiziert werden.
Die Standardbetriebssystemrichtlinie besteht nicht darin, bekannte fehlerhafte Treiber und DLLs zu initialisieren. Die Richtlinie kann konfiguriert werden und wird von Winload als Teil des Startnachweises gemessen.
PnP verwendet richtlinien und die vom AM-Treiber bereitgestellte Klassifizierung, um zu entscheiden, ob jedes Startimage initialisiert werden soll.
Registrierungsrückrufe
Die Frühstarttreiber können Registrierungs- oder Starttreiberrückrufe verwenden, um die Konfigurationsdaten zu überwachen und zu überprüfen, die als Eingabe für jeden Starttreiber verwendet werden. Die Konfigurationsdaten werden in der Systemregistrierungsstruktur gespeichert, die von Winload geladen wird und zum Zeitpunkt der Starttreiberinitialisierung verfügbar ist.
Hinweis
Alle Änderungen an der ELAM-Registrierungsstruktur werden verworfen, bevor das System gestartet wird. Daher sollte ein ELAM-Treiber die standardmäßige ETW-Protokollierung (Event Tracing for Windows) verwenden, anstatt in die Registrierung zu schreiben.
Diese Rückrufe sind während der Lebensdauer des ELAM-Treibers gültig und werden nicht registriert, wenn der Treiber entladen wird. Weitere Informationen:
Rückrufe für Starttreiber
Verwenden Sie IoRegisterBootDriverCallback und IoUnRegisterBootDriverCallback , um eine BOOT_DRIVER_CALLBACK_FUNCTION zu registrieren und die Registrierung aufzuheben.
Dieser Rückruf bietet status Updates von Windows auf einen ELAM-Treiber, einschließlich, wenn alle Starttreiber initialisiert wurden und die Rückruffunktion nicht mehr funktioniert.
Rückruftyp
Die BDCB_CALLBACK_TYPE-Enumeration beschreibt zwei Arten von Rückrufen:
- Rückrufe, die status Updates für einen ELAM-Treiber bereitstellen (BdCbStatusUpdate)
- Rückrufe, die vom AM-Treiber zum Klassifizieren von Starttreibern und abhängigen DLLs vor der Initialisierung ihrer Images verwendet werden (BdCbInitializeImage)
Die beiden Rückruftypen verfügen über eindeutige Kontextstrukturen, die zusätzliche spezifische Informationen für den Rückruf bereitstellen.
Die Kontextstruktur für den status Updaterückruf enthält einen einzelnen aufgezählten Typ, der die Windows-Legende beschreibt.
Die Kontextstruktur für den Initialize-Imagerückruf ist komplexer und enthält Hash- und Zertifikatinformationen für jedes geladene Image. Die -Struktur enthält zusätzlich ein Feld, bei dem es sich um einen Ausgabeparameter handelt, in dem der AM-Treiber den Klassifizierungstyp für den Treiber speichert.
Ein Fehler, der von einem status Updaterückruf zurückgegeben wird, wird als schwerwiegender Fehler behandelt und führt zu einer Systemfehlerüberprüfung. Dadurch kann ein ELAM-Treiber angeben, wann ein Zustand außerhalb der AM-Richtlinie erreicht wird. Wenn beispielsweise ein AM-Runtimetreiber nicht geladen und initialisiert wurde, kann der Frühstarttreiber beim Rückruf zur Vorbereitung auf das Entladen fehlschlagen, um zu verhindern, dass Windows in einen Zustand wechselt, ohne dass ein AM-Treiber geladen wurde.
Ein Image wird als unbekannt behandelt, wenn ein Fehler vom Rückruf des Initialisierungsimages zurückgegeben wird. Unbekannte Treiber werden basierend auf der Betriebssystemrichtlinie initialisiert oder ihre Initialisierung übersprungen.
Schadsoftwaresignaturen
Die Daten zur Schadsoftwaresignatur werden vom AM ISV bestimmt, sollten aber mindestens eine genehmigte Liste von Treiberhashes enthalten. Die Signaturdaten werden in der Registrierung in einer neuen Struktur "Early Launch Drivers" unter HKLM gespeichert, die von Winload geladen wird. Jeder AM-Treiber verfügt über einen eindeutigen Schlüssel, in dem seine Signatur binary large object (BLOB) gespeichert werden soll. Registrierungspfad und -schlüssel haben das folgende Format:
HKLM\ELAM\<VendorName>\
Innerhalb des Schlüssels kann der Anbieter beliebige Werte definieren und verwenden. Es gibt drei definierte binäre Blobwerte, die vom gemessenen Start gemessen werden, und der Anbieter kann jede dieser Werte verwenden:
- Gemessen
- Policy
- Config
Die ELAM-Struktur wird entladen, nachdem sie von Early Launch Antimalware verwendet wurde, um die Leistung zu verbessern. Wenn ein Benutzermodusdienst die Signaturdaten aktualisieren möchte, sollte er die Hive-Datei vom Dateispeicherort \Windows\System32\config\ELAM einbinden. Sie können beispielsweise eine UUID generieren, in eine Zeichenfolge konvertieren und diese als eindeutigen Schlüssel verwenden, in den die Struktur eingebunden werden soll. Das Speicher- und Abrufformat dieser Daten-BLOBs bleibt dem ISV überlassen, aber die Signaturdaten müssen signiert werden, damit der AM-Treiber die Integrität der Daten überprüfen kann.
Überprüfen von Schadsoftwaresignaturen
Die Methode zum Überprüfen der Integrität der Schadsoftwaresignaturdaten bleibt jedem AM ISV überlassen. Die CNG Cryptographic Primitive Functions stehen zur Verfügung, um digitale Signaturen und Zertifikate für die Daten der Schadsoftwaresignatur zu überprüfen.
Fehler bei der Schadsoftwaresignatur
Wenn der ELAM-Treiber die Integrität der Signaturdaten überprüft und diese Überprüfung fehlschlägt oder keine Signaturdaten vorhanden sind, ist die Initialisierung des ELAM-Treibers weiterhin erfolgreich. In diesem Fall muss der ELAM-Treiber für jeden Starttreiber für jeden Initialisierungsrückruf "unbekannt" zurückgeben. Darüber hinaus sollte der ELAM-Treiber diese Informationen nach dem Start an die Am-Runtime-Komponente übergeben.
Entladen des AM-Treibers
Wenn der RückrufstatusType BdCbStatusPrepareForUnload lautet, ist dies ein Hinweis für den AM-Treiber, dass alle Starttreiber initialisiert wurden und dass der AM-Treiber für das Entladen vorbereitet werden sollte. Vor dem Entladen muss der Frühstart-AM-Treiber die Registrierung seiner Rückrufe aufheben. Die Aufhebung der Registrierung kann während eines Rückrufs nicht erfolgen. Stattdessen muss dies in der DriverUnload-Funktion geschehen, die ein Treiber während DriverEntry angeben kann.
Um die Kontinuität beim Schutz vor Schadsoftware zu gewährleisten und eine ordnungsgemäße Übergabe sicherzustellen, sollte die Runtime-AM-Engine gestartet werden, bevor der AM-Treiber für den frühen Start entladen wird. Dies bedeutet, dass die Runtime-AM-Engine ein Starttreiber sein sollte, der vom AM-Treiber für den frühen Start überprüft wird.
Leistung
Der Treiber muss die in der folgenden Tabelle definierten Leistungsanforderungen erfüllen:
Szenarien |
Startzeit |
Beendigungszeit |
Obergrenze |
Bewerten Sie den geladenen startkritischen Treiber, bevor Sie die Initialisierung zulassen. Dies schließt auch status Updaterückrufe ein. |
Der Kernel ruft den Antischadsoftwaretreiber zurück, um den geladenen startkritischen Treiber auszuwerten. |
Der Antischadsoftwaretreiber gibt das Auswertungsergebnis zurück. |
0,5 ms |
Auswerten aller geladenen startkritischen Treiber |
Der Kernel ruft den Antischadsoftwaretreiber zurück, um den ersten geladenen startkritischen Treiber auszuwerten. |
Der Antischadsoftwaretreiber gibt das Auswertungsergebnis für den letzten startkritischen Treiber zurück. |
50 ms |
Footprint (Treiber und Konfigurationsdaten im Arbeitsspeicher) |
– |
– |
128kB |
Initialisieren von Treibern
Nachdem die Starttreiber vom ELAM-Treiber ausgewertet wurden, verwendet der Kernel die von ELAM zurückgegebene Klassifizierung, um zu entscheiden, ob der Treiber initialisiert werden soll. Diese Entscheidung wird von der Richtlinie vorgegeben und hier in der Registrierung unter gespeichert:
HKLM\System\CurrentControlSet\Control\EarlyLaunch\DriverLoadPolicy
Dies kann über Gruppenrichtlinie auf einem in die Domäne eingebundenen Client konfiguriert werden. Eine Antischadsoftwarelösung möchte diese Funktionalität möglicherweise dem Endbenutzer in nicht verwalteten Szenarien verfügbar machen. Die folgenden Werte werden für DriverLoadPolicy definiert:
PNP_INITIALIZE_DRIVERS_DEFAULT 0x0 (initializes known Good drivers only)
PNP_INITIALIZE_UNKNOWN_DRIVERS 0x1
PNP_INITIALIZE_BAD_CRITICAL_DRIVERS 0x3 (this is the default setting)
PNP_INITIALIZE_BAD_DRIVERS 0x7
Startfehler
Wenn ein Starttreiber aufgrund der Initialisierungsrichtlinie übersprungen wird, versucht der Kernel weiterhin, den nächsten Starttreiber in der Liste zu initialisieren. Dies wird fortgesetzt, bis entweder alle Treiber initialisiert wurden oder der Start fehlgeschlagen ist, weil ein übersprungener Starttreiber für den Start entscheidend war. Wenn der Absturz nach dem Start des Datenträgerstapels auftritt, gibt es ein Absturzabbild, das einige Informationen über den Grund oder den Absturz enthält, um Informationen zu fehlenden Treibern einzuschließen. Dies kann in WinRE verwendet werden, um die Ursache des Fehlers zu ermitteln und zu versuchen, eine Korrektur durchzuführen.
ELAM und gemessener Start
Wenn der ELAM-Treiber einen Richtlinienverstoß erkennt (z. B. ein Rootkit), sollte er sofort Tbsi_Revoke_Attestation aufrufen, um die PCRs für ungültig zu erklären, die angegeben haben, dass sich das System in einem guten Zustand befand. Die Funktion gibt einen Fehler zurück, wenn ein Problem mit dem gemessenen Start vorliegt, z. B. kein TPM im System.
Tbsi_Revoke_Attestation kann aus dem Kernelmodus aufgerufen werden. Sie erweitert PCR[12] um einen nicht angegebenen Wert und erhöht den Ereigniszähler im TPM. Beide Aktionen sind erforderlich, sodass die Vertrauensstellung in allen Anführungszeichen unterbrochen wird, die von hier aus erstellt werden. Daher spiegeln die Protokolle für den gemessenen Start den aktuellen Zustand des TPM für den Rest der Zeit, in der das TPM eingeschaltet wird, nicht wider, und Remotesysteme können keine Vertrauensstellung in den Sicherheitsstatus des Systems bilden.