-
HINTERGRUND
-
Die vorliegende Erfindung betrifft Computersicherheit und konkreter Techniken zum Verwenden eines Seitenrahmenkennzeichen-Mechanismus, um Angriffe mittels rücksprungorientierter Programmierung (ROP-Angriffe) (ROP = return oriented programming) zu entschärfen.
-
Softwareprogramme (oder -anwendungen) können in einigen Fällen gegenüber verschiedenen Arten von Exploit anfällig sein. Diese Exploits können z.B. zur Injektion in ein und Ausführung von böswilligem Code in einem Programm eine Berechtigungseskalation ermöglichen, die es dem Programm ermöglicht, Aktionen durchzuführen, die normalerweise durch Systemadministratoren eingeschränkt sein können, Daten abzugreifen und dergleichen. Einige dieser Exploits können unberechtigten Benutzern ermöglichen, auf Daten auf einem Computersystem zuzugreifen und diese Daten auszuschleusen.
-
Bei einem üblichen Exploit erfolgt ein Angreifen des Ausführungsablaufs eines Programms, indem der Aufruf-Stack abgeändert wird. Bei dem Aufruf-Stack handelt es sich zum Beispiel um eine wesentliche Datenstruktur, die während der gesamten Ausführung von Anwendungen verwendet und aufrechterhalten wird. Der Ausführungsablauf (eines Programms) kann gesteuert werden, indem die Rücksprungadressen der aufgerufenen Funktionen mit Hilfe einer Push-Operation zum Stack übertragen werden. Böswillige Akteure können daher den Aufruf-Stack manipulieren, um die Ausführung eines Programms umzuleiten, um frei wählbaren Code auszuführen. ROP ist ein Beispiel eines häufig genutzten Exploits, der ein Abändern des Aufruf-Stacks zur Folge hat. Bei einem ROP-Exploit verwendet ein böswilliger Akteur normalerweise mehrere Teile von bestehendem Code (die üblicherweise als „Grafikobjekte“ (Gadgets) bezeichnet werden), um einen Bedienoberflächencode (Shell-Code) auszuführen. Zum Beispiel kann der böswillige Akteur die Rücksprungadresse in dem Stack manipulieren, um Gadget auszuführen, indem der Wert der Rücksprungadresse durch den der Adresse für das Gadget ersetzt wird. Im verketteten Zustand ermöglichen diese Aktionen dem böswilligen Akteur ein Durchführen frei wählbarer Operationen, die den Ausführungsablauf des Programms beeinträchtigen.
-
Herkömmliche Techniken, die zum Verteidigen gegenüber ROP-Techniken verwendet werden, schließen die Realisierung einer zufälligen Gestaltung des Adressraumlayouts oder von Steuerungsablauf-Integritätssystemen ein. Die zufällige Gestaltung des Adressraumlayouts schließt zum Beispiel ein Anordnen der Adressraumpositionen von Datenbereichen von Prozessen ein, um einen Angreifer daran zu hindern, ungehindert zu Exploit-befallenen Funktionen im Speicher zu springen. Steuerungsablauf-Integritätssysteme nutzen üblicherweise Techniken, zu denen ein Verhindern gehört, dass der Steuerungsablauf selbst von dem Exploit befallen wird. Diese herkömmlichen Techniken sind jedoch mit einem hohen Laufzeitaufwand, eingeschränktem Hypervisor-Support usw. verbunden. Darüber hinaus kann das Realisieren dieser Techniken zu einem arbeitsintensiven Neuordnen des Codes in einem erheblichen Umfang führen.
-
KU RZDARSTELLU NG
-
Eine hierin vorgestellte Ausführungsform beschreibt ein Verfahren zum Entschärfen eines Angriffs mittels rücksprungorientierter Programmierung (ROP-Angriffs), der während der Ausführung einer Anwendung erfolgt. Das Verfahren umfasst allgemein ein Empfangen von Quellcode zum Kompilieren in eine ausführbare Anwendung. Das Verfahren umfasst außerdem während einer Kompilierung des Quellcodes ein Ermitteln einer oder mehrerer Funktionen innerhalb des Quellcodes, die den Gadgets in einem ROP-Angriff zugehörig sind, und ein Zuweisen einer jeden der einen oder mehreren Funktionen zu einer oder mehreren geschützten Seiten des Hauptspeichers für die ausführbare Anwendung. Das Verfahren umfasst ferner während der Kompilierung des Quellcodes ein Zuweisen eines Kennzeichens zu jeder der einen oder mehreren Funktionen. Das Kennzeichen für jede Funktion ist der geschützten Hauptspeicherseite zugeordnet, der die Funktion zugewiesen ist.
-
Andere Ausführungsformen umfassen, ohne auf diese beschränkt zu sein, ein Computerprogrammprodukt, das ein Speichermedium umfasst, das durch einen Computer lesbaren Programmcode enthält, der einer Verarbeitungseinheit ermöglicht, einen oder mehrere Aspekte der offenbarten Verfahren zu realisieren, sowie ein Datenverarbeitungssystem, das einen Prozessor, einen Hauptspeicher und Anwendungsprogramme enthält, die so konfiguriert sind, dass sie eines oder mehrere der offenbarten Verfahren realisieren.
-
Figurenliste
-
Im Folgenden werden Ausführungsformen der Erfindung lediglich beispielhaft beschrieben, wobei auf die beigefügten Zeichnungen Bezug genommen wird, in denen:
- 1 ein beispielhaftes Datenverarbeitungssystem veranschaulicht, das mit einer Schutzkomponente gemäß einer Ausführungsform konfiguriert ist.
- 2 eine beispielhafte Realisierungsform eines Hauptspeicher-Schutzschlüsselmechanismus innerhalb eines Datenverarbeitungssystems gemäß einer Ausführungsform veranschaulicht.
- 3 ein Beispiel eines Angriffs mittels rücksprungorientierter Programmierung gemäß einer Ausführungsform veranschaulicht.
- 4 ein Flussdiagramm eines Verfahrens zum Entschärfen eines Angriffs mittels rücksprungorientierter Programmierung gemäß einer Ausführungsform ist.
- 5 ein Beispiel von Funktionen veranschaulicht, die gemäß einer Ausführungsform geschützten Seitenrahmen zugeordnet sind.
- 6 ein Beispiel des Entschärfens eines ROP-Angriffs auf eine Anwendung gemäß einer Ausführungsform veranschaulicht.
- 7 ein Flussdiagramm eines Verfahrens zum Ausführen einer Anwendung gemäß einer Ausführungsform ist.
- 8 ein beispielhaftes Datenverarbeitungssystem veranschaulicht, das so konfiguriert ist, dass es einen ROP-Angriff auf eine Anwendung gemäß einer Ausführungsform entschärft.
-
Zur Erleichterung des Verständnisses wurden, soweit möglich, identische Bezugsnummern verwendet, um in den Zeichnungen vorkommende identische Elemente zu bezeichnen. Es ist beabsichtigt, dass Elemente und Merkmale einer Ausführungsform ohne weiteren Vortrag vorteilhaft in andere Ausführungsformen einbezogen werden können.
-
AUSFÜHRLICHE BESCHREIBUNG
-
Hierin beschriebene Ausführungsformen stellen Verfahren, Verarbeitungssysteme und durch einen Computer lesbare Medien zum Verwenden eines Seitenrahmenkennzeichen-Mechanismus bereit, der in Hardware innerhalb eines Datenverarbeitungssystems unterstützt wird, um Angriffe mittels rücksprungorientierter Programmierung (ROP-Angriffe) auf Softwareanwendungen zu entschärfen.
-
Zum Beispiel können einige Datenverarbeitungssysteme ein Hauptspeicher-Schutzschlüsselmerkmal unterstützen, das es ermöglicht, Hauptspeicherseiten Schutzschlüssel zu Zugriffssteuerungszwecken zuzuweisen. Im aktivierten Zustand dieses Merkmals kann ein Satz von Bits (z.B. vier Bits) in jedem Seitentabelleneintrag verwendet werden, um einer bestimmten Seite einen eines Satzes von (z.B. sechszehn) Schlüsselwerten zuzuweisen. Diese Schlüsselwerte können zum Durchsetzen von Schutzmaßnahmen auf der Grundlage von Seiten verwendet werden. Zum Beispiel kann ein Datenverarbeitungssystem, das dieses Merkmal unterstützt, ein Register mit zwei Bits für jeden Schlüsselwert verwenden, um Schreib- und Leseversuche auf eine bestimmte Seite zu steuern. Ein Setzen des Bits „Schreiben deaktivieren“ für einen bestimmten Schlüssel blockiert Versuche, auf eine Seite mit diesem Schlüsselwert zu schreiben. In ähnlicher Weise blockiert ein Setzen des Bits „Zugriff deaktivieren“ für einen bestimmten Schlüssel Versuche, eine Seite mit diesem Schlüsselwert zu lesen.
-
Hierin beschriebene Ausführungsformen können das Hauptspeicher-Schutzschlüsselmerkmal (das normalerweise zum Durchsetzen von Schutzmaßnahmen auf der Grundlage von Seiten verwendet wird) innerhalb eines Datenverarbeitungssystems vorteilhaft nutzen, um ROP-Angriffe zu entschärfen. Konkreter können Ausführungsformen das Hauptspeicher-Schutzschlüsselmerkmal verwenden, um jeder Funktion in geschützten Seitenrahmen Kennzeichen zuzuweisen, sodass das Programm in einer bestimmten Reihenfolge ausgeführt wird und abläuft. Bei einer nachstehend ausführlicher beschriebenen Ausführungsform kann ein Compiler während der Kompilierungszeit von Quellcode einen Satz von Funktionen innerhalb des Quellcodes erkennen, die ROP-Angriffen zugehörig sind (z.B. Hochrisiko-Funktionen, die anfällig dafür sind, als Gadgets in einem ROP-Angriff verwendet zu werden), den erkannten Satzfunktionen geschützten Seitenrahmen zuweisen (die z.B. mit einem Hauptspeicher-Schutzschlüssel geschützt sind) und jeder Funktion ein Kennzeichen zuweisen. Indem Hochrisiko-Funktionen auf diese Weise geschützten Seitenrahmen zugewiesen werden, können Ausführungsformen Exploits entschärfen, die versuchen, die Ausführung des Programms abzuändern. Zum Beispiel können Ausführungsformen einen böswilligen Akteur daran hindern, von Gadgets zu profitieren, um einen ROP-Angriff aufzubauen, da ein unter Verwendung der hierin vorgestellten Techniken geschütztes Programm nicht ausgeführt wird, wenn eine aufgerufene markierte Funktion ein falsches Kennzeichen hat.
-
1 veranschaulicht ein beispielhaftes Datenverarbeitungssystem 100 gemäß einer Ausführungsform, das mit einer Schutzkomponente 110 konfiguriert ist. Das Datenverarbeitungssystem 100 umfasst eine oder mehrere Anwendungen 102, einen Compiler 104, ein Betriebssystem 106 und Hardware 108. Das Datenverarbeitungssystem 100 steht für verschiedene Datenverarbeitungseinheiten, unter anderem zum Beispiel für einen Desktop-Computer, einen Notebook-Computer, eine mobile Einheit, einen Tablet-Computer usw. Die Hardware 108 umfasst einen Prozessor/Prozessoren 120 und einen Hauptspeicher 122. Der/die Prozessor/en 120 kann/können für einen oder mehrere Prozessoren (z.B. Mikroprozessoren, Zentraleinheiten (CPUs) usw.) oder Mehrkernprozessoren stehen. Der/die Prozessor/en 120 kann/können verschiedene Register, Puffer, Hauptspeicher und andere, durch integrierte Schaltungen gebildete Einheiten umfassen und können gemäß RISC-Datenverarbeitungstechniken (RISC = reduced instruction set) arbeiten. Der Hauptspeicher 122 kann eine Vielfalt von durch einen Computer lesbaren Medien umfassen, unter anderem zum Beispiel flüchtige und/oder nichtflüchtige Medien, wechselbare und/oder nichtwechselbare Medien usw. Der Hauptspeicher 122 kann einen oder mehrere Caches, Direktzugriffsspeicher, Nur-Lese-Speicher usw. umfassen. Darüber hinaus kann der Hauptspeicher 122 Hauptspeicher umfassen, der sich physisch in dem Datenverarbeitungssystem 100 oder auf einer anderen Datenverarbeitungseinheit befindet, die mit dem Datenverarbeitungssystem 100 verbunden ist.
-
Das Datenverarbeitungssystem 100 arbeitet unter der Steuerung des Betriebssystems 106, das zum Ausführen von Anwendungen 102 und zum Verwalten des Zugriffs der Anwendungen 102 auf Hardware 108 zuständig ist. Das Betriebssystem 106 steht allgemein für ein beliebiges Betriebssystem, wobei zu Beispielen unter anderem Versionen von Microsoft® Windows®, Linux®- und Unix®-Distributionen usw. gehören. Wie gezeigt umfasst das Betriebssystem 106 eine Systemaufrufschnittstelle 116 und eine Seitenrahmen-Zuordnungsfunktion 118, die sich in dem Kern 114 des Betriebssystems 106 befinden. Die Anwendung/en 102 kann/können über die Systemaufrufschnittstelle 116 Dienste aus dem Betriebssystem 106 anfordern (z.B. Systemaufrufe vornehmen). Die Anforderung in Bezug auf Dienste kann eine Anforderung bezüglich eines oder mehrerer Prozesse, Anforderungen zur Erstellung und Ausführung neuer Prozesse, Anforderungen bezüglich des Zugriffs auf verschiedene Hardwareeinheiten (z.B. bestimmte Peripherieeinheiten usw.), Anforderungen bezüglich Datenübertragungsdiensten und andere umfassen. Die Anwendung 102 kann als Satz von Anweisungen realisiert sein, die im Hauptspeicher 122 gespeichert sind, und der/die Prozessor/en 120 kann/können so konfiguriert sein, dass er/sie die Anweisungen ausführt/ausführen, um eine angegebene Aufgabe oder eine Reihe von Aufgaben durchzuführen. Die Seitenrahmen-Zuordnungsfunktion 118 kann Hauptspeicher zu Anwendungsprozessen auf der Grundlage ihres Bedarfs zuordnen und/oder diese Zuordnungen aufheben. Bei einer Ausführungsform kann die Seitenrahmen-Zuordnungsfunktion 118 eine Liste freier Seiten des realen Hauptspeichers aufrechterhalten, aus denen sie die den Anwendungsprozessen zuordnen kann.
-
Bei hierin beschriebenen Ausführungsformen unterstützt das Datenverarbeitungssystem 100 einen Hauptspeicher-Schutzschlüsselmechanismus, der es ermöglicht, dass zu Zugriffssteuerungszwecken ein oder mehrere Schutzschlüssel (protection keys, pkeys) 124 zu Hauptspeicherseiten zugewiesen werden (z.B. durch die Seitenrahmen-Zuordnungsfunktion 118 zugeordnet). Unter Verwendung dieses Mechanismus kann eine bestimmte Anwendung (oder ein bestimmter Prozess) 102 seinen/ihren Hauptspeicher in mehrere Bereiche konfigurieren und den Zugriff auf beliebige dieser Bereiche selektiv deaktivieren oder aktivieren. Zum Beispiel handelt es sich bei einem Schutzschlüssel 124 im Allgemeinen um einen Mehrbitwert (z.B. vier Bits), die in jedem Seitentabelleneintrag für jede Seite in einem Adressraum einer Anwendung gespeichert sein können. Somit können unter der Annahme, dass es sich bei einem Schutzschlüssel 124 um einen Vier-Bit-Wert handelt, Seiten einem von sechzehn Schlüsselwerten zugewiesen werden. Für jeden dieser Schlüssel kann die Anwendung 102 den/die Prozessor/en 120 so konfigurieren, dass er/sie Schreiboperationen oder Leseoperationen in Bezug auf die jeweiligen Hauptspeicherseiten verweigert/verweigern, die durch den Schlüssel geschützt sind. Bei einem Beispiel kann eine Anwendung 102 über die Systemaufrufschnittstelle 116 einen Schutzschlüssel 124 mit einem Systemaufruf „pkey_alloc()“ beziehen, der einen Ganzzahlindex zurückgibt, der angibt, welcher Schlüssel zugeordnet wurde. Die Anwendung 102 kann über die Systemaufrufschnittstelle 116 mit einem Systemaufruf „pkey_mprotect()“ einer bestimmten Seite einen Schlüssel zuweisen. Die Anwendung 102 kann den Systemaufruf „pkey_free()“ verwenden, um einen Schutzschlüssel zuzuordnen oder freizugeben, um ihn für spätere Zuordnungen verfügbar zu machen.
-
2 veranschaulicht eine beispielhafte Realisierungsform des Hauptspeicher-Schutzschlüsselmechanismus gemäß einer Ausführungsform. Hierbei umfasst die Seitenrahmen-Zuordnungsfunktion 118 eine Seitentabelle 202 und ein Register 204 mit Schutzschlüsselrechten für Benutzerseiten (PKRU-Register) (PKRU = protection key rights for user pages). Die Seitentabelle 202 umfasst einen oder mehrere Seitentabelleneinträge 206, von denen jedem ein Schutzschlüssel 124 zugewiesen sein kann. Bei dem PKRU-Register 204 handelt es sich um ein Steuerregister, das für rigiden Schutzschlüssel 124 zwei getrennte Bits umfasst (z.B. ein Zugriffsdeaktivierungsbit und ein Schreibdeaktivierungsbit). Bei diesem Beispiel umfasst das PKRU-Register 204 zwei getrennte Bits für einen ersten Schutzschlüssel 124A („foo“) und einen zweiten Schutzschlüssel 124B („bar“).
-
Das PKRU-Register 204 kann für jeden Schutzschlüssel 124 bestimmen, ob auf die Hauptspeicherseite (des Seitentabelleneintrags 206), die diesem Schutzschlüssel 124 zugehörig ist, zugegriffen (z.B. von dieser gelesen oder auf diese geschrieben) werden kann. Bei diesem bestimmten Beispiel umfasst der Seitentabelleneintrag 206 ein Schutzschlüsselfeld 208 für einen Schutzschlüssel 124, das für Benutzerebenenseiten (z.B. U/S = 1) gilt. Der Schutzschlüssel 124 innerhalb des Schutzfeldes 208 wird als Index auf das PKRU 204 verwendet. Zugriffsberechtigungen auf die Hauptspeicherseiten werden anschließend auf der Grundlage bisheriger Seitenberechtigungen (aus dem Seitentabelleneintrag 206) und der PKRU-Berechtigungen für den Schutzschlüssel 124 (der dem Seitentabelleneintrag 206 zugehörig ist) ermittelt. Wenn zum Beispiel die PKRU-Berechtigungen den Zugriff auf eine bestimmte Hauptspeicherseite verweigern, kann der Anwendung 102 der Zugriff auf diese Hauptspeicherseite verweigert werden. In ähnlicher Weise können direkte Hauptspeicherzugriffe auf diese Hauptspeicherseite aus dem Kern 114 ebenfalls zurückgewiesen werden.
-
Unter erneuter Bezugnahme auf 1 kann der Compiler 104 im Allgemeinen Quellcode aus einer höheren Programmiersprache (z.B. C, C+ usw.) in eine Sprache einer unteren Ebene (z.B. Assemblercode, Objektcode, Maschinencode usw.) übersetzen, um ein ausführbares Programm (z.B. Anwendung 102) zu erstellen. Zu beachten ist, dass in 1 der Compiler 104 zwar innerhalb des Datenverarbeitungssystems 100 dargestellt ist, der Compiler 104 sich bei anderen Ausführungsformen jedoch innerhalb eines weiteren Datenverarbeitungssystems befinden kann. Bei einigen Ausführungsformen kann sich der Compiler 104 in einem Datenverarbeitungssystem befinden, das in einer Cloud-Computing-Umgebung (nicht gezeigt) gehostet wird. Bei einigen Ausführungsformen kann die Anwendung 102 von Funktionen Gebrauch machen, die entweder in das Programm selbst oder als Teil einer Bibliothek (z.B. C-Bibliothek (Iibc)) codiert sind, das/die in dem Hauptspeicher 122 gespeichert ist. Funktionen können innerhalb von Anwendungen 102 (oder Programmen) oder getrennt in Bibliotheken definiert sein, die durch mehrere Anwendungen verwendet werden können. Eine Funktion ist oftmals so codiert, dass sie während der Ausführung einer Anwendung 102 mehrmals und von verschiedenen Orten aus gestartet oder aufgerufen werden kann, unter anderem von anderen Funktionen, und dann zur nächsten Anweisung nach dem Aufruf zurückverzweigen oder zurückspringen kann, sobald die Aufgabe ausgeführt ist. Eine Funktion kann auch als Prozedur, Unterroutine, Routine, Methode, Unterprogramm usw. bezeichnet werden.
-
Ein Prozessor 120 kann einen Aufruf-Stack verwenden, um Funktionsaufrufe und -rücksprünge zu realisieren. Zum Beispiel erstellt jeder Funktionsaufruf einen neuen Eintrag oder Stack-Rahmen an einem Ende des Stacks. Wenn die Funktion zurückspringt, wird der Stack-Rahmen aus dem Stack gelöscht, und der Platz kann für andere Funktionsaufrufe verwendet werden. Jeder Stack-Rahmen kann die privaten Daten (z.B. Parameter und interne Variablen) der entsprechenden Aufruf- und Rücksprungadresse (z.B. die Adresse der Anweisung nach dem Aufruf) umfassen. Ein Aufruf-Stack dient zum Nachverfolgen des Punkts, bis zu dem jede aktive Funktion die Steuerung zurückgeben sollte, wenn sie das Ausführen beendet. Bei einer aktiven Funktion handelt es sich zum Beispiel um eine, die aufgerufen wurde, aber die Ausführung noch nicht beendet hat, wonach die Steuerung an den Punkt des Aufrufs oder an die aufrufende Funktion zurückgegeben werden sollte.
-
Eine Funktion kann außerdem einen Funktionsprolog und einen Funktionsepilog umfassen, die den Rumpf der Funktion umschließen und zum Manipulieren des Stacks verwendet werden können. Zum Beispiel steht der Funktionsprolog am Anfang der Funktionen und bereitet den Stack und die Register zur Verwendung innerhalb der Funktion vor. In ähnlicher Weise steht der Funktionsepilog am Ende der Funktion und stellt den Stack und die Register wieder in den Zustand her, in dem sie sich befanden, bevor die Funktion aufgerufen wurde. Der Funktionsepilog umfasst normalerweise den Funktionsaustrittspunkt oder die Rücksprunganweisung wie z.B. „ret“ in x86-Assemblersprache.
-
Wie angemerkt verwendet ein böswilliger Akteur bei einem ROP-Angriff oftmals mehrere Gadgets, um den Aufruf-Stack zu manipulieren und die Programmausführung zu verändern. Im hierin verwendeten Sinne bezeichnet ein Gadget eine Abfolge von Anweisungen, die eine Operation für ein rücksprungorientiertes Programm bereitstellt. Jedes Gadget kann mit einer Rücksprunganweisung (z.B. x86-Anweisung RET) enden. Zum Beispiel handelt es sich bei „move eax. 10: ret“ um ein Gadget, das eax auf 10 (dezimal) setzt. Bei den Gadgets handelt es sich normalerweise um Abfolgen von Anweisungen, die im Hauptspeicher (z.B. im Adressraum) der Anwendung 102 zu finden sind. Bei einer beispielhaften Quelle eines derartigen Gadgets handelt es sich um eine Bibliothek wie z.B. libc, die für die Anwendung 102 zugänglich ist. Böswillige Akteure können durch Analysieren des Binärcodes von Programmen oder Bibliotheken eines Betriebssystems oftmals die Abfolgen von Anweisungen erkennen, die als Gadgets verwendet werden können. Im Allgemeinen kann eine beliebige Anweisungsabfolge, die mit einer Zieladresse endet, die während der Laufzeit ermittelt werden kann, wie z.B. eine Rücksprunganweisung, möglicherweise als Gadget verwendet werden. Zu Beispielen häufig verwendeter Gadgets gehören Gadgets, die Daten von einem Ort auf einen anderen speichern und laden (z.B. Register zu Register, Register zum Hauptspeicher, Hauptspeicher zum Register usw.), Gadgets, die arithmetische Operationen durchführen (z.B. ADD, SUB, MUL, DIV XOR, Drehungen, Verschiebungen usw.) usw.
-
In einigen Fällen kann ein böswilliger Akteur den ROP-Angriff in Form eines rücksprungorientierten Programms ausführen. Das rücksprungorientierte Programm kann zum Beispiel ein oder mehrere Gadgets umfassen, die in einer bestimmten Reihenfolge angeordnet sind, sodass sie bei Ausführung das beabsichtigte Verhalten des böswilligen Akteurs verwirklichen. Eine Nutzlast bei den Gadgets kann im Hauptspeicher der ausgenutzten Anwendungen (z.B. Anwendung 102) abgelegt werden, und der Stack-Zeiger kann so umgeleitet werden, dass er auf das erste Gadget zeigt. Bei einem Beispiel kann dies mit einem Pufferüberlauf des Stacks erreicht werden. Die Gadget-Rahmen werden normalerweise in dem übergelaufenen Stack abgelegt, sodass das erste Gadget den gespeicherten Anweisungszeiger einer bestimmten Funktion überschrieben hat. Wenn diese Funktion zurückzuspringen versucht, wird stattdessen das rücksprungorientierte Programm ausgeführt. Jedes Gadget in dem rücksprungorientierten Programm ist so aufgebaut, dass, wenn die Rücksprunganweisung in der letzten Anweisung der Abfolge ausgeführt wird, der Stack-Zeiger auf das nächste auszuführende Gadget zeigt. Auf diese Weise führt das rücksprungorientierte Programm ein Gadget nach dem anderen aus, wodurch der beabsichtigte Ausführungsablauf der Anwendung 102 verändert wird.
-
3 veranschaulicht ein Referenzbeispiel eines ROP-Angriffs gemäß einer Ausführungsform. Bei diesem Referenzbeispiel startet die Anwendung 102 bei 302 und wartet bei 304 auf Benutzereingaben (z.B. kann die Anwendung 102 eine Funktion aufrufen, die Benutzereingaben erfordert). Hierbei kann die Anwendung 102 bei 304 eine bekannte Schwachstelle enthalten (z.B. ist die Anwendung gegenüber einem Pufferüberlauf in dem Aufruf-Stack anfällig). Bei 306 nutzt ein böswilliger Akteur diese Schwachstelle aus und überschreibt den Stack 350 mit frei wählbaren Daten. Wie gezeigt überschreibt in diesem Fall der Pufferüberlauf die Rücksprungadresse der aufgerufenen Funktion und nachfolgende Stack-Bereiche mit Hauptspeicheradressen von Interesse.
-
Bei 308 wird die Ausführung der Anwendung 102 fortgesetzt und bei 310 springt die aktuelle Funktion zurück. Anstelle des Zurückspringens zu der vorherigen Rücksprungadresse, die der aktuellen Funktion zugehörig ist, springt die Anwendung 102 jedoch zu der Adresse eines ersten Gadgets (innerhalb der Bibliothek 360, die sich im Hauptspeicher der Anwendung 102 befindet) und führt bei 312 Anweisungen aus, die dem ersten Gadget zugehörig sind. Wenn die Rücksprunganweisung des ersten Gadgets ausgeführt wird, springt die Anwendung 102 zu der Adresse eines zweiten Gadgets (innerhalb der Bibliothek 360) und führt bei 314 Anweisungen aus, die dem zweiten Gadget zugehörig sind. Wenn die Rücksprunganweisung des zweiten Gadgets ausgeführt wird, springt die Anwendung 102 zu der Adresse eines dritten Gadgets (innerhalb der Bibliothek 360) und führt bei 316 Anweisungen aus, die dem dritten Gadget zugehörig sind. Bei diesem Prozess wird jedes Gadget über eine Rücksprungfunktion (z.B. ret) aufgerufen, und dieses Gadget endet mit einer Rücksprungfunktion, die auf das nächste Gadget zeigt. Der böswillige Akteur kann die Argumente der Gadgets innerhalb der Bibliothek 360 über den Stack 350 übergeben.
-
Dieser Prozess kann auf diese Weise fortgesetzt werden, bis der böswillige Akteur sein Ziel erreicht hat. Zum Beispiel kann ein böswilliger Akteur diesen ROP-Angriff verwenden, um der Funktionsausführung eine frei wählbare Reihenfolge aufzuzwingen, um Türen zu öffnen (z.B. Öffnen einer Root-Shell unter Unix), die durch den böswilligen Akteur ausgenutzt werden können. Ferner kann der in 3 dargestellte ROP-Angriff realisiert werden, ohne neuen Code zu injizieren. Das heißt, der ROP-Angriff verwendet erneut Funktionen aus einer Bibliothek (der Bibliothek 360 wie z.B. libc) im Hauptspeicher und übergibt frei wählbare Parameter an die Funktionen in dem Stack 350.
-
Hierin beschriebene Ausführungsformen stellen Techniken bereit, die ROP-Angriffe wie z.B. den in 3 dargestellten ROP-Angriff entschärfen können, indem der (z.B. in 2 dargestellte) Hauptspeicher-Schutzschlüsselmechanismus genutzt wird, der durch das Datenverarbeitungssystem 100 unterstützt wird. Unter erneuter Bezugnahme auf 1 umfasst der Compiler 104 eine Schutzkomponente 110, die so konfiguriert ist, dass sie eine oder mehrere hierin beschriebene Techniken zum Entschärfen von ROP-Angriffen realisiert. Zu beachten ist, dass 1 lediglich eine mögliche Anordnung des Datenverarbeitungssystems 100 veranschaulicht und dass andere Anordnungen von Datenverarbeitungssystemen verwendet werden können, um die hierin beschriebenen Techniken zu realisieren. Zum Beispiel kann sich der Compiler 104 bei einer Ausführungsform auf einem weiteren Datenverarbeitungssystem befinden und Quellcode unter Verwendung der hierin beschriebenen Techniken zur Ausführung durch das Datenverarbeitungssystem 100 kompilieren.
-
Bei einer Ausführungsform kann die Schutzkomponente 110 CPU-Anweisungen einer Anwendung 102 mit einem oder mehreren Schutzschlüsseln 124 während der Kompilierungszeit schützen, um die Anwendung 102 vor ROP-Angriffen zu schützen, wenn sie auf dem Datenverarbeitungssystem 100 ausgeführt wird. Zum Beispiel kann die Schutzkomponente 110 beim Kompilieren von Quellcode einer Anwendung 102 „Hochrisiko“-Funktionen zuordnen, die anfällig dafür sind, als Gadgets für Seitenrahmen innerhalb des Hauptspeichers 122 verwendet zu werden, die mit einem oder mehreren Schutzschlüsseln 124 geschützt sind. Bei einer Ausführungsform kann die Schutzkomponente 110 auf der Grundlage einer vorkonfigurierten Liste von Funktionen, die von einem Entwickler (z.B. einem Entwickler der Anwendung 102) empfangen wurde, feststellen, dass es sich um eine „Hochrisiko“-Funktion handelt.
-
Beim Kompilieren des Quellcodes kann die Schutzkomponente 110 außerdem einer jeden der „Hochrisiko“-Funktionen, die mit einem bestimmten Schutzschlüssel 124 geschützt sind, ein Schutzkennzeichen 112 zuweisen. Jedes Schutzkennzeichen 112 ist einem bestimmten Seitenrahmen zugehörig, der mit einem Schutzschlüssel 124 geschützt ist. Bei einer nachstehend ausführlicher beschriebenen Ausführungsform kann die Schutzkomponente 110 die Schutzkennzeichen 112 verwenden, um die ordnungsgemäße Ausführungsreihenfolge der Funktionen innerhalb des Quellcodes der Anwendung 102 zu definieren, sodass Funktionen der Anwendung 102 nur ausgeführt werden, wenn der Seitenrahmen, in dem sich die Funktion befindet, die ordnungsgemäße Kennzeichenreihenfolge enthält.
-
4 ist ein Flussdiagramm eines Verfahrens 400 zum Entschärfen von ROP-Angriffen gemäß einer Ausführungsform. Das Verfahren 400 kann durch einen Compiler (z.B. Compiler 104) durchgeführt werden. Bei einer Ausführungsform kann das Verfahren 400 während der Kompilierungszeit (z.B. vor der Laufzeit oder Ausführung) der Anwendung 102 durchgeführt werden.
-
Das Verfahren 400 kann bei Block 402 in den Ablauf eintreten, bei dem der Compiler die Aufbauphase (build-phase) startet. Bei Block 404 erkennt der Compiler eine Art einer oder mehrerer Funktionen innerhalb des Quellcodes. Bei Block 406 ermittelt der Compiler, bei welchen Arten von Funktionen des Quellcodes es sich um „Hochrisiko“-Funktionen handelt, die anfällig dafür sind, als Gadgets verwendet zu werden. Zu Beispielen von „Hochrisiko“-Funktionen können Funktionen gehören, die anfällig für Pufferüberlauf-Angriffe sind (z.B. Kopierfunktionen, Verschiebefunktionen usw.). Bei einer Ausführungsform kann der Compiler einen Satz von „Hochrisiko“-Funktionen auf der Grundlage einer vorgegebenen Liste derartiger Funktionen ermitteln, die von einem Entwickler empfangen wurde. Bei einer weiteren Ausführungsform kann der Compiler zum Ermitteln des Satzes von „Hochrisiko“-Funktionen dem Quellcode zugehörige Informationen (z.B. einen Satz von Entwicklerrichtlinien) analysieren oder auswerten, die von einem Entwickler des Quellcodes empfangen wurden. Zum Beispiel können die Entwicklerrichtlinien angeben, welche Arten von Funktionen unterschiedlichen Seitenrahmen zugeordnet werden sollten, um die Funktionen davor zu schützen, bei einem ROP-Angriff als Gadgets verwendet zu werden.
-
Bei Block 408 löst der Compiler die Zuweisung einer jeden des Satzes von „Hochrisiko“-Funktionen zu einem oder mehreren Seitenrahmen aus, die mit einem oder mehreren Schutzschlüsseln 124 geschützt sind. Bei einer Ausführungsform kann der Compiler die Zuweisung durch Anweisen (oder Anfordern) einer Seitenrahmen-Zuweisungsfunktion (z.B. Seitenrahmen-Zuweisungsfunktion 118) auslösen, um den Satz von „Hochrisiko“-Funktionen einem oder mehreren Seitenrahmen zuzuordnen, die mit einem oder mehreren Schutzschlüsseln 124 geschützt sind. Nach dem Zuweisen weist der Computer jeder Funktion in dem Satz von „Hochrisiko“-Funktionen ein Schutzkennzeichen 112 zu (Block 410). Bei einer Ausführungsform kann der Compiler einen Systemaufruf (z.B. pkey_alloc_flag()) über die Systemaufrufschnittstelle 116 verwenden, um jedes Schutzkennzeichen 112 zuzuweisen. Die Zuweisung eines Schutzkennzeichens 112 zu einer bestimmten Funktion modifiziert den Funktionsprolog und den -epilog, sodass diese das Schutzkennzeichen 112 umfassen. Der Compiler gibt die Reihenfolge an, in der die Funktionen in dem Quellcode über den Satz von Schutzkennzeichen 112 auszuführen sind. Sobald die Schutzkennzeichen 112 zugewiesen sind, kann der Compiler den Aufbauprozess beenden (Block 412), und das Verfahren 400 endet.
-
5 veranschaulicht ein Beispiel von Funktionen, die Seitenrahmen zugeordnet sind, die gemäß einer Ausführungsform mit Schutzschlüsseln 124 geschützt sind. Bei dieser Ausführungsform weist der Compiler 104 drei unterschiedliche Funktionen, A(), B() und C(), drei unterschiedlichen Seitenrahmen 502A, 502B bzw. 502C zu. Jeder Seitenrahmen 502A, 502B und 502C ist durch einen jeweiligen Schutzschlüssel 124A, 124B und 124C geschützt. Wie gezeigt weist der Compiler 104 außerdem den Funktionen A(), B() und C() Schutzkennzeichen 112A, 112B bzw. 112C zu. Jedes Schutzkennzeichen 112 ist einem der Schutzschlüssel 124 zugeordnet. Wie angemerkt kann der Compiler 104 den Satz von Schutzkennzeichen 112 verwenden, um zu steuern, welche Funktionen der Anwendung 102 ausgeführt werden, und/oder die Reihenfolge zu definieren, in der die „Hochrisiko“-Funktionen der Anwendung 102 ausgeführt werden. Da der Compiler 104 die Reihenfolge berechtigter Funktionen mit den Schutzschlüsseln 124 verarbeitet, können zum Beispiel die Funktionen nur ausgeführt werden, wenn jeder Seitenrahmen die ordnungsgemäße Kennzeichenreihenfolge hat. Auf diese Weise kann, wenn ein böswilliger Akteur die Funktionsaufruf-Reihenfolge zu ändern versucht, die Anwendung 102 anhalten, da der Funktionsaufruf nicht den korrekten Schutzschlüssel enthält.
-
Zu beachten ist, dass 5 zwar drei Funktionen darstellt, die drei unterschiedlichen geschützten Seitenrahmen zugeordnet sind, jedoch bei anderen Ausführungsformen die als „Hochrisiko“ erkannten Funktionen auf andere Weise geschützten Seitenrahmen zugeordnet werden können. Zum Beispiel können bei einigen Ausführungsformen mehrere Funktionen demselben geschützten Seitenrahmen zugeordnet sein. Bei diesen Ausführungsformen kann jeder dieser Funktionen ein Schutzkennzeichen 112 zugewiesen sein, das demselben Schutzschlüssel 124 zugeordnet ist. Bei anderen Ausführungsformen können mehrere Funktionen vorliegen, die einem gleichen Seitenrahmen zugewiesen sind, der mit mehreren Schutzschlüsseln 124 geschützt ist. Zum Beispiel können bei diesen Ausführungsformen unterschiedliche Hauptspeicherbereiche (oder -regionen) innerhalb des Seitenrahmens mit einem anderen Schutzschlüssel 124 geschützt sein, und eine oder mehrere Funktionen können den unterschiedlichen Hauptspeicherbereichen zugewiesen (oder zugeordnet) sein.
-
Betrachtet werden soll das in 6 dargestellte beispielhafte Szenario eines ROP-Angriffs auf eine Anwendung 102, die unter Verwendung der hierin beschriebenen ROP-Entschärfungstechniken kompiliert wurde. Ähnlich wie bei dem ROP-Angriff in 3 nutzt ein böswilliger Angreifer bei diesem ROP-Angriff bei 306 eine Schwachstelle (z.B. einen Pufferüberlauf) in der Anwendung aus (z.B. nachdem das Programm bei 302 startet und anhält, um bei 304 auf eine Eingabe zu warten). Insbesondere versucht der böswillige Akteur einen Pufferüberlauf an dem Stack 350, der die Rücksprungadresse der aufgerufenen Funktion mit der Adresse eines Gadgets innerhalb der Bibliothek 360 der Hauptspeicherseite 502 überschreibt. Bei dieser Ausführungsform wird jedoch, wenn die beschädigte Rücksprungadresse bei 602 versucht, das Gadget im Hauptspeicher aufzurufen, die Ausführung angehalten, da die aufgerufene Funktion gekennzeichnet ist und der Funktionsaufruf nicht das korrekte Schutzkennzeichen 112 bereitstellt (das Schutzkennzeichen 112, das dem Schutzschlüssel 124 für die Hauptspeicherseite 502 zugehörig ist). Auf diese Weise stellen Ausführungsformen einen sicheren Mechanismus bereit, der durch den Compiler vollständig realisiert werden kann und der für den Benutzer und den Entwickler transparent ist. Darüber hinaus können Ausführungsformen die hierin beschriebenen Techniken mit minimalem Aufwand realisieren (z.B. im Verhältnis zu dem Aufwand, der herkömmlichen Techniken zugehörig ist) und erfordern kein Neuordnen von Quellcode.
-
7 ist ein Flussdiagramm eines Verfahrens 700 zum Ausführen einer Anwendung (z.B. Anwendung 102) gemäß einer Ausführungsform, die durch einen Compiler (z.B. Compiler 104) kompiliert wurde. Das Verfahren 700 kann durch eine oder mehrere Komponenten (z.B. Prozessor(en) 120) des Datenverarbeitungssystems 100 durchgeführt werden.
-
Das Verfahren 700 kann in den Ablauf bei Block 702 eintreten, bei dem das Datenverarbeitungssystem 100 ein oder mehrere Schutzkennzeichen (z.B. Schutzkennzeichen 112) aus einem Prolog einer (ersten) Funktion erkennt, die der Anwendung zugehörig ist. Wie angemerkt sind die Schutzkennzeichen Funktionen zugehörig, die sich innerhalb der Hauptspeicherseiten befinden, die mit einem oder mehreren Schutzschlüsseln (z.B. Schutzschlüssel 124) geschützt sind. Bei Block 704 beginnt das Datenverarbeitungssystem 100 mit dem Ausführen der Funktion. Bei einer Ausführungsform kann das Datenverarbeitungssystem 100 zum Beispiel wegen Benutzereingaben oder zum Durchführen einer anderen Operation pausieren. In einigen Fällen kann während der Ausführung ein böswilliger Akteur eine Schwachstelle innerhalb der Anwendung ausnutzen und einen Pufferüberlauf bewirken, der die Rücksprungadresse der ersten Funktion mit der Adresse einer weiteren (zweiten) Funktion (oder eines Gadgets)im Hauptspeicher überschreibt. Bei Block 706 stellt das Datenverarbeitungssystem 100 zum Beispiel fest, dass der Funktionsrücksprung eine weitere Funktion im Hauptspeicher aufruft.
-
Bei Block 708 ermittelt das Datenverarbeitungssystem 100, ob der Funktionsrücksprungaufruf das/die der anderen Funktion zugehörigen Schutzkennzeichen umfasst. Wenn der Funktionsrücksprungaufruf das/die relevanten Schutzkennzeichen nicht umfasst, hält das Datenverarbeitungssystem 100 die Ausführung an und blockiert den Zugriff auf die andere Funktion (Block 710). Wenn der Funktionsrücksprungaufruf das/die relevanten Schutzkennzeichen doch umfasst, führt das Datenverarbeitungssystem 100 die andere Funktion aus (Block 712). Das Verfahren 700 verlässt dann den Ablauf. Bei einer Ausführungsform kann das Datenverarbeitungssystem Wiederholungen der Operationen in 702, 704, 706 und 708 als Teil des Durchführens der Operationen in 712 durchführen.
-
8 veranschaulicht ein Datenverarbeitungssystem 800 gemäß einer Ausführungsform, das so konfiguriert ist, dass es ein Eingliedern (onboarding) von Einheiten durchführt. Wie gezeigt umfasst das Datenverarbeitungssystem 800, ohne auf diese beschränkt zu sein, eine Zentraleinheit (central processing unit, CPU) 805, eine Netzwerkschnittstelle 815, einen Hauptspeicher 820 und einen Speicher 860, die jeweils mit einem Bus 817 verbunden sind. Das Datenverarbeitungssystem 800 kann außerdem eine E/A-Einheitenschnittstelle 810 zum Anschließen von E/A-Einheiten 812 (z.B. einer Tastatur-, Anzeige- und Mauseinheit) an das Datenverarbeitungssystem 800 umfassen. Ferner können im Kontext dieser Offenbarung die in dem Datenverarbeitungssystem 800 gezeigten Datenverarbeitungselemente einem physischen Datenverarbeitungssystem (z.B. einem System in einem Datenzentrum) entsprechen, oder es kann sich hierbei um eine virtuelle Datenverarbeitungsinstanz handeln, die innerhalb einer Datenverarbeitungs-Cloud ausgeführt wird.
-
Die CPU 805 ruft in dem Hauptspeicher 820 gespeicherte Programmieranweisungen ab und führt diese aus und speichert und ruft Anwendungsdaten ab, die sich in dem Hauptspeicher 820 befinden. Die Zwischenverbindung 817 dient zum Übertragen von Programmieranweisungen und Anwendungsdaten zwischen der CPU 805, der E/A-Einheitenschnittstelle 810, dem Speicher 860, der Netzwerkschnittstelle 815 und dem Hauptspeicher 820. Zu beachten ist, dass die CPU 805 stellvertretend für eine einzige CPU, mehrere CPUs, eine einzige CPU, die mehrere Verarbeitungskerne enthält, und dergleichen steht. Der Hauptspeicher 820 ist allgemein stellvertretend für einen Direktzugriffsspeicher enthalten. Bei dem Speicher 860 kann es sich um eine Plattenlaufwerk-Speichereinheit handeln. Zwar ist der Speicher 860 als eine einzige Einheit gezeigt, jedoch kann es sich hierbei m eine Kombination aus festen und/oder wechselbaren Speichereinheiten wie z.B. Festplattenlaufwerken, wechselbaren Speicherkarten oder einem optischen Speicher, netzgebundenem Speicher (network attached storage, NAS) oder einem Speichernetzwerk (storage area network, SAN) handeln. Der Speicher 860 enthält Schutzkennzeichen 112 und Schutzschlüssel 124, die vorstehend ausführlicher beschrieben sind. Zur Veranschaulichung enthält der Hauptspeicher 820 den Compiler 104 und das Betriebssystem 106, die vorstehend ausführlicher beschrieben sind.
-
Die Beschreibungen der verschiedenen Ausführungsformen der vorliegenden Erfindung sollen der Veranschaulichung dienen, sind jedoch nicht als vollständig oder auf die offenbarten Ausführungsformen beschränkt gedacht. Für Fachleute sind viele Modifikationen und Variationen denkbar, ohne dass diese eine Abweichung vom Schutzumfang und Grundgedanken der beschriebenen Ausführungsformen darstellen würden. Die hierin verwendete Terminologie wurde gewählt, um die Grundgedanken der Ausführungsformen, die praktische Anwendung bzw. die technische Verbesserung gegenüber den auf dem Markt vorgefundenen Technologien zu erläutern bzw. anderen mit entsprechenden Fachkenntnissen das Verständnis der hierin offenbarten Ausführungsformen zu ermöglichen.
-
Im Folgenden wird Bezug auf in dieser Offenbarung vorgestellte Ausführungsformen genommen. Der Schutzumfang der vorliegenden Offenbarung ist jedoch nicht auf bestimmte beschriebene Ausführungsformen beschränkt. Stattdessen ist eine beliebige Kombination der folgenden Merkmale und Elemente unabhängig davon denkbar, ob sie mit unterschiedlichen Ausführungsformen im Zusammenhang stehen, um die Erfindung zu realisieren und in die Praxis umzusetzen. Obwohl hierin offenbarte Ausführungsformen möglicherweise Vorteile gegenüber anderen möglichen Lösungen oder gegenüber dem Stand der Technik erzielen, schränkt des Weiteren eine angegebene Ausführungsform den Schutzbereich der vorliegenden Offenbarung unabhängig davon nicht ein, ob ein bestimmter Vorteil durch eine angegebene Ausführungsform erzielt wird. Daher tragen die folgenden Aspekte, Merkmale, Ausführungsformen und Vorteile lediglich einen veranschaulichenden Charakter und sind nicht als Elemente oder Einschränkungen der beigefügten Ansprüche gedacht, ausgenommen in Fällen, in denen dies in einem Anspruch bzw. in Ansprüchen ausdrücklich angegeben ist. Ebenso ist ein Bezug auf „die Erfindung“ nicht als Verallgemeinerung eines hierin offenbarten Erfindungsgegenstands auszulegen und nicht als Element oder Einschränkung der beigefügten Ansprüche anzusehen, ausgenommen in Fällen, in denen dies in einem Anspruch bzw. in Ansprüchen ausdrücklich angegeben ist.
-
Aspekte der vorliegenden Erfindung können die Form einer vollständig in Hardware realisierten Ausführungsform, einer vollständig in Software realisierten Ausführungsform (unter anderem Firmware, residente Software, Mikrocode usw.) oder einer Ausführungsform annehmen, die Software- und Hardwareaspekte kombiniert, die im hierin allgemein als „Schaltung“, „Modul“ oder „System“ bezeichnet sind.
-
Bei der vorliegenden Erfindung kann es sich um ein System, ein Verfahren und/oder ein Computerprogrammprodukt handeln. Das Computerprogrammprodukt kann (ein) durch einen Computer lesbare(s) Speichermedium (oder -medien) enthalten, auf dem/denen durch einen Computer lesbare Programmanweisungen gespeichert sind, um einen Prozessor zu veranlassen, Aspekte der vorliegenden Erfindung auszuführen.
-
Bei dem durch einen Computer lesbaren Speichermedium kann es sich um eine materielle Einheit handeln, auf der Anweisungen zur Verwendung durch eine Einheit zur Ausführung von Anweisungen aufbewahrt und gespeichert sein können. Bei dem durch einen Computer lesbaren Speichermedium kann es sich zum Beispiel, ohne auf diese beschränkt zu sein, um eine elektronische Speichereinheit, eine magnetische Speichereinheit, eine optische Speichereinheit, eine elektromagnetische Speichereinheit, eine Halbleiterspeichereinheit oder eine beliebige geeignete Kombination des Vorstehenden handeln. Eine nicht erschöpfende Liste genauerer Beispiele des durch einen Computer lesbaren Speichermediums umfasst Folgendes: eine transportable Computerdiskette, eine Festplatte, einen Direktzugriffsspeicher (RAM), einen Nur-Lese-Speicher (ROM), einen löschbaren programmierbaren Nur-Lese-Speicher (EPROM oder Flash-Speicher), einen statischen Direktzugriffsspeicher (SRAM), einen transportablen Nur-Lese-Speicher in Form einer Compact Disc (CD-ROM), eine Digital Versatile Disc (DVD), einen Speicherstick, eine Diskette, eine mechanisch codierte Einheit wie zum Beispiel Lochkarten oder erhöhte Strukturen in einer Rille mit darauf aufgezeichneten Anweisungen oder beliebige geeignete Kombinationen des Vorstehenden. Ein durch einen Computer lesbares Speichermedium im hierin verwendeten Sinne ist nicht so auszulegen, dass es sich dabei um flüchtige Signale an sich handelt, beispielsweise um Funkwellen oder sich frei ausbreitende elektromagnetische Wellen, um elektromagnetische Wellen, die sich durch einen Hohlleiter oder andere Übertragungsmedien ausbreiten (z.B. ein Lichtwellenleiterkabel durchlaufende Lichtimpulse) oder um elektrische Signale, die über ein Kabel übertragen werden.
-
Hierin beschriebene, durch einen Computer lesbare Programmanweisungen können über ein Netzwerk, zum Beispiel das Internet, ein lokales Netzwerk ein Weitverkehrsnetzwerk und/oder ein Drahtlosnetzwerk von einem durch einen Computer lesbaren Speichermedium auf betreffende Datenverarbeitungs-/Verarbeitungseinheiten oder auf einen externen Computer oder eine externe Speichereinheit heruntergeladen werden. Das Netzwerk kann Kupferübertragungskabel, Lichtwellenübertragungsleiter, Drahtlosübertragung, Router, Firewalls, Switches, Gateway-Computer und/oder Edge-Server aufweisen. Eine Netzwerkadapterkarte oder eine Netzwerkschnittstelle in der Datenverarbeitungs-/Verarbeitungseinheit empfängt durch einen Computer lesbare Programmanweisungen aus dem Netzwerk und leitet die durch einen Computer lesbaren Programmanweisungen zur Speicherung in einem durch einen Computer lesbaren Speichermedium innerhalb der jeweiligen Datenverarbeitungs-/Verarbeitungseinheit weiter.
-
Durch einen Computer lesbare Programmanweisungen zum Ausführen von Operationen der vorliegenden Erfindung können Assembleranweisungen, ISA-Anweisungen (ISA = Instruction Set Architecture), Maschinenanweisungen, maschinenabhängige Anweisungen, Mikrocode, Firmware-Anweisungen, Daten zum Setzen von Zuständen oder entweder Quellcode oder Objektcode sein, die in einer beliebigen Kombination aus einer oder mehreren Programmiersprachen geschrieben sind, zu denen eine objektorientierte Programmiersprache wie beispielsweise Smalltalk, C++ oder Ähnliches und herkömmliche prozedurale Programmiersprachen wie beispielsweise die Programmiersprache „C“ oder ähnliche Programmiersprachen gehören. Die durch einen Computer lesbaren Programmanweisungen können vollständig auf dem Computer des Benutzers, teilweise auf dem Computer des Benutzers, als eigenständiges Softwarepaket, teilweise auf dem Computer des Benutzers und teilweise auf einem entfernt angeordneten Computer oder vollständig auf dem entfernt angeordneten Computer oder Server ausgeführt werden. Bei dem letztgenannten Szenario kann der entfernt angeordnete Computer mit dem Computer des Benutzers über eine beliebige Art von Netzwerk verbunden sein, unter anderem über ein lokales Netzwerk (Local Area Network, LAN) oder über ein Weitverkehrsnetzwerk (Wide Area Network, WAN), oder die Verbindung kann zu einem externen Computer hergestellt werden (beispielsweise über das Internet unter Nutzung eines Internetdienstanbieters (Internet Service Provider)). Bei einigen Ausführungsformen können elektronische Schaltungen, zu denen beispielsweise programmierbare Logikschaltungen, vor Ort programmierbare Gatteranordnungen (Field-Programmable Gate Arrays, FPGA) oder programmierbare Logikanordnungen (PLA) gehören, die durch einen Computer lesbaren Programmanweisungen ausführen, indem Zustandsinformationen der durch einen Computer lesbaren Programmanweisungen genutzt werden, um die elektronische Schaltung zu personalisieren, sodass Aspekte der vorliegenden Erfindung durchgeführt werden.
-
Aspekte der vorliegenden Erfindung sind hierin unter Bezugnahme auf Flussdiagrammdarstellungen und/oder Blockschemata von Verfahren, Vorrichtungen (Systemen) und Computerprogrammprodukten gemäß Ausführungsformen der Erfindung beschrieben. Es wird klar sein, dass jeder Block der Flussdiagramme und/oder der Blockschemata und Kombinationen von Blöcken in den Flussdiagrammen und/oder Blockschemata mit Hilfe von durch einen Computer lesbaren Programmanweisungen realisiert werden kann bzw. können.
-
Diese durch einen Computer lesbaren Programmanweisungen können einem Prozessor eines Universalcomputers, eines Spezialcomputers oder anderer programmierbaren Datenverarbeitungsvorrichtungen bereitgestellt werden, um eine Maschine zu erzeugen, sodass die Anweisungen, die über den Prozessor des Computers oder anderer programmierbarer Datenverarbeitungsvorrichtungen ausgeführt werden, Mittel schaffen, um die in einem Block bzw. in den Blöcken des Flussdiagramms bzw. der Flussdiagramme und/oder des Blockschemas bzw. der Blockschemata angegebenen Funktionen/Aktionen zu realisieren. Diese durch einen Computer lesbaren Programmanweisungen können ebenfalls in einem durch einen Computer lesbaren Medium gespeichert sein, das einen Computer, andere programmierbare Datenverarbeitungsvorrichtungen oder andere Einheiten anweisen kann, in einer bestimmten Weise zu funktionieren, sodass das durch einen Computer lesbare Medium mit darauf gespeicherten Anweisungen ein Erzeugnis aufweist, das Anweisungen enthält, die die in einem Block bzw. in den Blöcken der Flussdiagramme und/oder der Blockschemata angegebene Funktion/Aktion realisieren.
-
Die durch einen Computer lesbaren Programmanweisungen können auch in einen Computer, in andere programmierbare Datenverarbeitungsvorrichtungen oder in andere Einheiten geladen werden, um zu bewirken, dass auf dem Computer, auf anderen programmierbaren Vorrichtungen oder anderen Einheiten eine Reihe von Operationen ausgeführt wird, um einen mittels Computer realisierten Prozess zu schaffen, sodass die Anweisungen, die auf dem Computer, auf anderen programmierbaren Vorrichtungen oder Einheiten ausgeführt werden, die in einem Block bzw. in den Blöcken der Flussdiagramme und/oder der Blockschemata angegebenen Funktionen/Aktionen realisieren.
-
Die Flussdiagramme und Blockschemata in den Figuren veranschaulichen die Architektur, Funktionalität und Wirkungsweise möglicher Realisierungsformen von Systemen, Verfahren und Computerprogrammprodukten gemäß verschiedenen Ausführungsformen der vorliegenden Erfindung. In diesem Zusammenhang kann jeder Block in den Flussdiagrammen bzw. in den Blockschemata ein Modul, ein Segment oder einen Abschnitt von Anweisungen darstellen, das bzw. der eine oder mehrere ausführbare Anweisungen zum Realisieren der angegebenen Logikfunktion bzw. Logikfunktionen aufweist. Bei einigen alternativen Realisierungsformen können die in dem Block angegebenen Funktionen in einer anderen als in der Reihenfolge ausgeführt werden, die in den Figuren angegeben ist. Zum Beispiel können zwei hintereinander aufgeführte Blöcke tatsächlich im Wesentlichen gleichzeitig ausgeführt werden, oder die Blöcke können je nach der mit den Blöcken verbundenen Funktionalität manchmal in umgekehrter Reihenfolge ausgeführt werden. Darüber hinaus ist anzumerken, dass jeder Block der Blockschemata und/oder Flussdiagrammdarstellungen sowie Kombinationen von Blöcken in den Blockschemata und/oder Flussdiagrammdarstellungen mit Hilfe zweckgebundener hardwaregestützter Systeme zum Ausführen der angegebenen Funktionen bzw. Aktionen oder mit Hilfe von Kombinationen aus zweckgebundener Hardware und zweckgebundenen Computeranweisungen realisiert werden kann bzw. können.
-
Ausführungsformen der Erfindung können Endbenutzern über eine Cloud-Datenverarbeitungsinfrastruktur bereitgestellt werden. Der Begriff „Cloud-Datenverarbeitung“ („Cloud-Computing“) bezeichnet allgemein die Bereitstellung skalierbarer Datenverarbeitungsressourcen als Dienst über ein Netzwerk. Formaler ausgedrückt kann Cloud-Computing als Datenverarbeitungsfunktion definiert werden, die eine Abstraktion zwischen der Datenverarbeitungsressource und ihrer zugrundeliegenden technischen Architektur (z.B. Server, Speicher, Netzwerke) bereitstellt, die den benutzerfreundlichen bedarfsorientierten Netzwerkzugriff auf eine gemeinsam genutzte Ansammlung konfigurierbarer Datenverarbeitungsressourcen ermöglicht, die mit minimalem Verwaltungsaufwand bzw. über minimale Interaktion mit dem Dienstanbieter bereitgestellt und freigegeben werden kann. Somit ermöglicht Cloud-Computing einem Benutzer unabhängig von den zugrundeliegenden physischen Systemen (oder den Standorten der Systeme), die zur Bereitstellung der Datenverarbeitungsressourcen verwendet werden, auf virtuelle Datenverarbeitungsressourcen (z.B. Speicher, Daten, Anwendungen und selbst auf komplette virtualisierte Datenverarbeitungssysteme) in der „Cloud“ zuzugreifen.
-
Normalerweise werden Cloud-Computing-Ressourcen einem Benutzer auf einer Grundlage der Kosten pro Nutzung (pay-per-use) bereitgestellt, bei der Benutzern nur Kosten für die tatsächlich genutzten Datenverarbeitungsressourcen (z.B. eine Größe des durch einen Benutzer in Anspruch genommenen Speicherplatzes oder eine Anzahl virtueller Systeme, die der Benutzer instanziiert hat) in Rechnung gestellt werden. Ein Benutzer kann über das Internet jederzeit und von überall auf beliebige der Ressourcen zugreifen, die sich in der Cloud befinden. Im Kontext der vorliegenden Erfindung kann ein Benutzer auf Anwendungen (z.B. Compiler 104) und zugehörige Daten zugreifen, die in der Cloud zur Verfügung stehen. Zum Beispiel könnte der Compiler 104 auf einem Datenverarbeitungssystem in der Cloud ausgeführt werden und unter Verwendung einer oder mehrerer hierin beschriebener ROP-Entschärfungstechniken Quellcode für eine Anwendung (z.B. Anwendung 102) kompilieren. In einem derartigen Fall könnte der Compiler 104 „Hochrisiko“-Funktionen im Quellcode einer Anwendung erkennen, die Zuweisung dieser „Hochrisiko“-Funktionen zu Speicherseiten auslösen, die mit einem oder mehreren Schutzschlüsseln geschützt sind, und den „Hochrisiko“-Funktionen Schutzkennzeichen zuweisen. Die Anwendung 102 kann dann gespeichert werden, um später durch ein Datenverarbeitungssystem abgerufen zu werden. Zum Beispiel kann das Datenverarbeitungssystem dann während des Ausführens der Anwendung auf der Grundlage, ob die Funktion die relevanten Schutzkennzeichen umfasst, ermitteln, ob auf eine bestimmte Funktion im Hauptspeicher zugegriffen werden kann. Dies ermöglicht einem Benutzer, von einem beliebigen Datenverarbeitungssystem, das an ein mit der Cloud verbundenes Netzwerk (z.B. das Internet) angeschlossen ist, auf diese Daten zuzugreifen.
-
Zwar ist das Vorstehende auf Ausführungsformen der vorliegenden Erfindung gerichtet, es können jedoch andere und weitere Ausführungsformen der Erfindung entwickelt werden, ohne von deren grundlegendem Schutzumfang abzuweichen, wobei deren Schutzumfang durch die nachfolgenden Ansprüche festgelegt ist.