Dynamic-Link Bibliothekssicherheit
Wenn eine Anwendung dynamisch eine Dynamic Link Library lädt, ohne einen vollqualifizierten Pfadnamen anzugeben, versucht Windows, die DLL zu suchen, indem sie einen gut definierten Satz von Verzeichnissen in einer bestimmten Reihenfolge durchsucht, wie in Dynamic-Link Bibliothekssuchreihenfolgebeschrieben. Wenn ein Angreifer die Kontrolle über eines der Verzeichnisse im DLL-Suchpfad erhält, kann er eine schädliche Kopie der DLL in diesem Verzeichnis platzieren. Dies wird manchmal als DLL-Preloading-Angriff oder binären Planting-Angriffsbezeichnet. Wenn das System keine legitime Kopie der DLL findet, bevor es das kompromittierte Verzeichnis durchsucht, lädt es die schädliche DLL. Wenn die Anwendung mit Administratorrechten ausgeführt wird, kann der Angreifer in der lokalen Rechteerweiterung erfolgreich sein.
Angenommen, eine Anwendung ist so konzipiert, dass eine DLL aus dem aktuellen Verzeichnis des Benutzers geladen und ordnungsgemäß fehlschlägt, wenn die DLL nicht gefunden wird. Die Anwendung ruft LoadLibrary mit nur dem Namen der DLL auf, wodurch das System nach der DLL sucht. Wenn der Suchmodus für sichere DLL aktiviert ist und die Anwendung keine alternative Suchreihenfolge verwendet, durchsucht das System Verzeichnisse in der folgenden Reihenfolge:
- Das Verzeichnis, aus dem die Anwendung geladen wurde.
- Das Systemverzeichnis.
- Das 16-Bit-Systemverzeichnis.
- Das Windows-Verzeichnis.
- Das aktuelle Verzeichnis.
- Die Verzeichnisse, die in der PATH-Umgebungsvariable aufgeführt sind.
Wenn Sie das Beispiel fortsetzen, erhält ein Angreifer mit Kenntnis der Anwendung die Kontrolle über das aktuelle Verzeichnis und platziert eine bösartige Kopie der DLL in diesem Verzeichnis. Wenn die Anwendung den LoadLibrary Aufruf ausgibt, sucht das System nach der DLL, findet die bösartige Kopie der DLL im aktuellen Verzeichnis und lädt sie. Die bösartige Kopie der DLL wird dann innerhalb der Anwendung ausgeführt und erhält die Berechtigungen des Benutzers.
Entwickler können ihre Anwendungen vor DLL-Vorabladeangriffen schützen, indem Sie die folgenden Richtlinien befolgen:
Geben Sie nach Möglichkeit einen vollqualifizierten Pfad bei Verwendung der LoadLibrary, LoadLibraryEx, CreateProcess-oder ShellExecute--Funktionen an.
Verwenden Sie die LOAD_LIBRARY_SEARCH Flags mit der LoadLibraryEx--Funktion, oder verwenden Sie diese Flags mit der SetDefaultDllDirectories--Funktion, um eine DLL-Suchreihenfolge für einen Prozess einzurichten, und verwenden Sie dann die AddDllDirectory oder SetDllDirectory Funktionen, um die Liste zu ändern. Weitere Informationen finden Sie unter Dynamic-Link Bibliothekssuchreihenfolge.
Windows 7, Windows Server 2008 R2, Windows Vista und Windows Server 2008: Diese Flags und Funktionen sind auf Systemen verfügbar, auf denen KB2533623 installiert sind.
Verwenden Sie auf Systemen, auf denen KB2533623 installiert sind, die LOAD_LIBRARY_SEARCH Flags mit der LoadLibraryEx--Funktion, oder verwenden Sie diese Flags mit der SetDefaultDllDirectories-Funktion, um eine DLL-Suchreihenfolge für einen Prozess einzurichten, und verwenden Sie dann die AddDllDirectory oder SetDllDirectory Funktionen, um die Liste zu ändern. Weitere Informationen finden Sie unter Dynamic-Link Bibliothekssuchreihenfolge.
Erwägen Sie die Verwendung DLL-Umleitung oder eines Manifests, um sicherzustellen, dass Ihre Anwendung die richtige DLL verwendet.
Stellen Sie bei Verwendung der standardmäßigen Suchreihenfolge sicher, dass der Suchmodus für sichere DLL aktiviert ist. Dadurch wird das aktuelle Verzeichnis des Benutzers später in der Suchreihenfolge platziert, wodurch die Wahrscheinlichkeit erhöht wird, dass Windows eine legitime Kopie der DLL vor einer böswilligen Kopie findet. Der Suchmodus für sichere DLL ist standardmäßig aktiviert, beginnend mit Windows XP mit Service Pack 2 (SP2) und wird vom HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode Registrierungswert gesteuert. Weitere Informationen finden Sie unter Dynamic-Link Bibliothekssuchreihenfolge.
Erwägen Sie, das aktuelle Verzeichnis aus dem Standardsuchpfad zu entfernen, indem Sie SetDllDirectory- mit einer leeren Zeichenfolge ("") aufrufen. Dies sollte einmal früh bei der Prozessinitialisierung erfolgen, nicht vor und nach Aufrufen von LoadLibrary. Beachten Sie, dass SetDllDirectory- den gesamten Prozess beeinflusst und dass mehrere Threads, die SetDllDirectory- mit unterschiedlichen Werten aufrufen, zu einem nicht definierten Verhalten führen können. Wenn Ihre Anwendung DLLs von Drittanbietern lädt, testen Sie sorgfältig, um Inkompatibilitäten zu identifizieren.
Verwenden Sie die SearchPath--Funktion nicht, um einen Pfad zu einer DLL für einen nachfolgenden LoadLibrary Aufruf abzurufen, es sei denn, der Suchmodus für sichere Prozesse ist aktiviert. Wenn der Suchmodus für sichere Prozesse nicht aktiviert ist, verwendet die SearchPath--Funktion eine andere Suchreihenfolge als LoadLibrary- und wird wahrscheinlich zuerst das aktuelle Verzeichnis des Benutzers nach der angegebenen DLL durchsuchen. Um den Suchmodus für sichere Prozesse für die SearchPath--Funktion zu aktivieren, verwenden Sie die SetSearchPathMode--Funktion mit BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Dadurch wird das aktuelle Verzeichnis an das Ende der SearchPath Suchliste für die Lebensdauer des Prozesses verschoben. Beachten Sie, dass das aktuelle Verzeichnis nicht aus dem Suchpfad entfernt wird. Wenn das System also keine legitime Kopie der DLL findet, bevor es das aktuelle Verzeichnis erreicht, ist die Anwendung weiterhin anfällig. Wie bei SetDllDirectory-sollte das Aufrufen SetSearchPathMode- frühzeitig in der Prozessinitialisierung durchgeführt werden und wirkt sich auf den gesamten Prozess aus. Wenn Ihre Anwendung DLLs von Drittanbietern lädt, testen Sie sorgfältig, um Inkompatibilitäten zu identifizieren.
Machen Sie keine Annahmen über die Betriebssystemversion basierend auf einem LoadLibrary Aufruf, der nach einer DLL sucht. Wenn die Anwendung in einer Umgebung ausgeführt wird, in der die DLL legitim nicht vorhanden ist, aber eine schädliche Kopie der DLL sich im Suchpfad befindet, wird die schädliche Kopie der DLL möglicherweise geladen. Verwenden Sie stattdessen die empfohlenen Techniken, die unter Abrufen der Systemversionbeschrieben werden.
Das Tool "Prozessüberwachung" kann verwendet werden, um DLL-Ladevorgänge zu identifizieren, die möglicherweise anfällig sind. Das Prozessmonitor-Tool kann von https://technet.microsoft.com/sysinternals/bb896645.aspxheruntergeladen werden.
Im folgenden Verfahren wird beschrieben, wie Sie den Prozessmonitor verwenden, um DLL-Ladevorgänge in Ihrer Anwendung zu untersuchen.
Verwenden des Prozessmonitors zum Untersuchen von DLL-Ladevorgängen in Ihrer Anwendung
- Prozessüberwachung starten.
- Fügen Sie in der Prozessüberwachung die folgenden Filter ein:
- Operation ist CreateFile
- Operation ist LoadImage
- Pfad enthält .cpl
- Pfad enthält .dll
- Pfad enthält DRV
- Pfad enthält .exe
- Pfad enthält OCX
- Pfad enthält .scr
- Pfad enthält .sys
- Schließen Sie die folgenden Filter aus:
- Prozessname ist procmon.exe
- Prozessname ist Procmon64.exe
- Prozessname ist System
- Der Vorgang beginnt mit IRP_MJ_
- Der Vorgang beginnt mit FASTIO_
- Ergebnis ist ERFOLG
- Pfad endet mit pagefile.sys
- Versuchen Sie, Die Anwendung mit dem aktuellen Verzeichnis zu starten, das auf ein bestimmtes Verzeichnis festgelegt ist. Doppelklicken Sie beispielsweise auf eine Datei mit einer Erweiterung, deren Dateihandler Ihrer Anwendung zugewiesen ist.
- Überprüfen Sie die Ausgabe des Prozessmonitors auf Pfade, die verdächtig aussehen, z. B. einen Aufruf des aktuellen Verzeichnisses, um eine DLL zu laden. Diese Art von Aufruf weist möglicherweise auf eine Sicherheitsanfälligkeit in Ihrer Anwendung hin.