Skip to content

Shims unter Windows (2) - Die Shim-Infrastruktur und ihre Sicherheit

Was Shims sind haben sie im ersten Teil erfahren. In dieser Folge gibt es einen Überblick über die Shim-Infrastruktur und ihre Sicherheit.

Die Shim-Infrastruktur im Überblick

Die Shim-Infrastruktur (offiziell: "Microsoft Windows Application Compatibility Infrastructure") wurde in erster Linie entwickelt, um vorhandene Programme ohne Änderung auf neuen Windows-Versionen ausführen zu können.

Es bleibt nicht aus, dass die Implementierung von Funktionen geändert wird. Zum Beispiel, weil sie um neue Funktionalitäten erweitert werden, vorhandene Fehler beseitigt wurden oder sie auch einfach nur an neue Regeln angepasst werden. Dadurch ändern sich auch die Aufrufe der Funktionen, was dazu führt, das vorhandene Programme damit nicht mehr kompatibel sind.

Die naheliegende Lösung für dieses Problem wäre, einfach keine Funktionsaufrufe zu ändern. Nur könnte Windows dann auch nicht weiterentwickelt werden. Jedenfalls nicht so einfach, denn die Alternative wäre es, verschiedene Funktionsaufrufe parallel zu unterstützen. Was im Laufe der Zeit zu einem ziemlichen Chaos führen würde.

Mit der Shim-Infrastruktur wird dieses Problem sehr elegant gelöst: Es gibt nur jeweils eine Version der Funktionen und APIs, an die die damit nicht kompatiblen Programme mit Hilfe der Shims angepasst werden. Dadurch sind Änderungen immer nur für einzelne Programme nötig, und bei Bedarf kann sich das sogar nur auf bestimmte Programmversionen beschränken.

Die Shim-Infrastruktur nutzt dabei eine Form von API-Hooking, um API-Aufrufe vom Code in Windows selbst zum Code des Shims umzuleiten. Die Spezifikationen von Windows Portable Executable (PE) und Common Object File Format (COFF) umfassen verschiedene Header, und die "Data Directories" darin stellen eine Trennschicht zwischen dem Programm und verlinkten Dateien dar. Aufrufe an externe Binärdateien, insbesondere Windows, werden durch die Import Address Table (IAT) umgesetzt.

Die Shims sind selbst als DLL implementiert. Beim Einsatz eines Shims wird die IAT so geändert, dass statt der Windows-Funktion der Shim-Code aufgerufen wird, siehe Abbildung 1. Bei statisch verlinkten DLLs wird die Adresse beim Laden des Programms angepasst, bei dynamisch verlinkten DLLs erfolgt die Anpassung durch Einhängen in das GetProcAddress-API.

API-Aufruf ohne und mit Shim
Abb. 1: API-Aufruf ohne und mit Shim

Die Shim-Infrastruktur und die Sicherheit

Auf den ersten Blick sieht das, was die Shims da machen, gefährlich aus. Immerhin mischen sie sich direkt in die Ausführung der Programme ein. Auf den zweiten Blick hat das aber ganz andere Konsequenzen als man anfangs vermuten würde:

Die Umleitung der Codeausführung zum Shim erfolgt vor dem Aufruf der Windows-APIs, der Code im Shim läuft also ebenso wie das Programm selbst außerhalb von Windows. Für den Shim-Code gelten daher die gleichen Einschränkungen wie für den Programm-Code selbst. Oder genauer: Für Windows gehört der Shim-Code zum Programm-Code, siehe die roten Kästen in Abbildung 2.

Der Shim-Code gehört für Windows zum Programm-Code
Abb. 2: Der Shim-Code gehört für Windows zum Programm-Code

Es ist dem Shim-Code deshalb nicht möglich, die Sicherheitsfunktionen von Windows zu umgehen. Nehmen wir als Beispiel die User Account Control (UAC) ab Windows 7.

Der Shim-Code kann nach Belieben so implementiert werden, dass er mit oder ohne Administrator-Rechten läuft. Aber wenn er Admin-Rechte benötigt und die UAC aktiviert ist, muss er sie wie jedes Programm darüber anfordern, und der Benutzer muss der Anforderung zustimmen. Er hat keine reguläre Möglichkeit, die UAC zu unterlaufen und sich selbständig Admin-Rechte zu verschaffen. Bösartiger Shim-Code müsste dafür wie jeder andere Schadcode auch eine entsprechende Schwachstelle ausnutzen.

Die Verwendung von Shims führt also zu keinen zusätzlichen Schwachstellen. Ganz im Gegenteil: Wenn durch den Einsatz eines Shims verhindert wird, dass Sicherheitsbestimmungen gelockert werden müssen, erhöht das sogar die Sicherheit.

So könnte es ohne Shim nötig sein, die ACLs für ein bestimmtes Verzeichnis zu lockern, um Kompatibilitätsprobleme zu beheben. Was die Sicherheit des gesamten Systems schwächt, denn ein Angreifer könnte die unsicheren Einstellungen für seine Zwecke missbrauchen. Über ein Shim könnten die Dateizugriffe zum Beispiel ausschließlich für das betroffene Programm auf ein anderes Verzeichnis umgeleitet werden, und das sogar für jeden Benutzer individuell.

Dann gibt es immer mal wieder Programme, die unbedingt Administrator-Rechte haben wollen damit sie sich ausführen lassen. Obwohl sie die eigentlich gar nicht benötigen. Ohne Shim müssen dem Programm die Admin-Rechte gewährt werden, um die Prüfung darauf zu bestehen. Ein Shim könnte dem Programm einfach vorgaukeln, es hätte die gewünschten Rechte, so dass das Programm auch ohne Admin-Rechte ausgeführt wird. So muss keine Sicherheitslücke geöffnet werden.

Wo Licht ist, ist auch Schatten

Da der Shim-Code als User-Mode-Code im Prozess eines User-Mode-Programms läuft, lassen sich darüber keine Kompatibilitätsprobleme in Kernel-Mode-Code, zum Beispiel in Gerätetreibern, korrigieren. Darüber, ob das wirklich ein Problem ist, lässt sich streiten. Denn wenn Shims auch im Kernel-Mode ausführbar wären, würde das doch ziemliche Sicherheitsprobleme nach sich ziehen. Daher ist es also durchaus begrüßenswert, dass Shims keinen Zugriff auf den Kernel-Mode haben. Wo kämen wir denn da hin, wenn "einfach so" Funktionen im Kernel manipuliert werden könnten? Vor allem, weil die Shim auch im User-Mode bereits missbraucht werden können. Darum geht es in der nächsten Folge.

Carsten Eilers

>
        </div>
                
        <footer class= Kategorien: Grundlagen

Trackbacks

Dipl.-Inform. Carsten Eilers am : Shims unter Windows (4) - Die Ergebnisse der Sicherheitsforscher, Teil 1

Vorschau anzeigen
Sie wissen bereits was Shims sind und wie die Shim-Infrastruktur aufgebaut ist (und wie es theoretisch mit ihrer Sicherheit aussieht). Danach haben Sie erfahren, dass Entwickler die Shims außer in einigen Ausnahmefällen gar nicht ben

Dipl.-Inform. Carsten Eilers am : Shims unter Windows (5) - Die Ergebnisse der Sicherheitsforscher, Teil 2

Vorschau anzeigen
Sie wissen bereits was Shims sind und wie die Shim-Infrastruktur aufgebaut ist (und wie es theoretisch mit ihrer Sicherheit aussieht). Danach haben Sie erfahren, dass Entwickler die Shims außer in einigen Ausnahmefällen gar nicht ben