Sicherheit der Dynamic-Link-Bibliothek

Wenn eine Anwendung eine Dynamic Link-Bibliothek dynamisch lädt, ohne einen vollqualifizierten Pfadnamen anzugeben, versucht Windows, die DLL zu suchen, indem es einen klar definierten Satz von Verzeichnissen in einer bestimmten Reihenfolge durchsucht, wie unter Dynamic-Link Library Search Order beschrieben. Wenn ein Angreifer die Kontrolle über eines der Verzeichnisse im DLL-Suchpfad erlangt, kann er eine böswillige Kopie der DLL in diesem Verzeichnis ablegen. Dies wird manchmal als DLL-Preloading-Angriff oder binärer Pflanzangriff bezeichnet. Wenn das System keine legitime Kopie der DLL findet, bevor das kompromittierte Verzeichnis durchsucht wird, lädt es die schädliche DLL. Wenn die Anwendung mit Administratorrechten ausgeführt wird, kann es dem Angreifer gelingen, lokale Rechte zu erhöhen.

Angenommen, eine Anwendung ist so konzipiert, dass sie eine DLL aus dem aktuellen Verzeichnis des Benutzers lädt und ordnungsgemäß fehlschlägt, wenn die DLL nicht gefunden wird. Die Anwendung ruft LoadLibrary nur mit dem Namen der DLL auf, wodurch das System nach der DLL sucht. Unter der Annahme, dass der Suchmodus für sichere DLL aktiviert ist und die Anwendung keine alternative Suchreihenfolge verwendet, durchsucht das System Verzeichnisse in der folgenden Reihenfolge:

  1. Das Verzeichnis, aus dem die Anwendung geladen wurde.
  2. Das Systemverzeichnis
  3. Das 16-Bit-Systemverzeichnis.
  4. Das Windows-Verzeichnis.
  5. Das aktuelle Verzeichnis.
  6. Die Verzeichnisse, die in der PATH-Umgebungsvariablen aufgeführt sind.

Wenn das Beispiel fortgesetzt wird, erhält ein Angreifer mit Kenntnissen der Anwendung die Kontrolle über das aktuelle Verzeichnis und platziert eine böswillige Kopie der DLL in diesem Verzeichnis. Wenn die Anwendung den LoadLibrary-Aufruf ausgibt, sucht das System nach der DLL, sucht die schädliche Kopie der DLL im aktuellen Verzeichnis und lädt sie. Die böswillige Kopie der DLL wird dann innerhalb der Anwendung ausgeführt und erhält die Berechtigungen des Benutzers.

Entwickler können dazu beitragen, ihre Anwendungen vor DLL-Vorabladeangriffen zu schützen, indem sie die folgenden Richtlinien befolgen:

  • Geben Sie nach Möglichkeit einen vollqualifizierten Pfad an, wenn Sie die Funktionen LoadLibrary, LoadLibraryEx, CreateProcess oder ShellExecute verwenden.

  • 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 festzulegen, und verwenden Sie dann die Funktionen AddDllDirectory oder SetDllDirectory , um die Liste zu ändern. Weitere Informationen finden Sie unter Dynamic-Link Library Search Order.For more information, see Dynamic-Link Library Search Order.

    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 ist.

  • Verwenden Sie auf Systemen, auf denen KB2533623 installiert ist, 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 festzulegen, und verwenden Sie dann die Funktionen AddDllDirectory oder SetDllDirectory , um die Liste zu ändern. Weitere Informationen finden Sie unter Dynamic-Link Library Search Order.For more information, see Dynamic-Link Library Search Order.

  • Erwägen Sie die Verwendung der DLL-Umleitung oder eines Manifests , um sicherzustellen, dass Ihre Anwendung die richtige DLL verwendet.

  • Stellen Sie bei Verwendung der Standardsuchreihenfolge sicher, dass der sichere DLL-Suchmodus aktiviert ist. Dadurch wird das aktuelle Verzeichnis des Benutzers später in der Suchreihenfolge platziert, was die Wahrscheinlichkeit erhöht, dass Windows vor einer schädlichen Kopie eine legitime Kopie der DLL findet. Der Suchmodus für sichere DLL ist ab Windows XP mit Service Pack 2 (SP2) standardmäßig aktiviert und wird vom RegistrierungswertHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode gesteuert. Weitere Informationen finden Sie unter Dynamic-Link Library Search Order.For more information, see Dynamic-Link Library Search Order.

  • Erwägen Sie, das aktuelle Verzeichnis aus dem Standardsuchpfad zu entfernen, indem Sie SetDllDirectory mit einer leeren Zeichenfolge ("") aufrufen. Dies sollte einmal früh in der Prozessinitialisierung erfolgen, nicht vor und nach Aufrufen von LoadLibrary. Beachten Sie, dass SetDllDirectory sich auf den gesamten Prozess auswirkt und dass mehrere Threads, die SetDllDirectory mit unterschiedlichen Werten aufrufen, zu nicht definiertem Verhalten führen können. Wenn Ihre Anwendung DlLs von Drittanbietern lädt, testen Sie sorgfältig, um Inkompatibilitäten zu ermitteln.

  • 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 sucht wahrscheinlich zuerst im aktuellen Verzeichnis des Benutzers nach der angegebenen DLL. 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 für die Lebensdauer des Prozesses an das Ende der SearchPath-Suchliste verschoben. Beachten Sie, dass das aktuelle Verzeichnis nicht aus dem Suchpfad entfernt wird. Wenn das System also keine legitime Kopie der DLL findet, bevor sie das aktuelle Verzeichnis erreicht, ist die Anwendung weiterhin anfällig. Wie bei SetDllDirectory sollte der Aufruf von SetSearchPathMode früh in der Prozessinitialisierung erfolgen und wirkt sich auf den gesamten Prozess aus. Wenn Ihre Anwendung DlLs von Drittanbietern lädt, testen Sie sorgfältig, um Inkompatibilitäten zu ermitteln.

  • 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, sich jedoch eine böswillige Kopie der DLL im Suchpfad befindet, kann die böswillige Kopie der DLL geladen werden. Verwenden Sie stattdessen die empfohlenen Techniken, die unter Abrufen der Systemversion beschrieben werden.

Das Prozessmonitortool kann verwendet werden, um DLL-Ladevorgänge zu identifizieren, die anfällig sein könnten. Das Prozessmonitortool kann unter 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.

So verwenden Sie den Prozessmonitor, um DLL-Ladevorgänge in Ihrer Anwendung zu untersuchen

  1. Starten Sie den Prozessmonitor.
  2. Fügen Sie im Prozessmonitor die folgenden Filter ein:
    • Vorgang ist CreateFile.
    • Der Vorgang 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
  3. Schließen Sie die folgenden Filter aus:
    • Prozessname ist procmon.exe
    • Prozessname ist Procmon64.exe
    • Prozessname ist System
    • Vorgang beginnt mit IRP_MJ_
    • Vorgang beginnt mit FASTIO_
    • Ergebnis ist SUCCESS
    • Pfad endet mit pagefile.sys
  4. Versuchen Sie, Ihre 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.
  5. Überprüfen Sie die Ausgabe des Prozessmonitors auf verdächtig erscheinende Pfade, z. B. einen Aufruf des aktuellen Verzeichnisses zum Laden einer DLL. Diese Art von Aufruf kann auf ein Sicherheitsrisiko in Ihrer Anwendung hinweisen.