-
Stand der Technik
-
Die Erfindung betrifft eine Recheneinheit, die dazu ausgebildet ist, wenigstens eine Programmfunktion eines auf der Recheneinheit ausführbaren Computerprogramms auszuführen. Die Erfindung betrifft ferner ein Betriebsverfahren für eine derartige Recheneinheit.
-
Recheneinheiten und Betriebsverfahren der vorstehend genannten Art sind bekannt. Die Programmfunktion des auf der Recheneinheit ausführbaren Computerprogramms kann beispielsweise Teil eines der Recheneinheit zugeordneten Maschinenprogramms sein. Alternativ oder ergänzend ist es möglich, dass Programmfunktionen des auf der Recheneinheit ausführbaren Computerprogramms Bestandteil von Systembibliotheken (libc, „stdio.h“ usw.) oder Standardbibliotheken sind, welche auf bekannten Recheneinheiten beispielsweise zusammen mit einem Betriebssystem oder generell einer Laufzeitumgebung vorinstalliert werden, sodass diese Programmfunktionen bei der Ausbringung neuer Computerprogramme für die Recheneinheit auf dieser nicht gesondert zur Verfügung gestellt werden müssen.
-
Es ist bekannt, dass Angriffe auf bestehende Implementierungen derart möglich sind, dass bestehende Programmfunktionen, die beispielsweise Bestandteil von Systembibliotheken oder Standardbibliotheken sind, gegen manipulierte Programmfunktionen ausgetauscht werden, welche zusätzlich zu den regulären Funktionalitäten der bestehenden Programmfunktionen Schadcode und dergleichen enthalten. Dadurch werden die manipulierten Programmfunktionen gleichsam in eine man-in-the-middle-Angriffsposition versetzt, die es ihnen ermöglicht, Systemaufrufe bzw. Programmfunktionsaufrufe von auf der Recheneinheit ablaufenden Anwendungsprogrammen zu manipulieren und/oder deren Ausgabe bzw. Rückgabewerte an das Anwendungsprogramm zu verändern bzw. zu kopieren und ggf. an einen unbefugten Empfänger zu übermitteln.
-
Offenbarung der Erfindung
-
Demgemäß ist es Aufgabe der vorliegenden Erfindung, eine Recheneinheit der eingangs genannten Art und ein Betriebsverfahren der eingangs genannten Art dahingehend zu verbessern, dass eine gesteigerte Zuverlässigkeit und Sicherheit gegenüber den vorstehend genannten Angriffen gegeben ist.
-
Diese Aufgabe wird bei der Recheneinheit der eingangs genannten Art erfindungsgemäß dadurch gelöst, dass die Recheneinheit dazu ausgebildet ist, die Ausführungszeit der Programmfunktion zu ermitteln und mit wenigstens einem Sollwert für die Ausführungszeit der Programmfunktion zu vergleichen.
-
Erfindungsgemäß ist erkannt worden, dass eine Vielzahl von Programmfunktionen eine im Wesentlichen deterministische, also vorhersagbare, bzw. sogar konstante, Ausführungszeit hat. Dies gilt insbesondere für Programmfunktionen von Standardbibliotheken und sogenannte Systemaufrufe (englisch: system calls), bei denen beispielsweise von einem Betriebssystem zur Verfügung gestellte Funktionalitäten in Form der Programmfunktion nach einem entsprechenden Aufruf durch ein Anwendungsprogramm ausgeführt werden. Insbesondere gilt dies bei sog. eingebetteten Systemen (englisch: embedded system). Erfindungsgemäß kann die Ausführungszeit dieser Programmfunktion ermittelt und mit wenigstens einem Sollwert für die Ausführungszeit verglichen werden. Dies ermöglicht vorteilhaft festzustellen, ob bzw. inwieweit eine tatsächliche Ausführungszeit der betreffenden Programmfunktion von dem Sollwert abweicht, was als Anzeichen für das Vorliegen einer Manipulation bzw. eines Angriffs auf die Recheneinheit bzw der Programmfunktionen bzw. die entsprechende Laufzeitumgebung gewertet werden kann.
-
Bei einer bevorzugten Ausführungsform handelt es sich bei der Ausführungszeit um eine Zeitdifferenz zwischen dem Zeitpunkt des Aufrufs der Programmfunktion und dem Zeitpunkt der Rückkehr aus der aufgerufenen Programmfunktion. Bei einer Ausführungsform kann ein Anwendungsprogramm, das die betreffende Programmfunktion bzw. den Systemaufruf ausführt, diese Zeitdifferenz messen und als tatsächliche Ausführungszeit mit dem Sollwert vergleichen.
-
Bei einer bevorzugten Ausführungsform kann eine Fehlerreaktion von der Recheneinheit ausgeführt werden, wenn die ermittelte Ausführungszeit von dem Sollwert um einen vorgegebenen Differenzwert abweicht, z.B. den Sollwert um den Differenzwert übersteigt. In diesem Fall kann beispielsweise darauf geschlossen werden, dass die aufgerufene Programmfunktion unzulässige bzw. zusätzliche Programmabläufe ausführt. Alternativ oder ergänzend kann eine Fehlerreaktion auch dann eingeleitet werden, wenn die ermittelte Ausführungszeit einen entsprechenden zweiten Sollwert für eine minimale Ausführungszeit um ein vorgebbares Maß unterschreitet. Auch in diesem Fall kann eine Manipulation der vorstehend genannten Art vorliegen.
-
Bei einer weiteren vorteilhaften Ausführungsform ist vorgesehen, dass die Fehlerreaktion wenigstens einen der folgenden Schritte aufweist: Verarbeiten bzw. Schreiben vorgebbarer Daten, insbesondere dummy-Daten (beispielsweise Daten mit geringem Informationsgehalt bzw. (pseudo-) Zufallsdaten), Benachrichtigen einer anderen Einheit über eine irreguläre Ausführungszeit der Programmfunktion. Dadurch kann einerseits ein wirksamer Angriff auf wertvolle Nutzdaten vereitelt werden und andererseits können durch die andere Einheit beispielsweise Gegenmaßnahmen bzw. eine eingehende Untersuchung der verdächtigen Programmfunktion eingeleitet werden.
-
Bei einer weiteren Ausführungsform ist vorgesehen, dass die Recheneinheit dazu ausgebildet ist, die Programmfunktion mehrmals auszuführen und eine minimale Ausführungszeit und/oder maximale Ausführungszeit und/oder durchschnittliche Ausführungszeit der betreffenden Programmfunktion zu ermitteln. Analog zu den vorstehend genannten Ausführungsformen können auch die minimale Ausführungszeit bzw. die maximale Ausführungszeit bzw. die durchschnittliche Ausführungszeit mit entsprechenden Sollwerten verglichen werden, und bei einer Abweichung von wenigstens einem der möglicherweise mehreren Sollwerte kann eine entsprechende Fehlerreaktion eingeleitet werden.
-
Besonders bevorzugt kann bei weiteren Ausführungsformen eine Programmfunktion, sofern sie mehrmals ausgeführt wird, mit denselben Parametern ausgeführt werden, um sicherzustellen, dass nicht durch die Übergabe unterschiedlicher Parameter bereits unterschiedliche Ausführungszeiten hervorgerufen werden.
-
Bei weiteren Ausführungsformen ist vorstellbar, unterschiedlich große Sollwerte für die Bewertung der tatsächlichen Ausführungszeit vorzusehen, wobei die unterschiedlich großen Sollwerte insbesondere in Abhängigkeit eines Typs der betreffenden Programmfunktion bzw. des betreffenden Systemaufrufs (zum Beispiel Anzahl der Parameter) gewählt werden.
-
Als eine weitere Lösung der Aufgabe der vorliegenden Erfindung ist ein Verfahren zum Betreiben einer Recheneinheit gemäß Patentanspruch 5 angegeben.
-
Weitere Aspekte der Erfindung betreffen ein Verfahren zum Bereitstellen von Programmfunktionen für ein Zielsystem gemäß Patentanspruch 6. Das Verfahren umfasst die Schritte: Bereitstellen einer Programmfunktion eines auf dem Zielsystem ausführbaren Computerprogramms, Ermitteln von eine Ausführungszeit der Programmfunktion auf dem Zielsystem charakterisierenden Informationen, zumindest zeitweises Speichern der die Ausführungszeit der Programmfunktion auf dem Zielsystem charakterisierenden Informationen und/oder hiervon abgeleiteter Informationen.
-
Bei einer Ausführungsform kann ein Ausführen der bereitgestellten Programmfunktion auf einem Referenz-Zielsystem vorgesehen sein, wodurch eine präzise Ermittlung der Ausführungszeit der Programmfunktion ermöglicht ist. Bei weiteren Ausführungsformen kann vorgesehen sein, dass die die Ausführungszeit der Programmfunktion auf dem Zielsystem charakterisierenden Informationen/oder die hiervon abgeleiteten Informationen auf das Zielsystem übertragen werden. Dadurch können die betreffenden Informationen effizient dem Zielsystem bereitgestellt werden, welches die Informationen beispielsweise zur Laufzeit verwenden kann. Insbesondere können die auf diese Weise vorgesehenen Informationen zur Bildung von Sollwerten für den vorstehend genannten Vergleich mit tatsächlichen Ausführungszeiten der Programmfunktionen genutzt werden.
-
Ein weiterer Aspekt der vorliegenden Erfindung ist angegeben durch eine Vorrichtung zum Bereitstellen von Programmfunktionen für ein Zielsystem gemäß Patentanspruch 9.
-
Weitere Merkmale, Anwendungsmöglichkeiten und Vorteile der Erfindung ergeben sich aus der nachfolgenden Beschreibung von Ausführungsbeispielen der Erfindung, die in den Figuren der Zeichnung dargestellt sind. Dabei bilden alle beschriebenen oder dargestellten Merkmale für sich oder in beliebiger Kombination den Gegenstand der Erfindung, unabhängig von ihrer Zusammenfassung in den Patentansprüchen oder deren Rückbeziehung sowie unabhängig von ihrer Formulierung bzw. Darstellung in der Beschreibung bzw. in der Zeichnung.
-
In der Zeichnung zeigt:
- 1 schematisch ein Blockdiagramm einer Ausführungsform der erfindungsgemäßen Recheneinheit,
- 2 schematisch ein vereinfachtes Flussdiagramm einer Ausführungsform des erfindungsgemäßen Betriebsverfahrens für eine Recheneinheit,
- 3 schematisch ein vereinfachtes Flussdiagramm einer Ausführungsform eines erfindungsgemäßen Verfahrens zum Bereitstellen von Programmfunktionen,
- 4 schematisch ein Betriebsszenario gemäß einer Ausführungsform,
- 5 schematisch ein Betriebsszenario gemäß einer weiteren Ausführungsform, und
- 6 schematisch ein Blockdiagramm einer erfindungsgemäßen Vorrichtung zum Bereitstellen von Programmfunktionen.
-
1 zeigt schematisch ein Blockdiagramm einer Ausführungsform einer erfindungsgemäßen Recheneinheit 100, der eine Speichereinrichtung 110 zur zumindest zeitweisen Speicherung eines auf der Recheneinheit 100 ausführbaren Computerprogramms CP zugeordnet ist. Das Computerprogramm CP kann ein oder mehrere Programmfunktionen PF aufweisen, von denen vorliegend der Übersichtlichkeit halber nur eine bezeichnet ist. Die Speichereinrichtung kann beispielsweise einen flüchtigen Speicher, beispielsweise einen Arbeitsspeicher (RAM) oder einen nichtflüchtigen Speicher sowie Kombinationen hieraus aufweisen.
-
Bei der Programmfunktion PF kann es sich um eine Programmfunktion PF handeln, die in ein Anwendungsprogramm, beispielsweise das Computerprogramm CP, integriert ist. Beispielsweise kann die Programmfunktion PF zusammen mit dem Anwendungsprogramm bzw. Computerprogramm CP der Recheneinheit 100 z.B. in maschinenlesbarer Form, beispielsweise in Form einer Binärdatei, zur Verfügung gestellt werden.
-
Alternativ oder ergänzend kann es sich bei der Programmfunktion PF auch um eine Programmfunktion einer Standardbibliothek oder einen sogenannten Systemaufruf (system call) einer für den Betrieb der Recheneinheit 100 vorgesehenen Laufzeitumgebung handeln. In diesen Fällen kann die betreffende Programmfunktion beispielsweise auch schon auf der Recheneinheit 100 vorinstalliert sein, beispielsweise als Teil eines Betriebssystems bzw. der Laufzeitumgebung.
-
Erfindungsgemäß ist vorgesehen, dass die Recheneinheit 100 die Ausführungszeit der Programmfunktion PF ermittelt, vergleiche Schritt 200 des Flussdiagramms aus 2, und dass die Recheneinheit 100 (1) die in Schritt 200 ermittelte Ausführungszeit mit wenigstens einem Sollwert für die Ausführungszeit vergleicht, vergleiche Schritt 210 gemäß 2. Dies ermöglicht der Recheneinheit 100 festzustellen, ob die tatsächlich ermittelte Ausführungszeit beispielsweise vergleichsweise lang ist verglichen mit dem Sollwert, woraus auf einen Fehlerfall bzw. einen versuchten Angriff auf die Programmfunktion bzw. die Recheneinheit 100 geschlossen werden kann.
-
Insbesondere kann bei einer weiteren Ausführungsform eine Fehlerreaktion ausgeführt werden, vergleiche den optionalen Schritt 220 gemäß 2, wenn die ermittelte Ausführungszeit den Sollwert um einen vorgegebenen Differenzwert übersteigt. Die Fehlerreaktion 220 kann beispielsweise das Verarbeiten bzw. Schreiben vorgebbarer Dummy-Daten oder Pseudozufallsdaten oder Zufallsdaten zum Gegenstand haben sowie alternativ oder ergänzend ein Benachrichtigen einer anderen Einheit (nicht gezeigt) über die irreguläre Ausführungszeit der Programmfunktion PF. Eine Deaktivierung der Recheneinheit 100 bzw. des Computerprogramms CP kann bei weiteren Ausführungsformen ebenfalls vorgesehen sein, um bei einem erkannten Angriffsversuch das neuerliche Ausführen der ggf. kompromittierten Programmfunktion PF zu verhindern.
-
Bei einer weiteren vorteilhaften Ausführungsform kann die Recheneinheit 100 dazu ausgebildet sein, die Programmfunktion PF (1) mehrmals auszuführen und eine minimale Ausführungszeit und/oder eine maximale Ausführungszeit und/oder eine durchschnittliche Ausführungszeit zu ermitteln, wobei wenigstens einer dieser Werte mit einem entsprechenden Sollwert verglichen werden kann.
-
4 zeigt schematisch ein Betriebsszenario gemäß einer Ausführungsform. Bezugszeichen 400 bezeichnet eine Laufzeitumgebung, die beispielsweise charakterisiert ist durch einen vorgebbaren Typ der Recheneinheit 100 als Zielsystem für ein Computerprogramm CP, das die Programmfunktion PF (1) bereitstellen bzw. aufrufen können soll, durch ein Betriebssystem und/oder durch Programmbibliotheken, die aufrufbare Programmfunktionen bereitstellen. Basierend auf der Laufzeitumgebung 400 werden ein oder mehrere Messungen der Ausführungszeit der interessierenden Programmfunktion PF ausgeführt, was in 4 durch Block 402 angedeutet ist.
-
Die hierbei erhaltenen Werte für die Ausführungszeit werden bevorzugt in einer Datenbank Db zumindest zeitweise gespeichert. Optional können die hierbei erhaltenen Werte sodann auch an das Zielsystem 100 übertragen werden, vergleiche Pfeil 330 in 4. Bei einer alternativen Ausführungsform können die erhaltenen Werte für die Ausführungszeit auch direkt nach der Messung 402 dem Zielsystem 100 zur Verfügung gestellt werden, vergleiche Pfeil 330'.
-
Die vorstehend genannte Messung 402 kann beispielsweise vorteilhaft während einer Fertigungsphase bzw. Entwurfsphase ausgeführt werden, bei der die Recheneinheit 100 bzw. ihr Computerprogramm CP entworfen bzw. programmiert bzw. hergestellt wird. Sodann können die vorstehend beschriebenen Messwerte in der Datenbank Db gespeichert werden und bei Bedarf an die Zielsysteme 100 übertragen werden, vergleiche Pfeile 330, 330'. Das Übertragen kann beispielsweise bei der Fertigstellung der Recheneinheit 100 erfolgen, also bevor diese im Feld ihrerseits in einem Zielsystem eingesetzt wird.
-
Beispielsweise kann es sich bei der Recheneinheit 100 um eine Recheneinheit für ein Steuergerät eines Kraftfahrzeugs handeln. In diesem Fall kann die Recheneinheit 100 mit den vorstehend beschriebenen Messwerten betreffend die Ausführungszeit wenigstens einer Programmfunktion PF versehen werden, bevor sie in das Steuergerät bzw. in das Kraftfahrzeug integriert wird. Später, beispielsweise im Feld, kann die erfindungsgemäße Recheneinheit 100 dann vorteilhaft die wie vorstehend beschrieben an sie übertragenen Daten betreffend die gemessene Ausführungszeit der Programmfunktion PF für den vorstehend ebenfalls beschriebenen Vergleich 210 (2) nutzen, um Angriffe auf die Recheneinheit 100 bzw. ihre Laufzeitumgebung ermitteln zu können.
-
5 zeigt schematisch ein Betriebsszenario gemäß einer weiteren Ausführungsform. Bezugszeichen 400 gibt wiederum eine Laufzeitumgebung an, und das Bezugszeichen 404 bezeichnet vorliegend ein Anwendungsprogramm, zum Beispiel eine sogenannte „user-level application“. Eine „user-level application“ ist ein Anwendungsprogramm, das auf Benutzerebene abläuft, im Gegensatz beispielsweise zu „kernel-level threads“, also Prozessen bzw. Threads, die auf Kernelebene ablaufen.
-
Der Pfeil PF1 bezeichnet einen Aufruf der Programmfunktion PF (1) durch das Anwendungsprogramm 404, und der Pfeil PF1' bezeichnet eine Rückkehr aus der Programmfunktion PF zu dem Anwendungsprogramm 404 nach der Ausführung der Programmfunktion PF. Die Ausführungszeit ist mit dem Bezugszeichen t' bezeichnet und wird vorliegend auf der Grundlage des erfindungsgemäßen Prinzips durch das Anwendungsprogramm 404 ermittelt, vergleiche Bezugszeichen 406. Sodann wird wie durch Bezugszeichen 408 angedeutet die ermittelte tatsächliche Ausführungszeit t' mit einem vorgebbaren Sollwert t(g)+Δ verglichen, um einen möglichen Angriff bzw. eine mögliche Manipulation der Programmfunktion PF1 bzw. der Laufzeitumgebung 400 erkennen zu können.
-
6 zeigt schematisch ein Blockdiagramm einer erfindungsgemäßen Vorrichtung 500 zum Bereitstellen von Programmfunktionen. Die Vorrichtung 500 weist einen Rechenkern 510 sowie einen zugeordneten Speicher 520 auf. Die Vorrichtung 500 ist zur Ausführung des durch das Flussdiagramm gemäß 3 abgebildeten Verfahrens ausgebildet. In einem ersten Schritt 300 wird eine Programmfunktion eines auf dem Zielsystem 100 ausführbaren Computerprogramms bereitgestellt. Hierbei kann es sich beispielsweise um eine Programmfunktion handeln, bei der zukünftig in dem Zielsystem, also beispielsweise in der Recheneinheit 100 gemäß 1, die Ausführungszeit ermittelt und gegebenenfalls mit einem Sollwert verglichen werden soll. In Schritt 310 des Verfahrens gemäß 3 ermittelt die Vorrichtung 500 ( 6) Informationen, die eine Ausführungszeit der Programmfunktion PF auf dem Zielsystem 100 charakterisieren. Dies kann beispielsweise durch ein Ausführen 312 der Programmfunktion PF auf einem Referenz-Zielsystem erfolgen, das hinsichtlich Hardware und/oder Software vergleichsweise ähnlich oder identisch zu dem Zielsystem 100 ausgebildet ist. In Schritt 320 erfolgt ein zumindest zeitweises Speichern dieser Informationen, die eine Ausführungszeit der Programmfunktion PF auf dem Zielsystem 100 charakterisieren, und/oder hiervon abgeleiteter Informationen, beispielsweise in der Datenbank Db, vergleiche 5.
-
In einem optionalen Schritt 330 können die die Ausführungszeit der Programmfunktion PF charakterisierenden Informationen auch an das Zielsystem 100 übertragen werden. Hierzu kann die Vorrichtung 500 über eine geeignete Schnittstelle 530 verfügen. Die Vorrichtung 500 kann beispielsweise während eines Fertigungsprozesses der Recheneinheit 100 bzw. während einer Entwicklung von Computerprogrammen CP für die Recheneinheit 100 genutzt werden.
-
Nachfolgend ist beispielhaft als „Listing 1“ ein Quellcode eines in der Programmiersprache C abgefassten Computerprogramms zur Veranschaulichung von Aspekten der Ausführungsformen wiedergegeben. Den einzelnen Codezeilen sind Zeilennummern, vorliegend von 1-65, vorangestellt, um eine nachfolgende Erläuterung und Referenzierung auf den Quellcode zu vereinfachen:
- 1 #include <stdio.h>
- 2 #include <stdint.h>
- 3 #include <string.h>
- 4 #include <algorithm>
- 5 #include <numeric>
- 6 #include <vector>
- 7 using namespace std;
- 8
- 9 // timer function is taken from:
- 10 // http://stackoverflow.com/questions/459691/best-timing-method-in-c
- 11 inline uint64_t rdtsc(){
- 12 uint32_t lo, hi;
- 13 _asm__volatile_(
- 14 „xorl %%eax, %%eax\n“
- 15 „cpuid\n“
- 16 „rdtsc\n“
- 17 : „=a“ (lo), „=d“ (hi)
- 18 :
- 19 : „%ebx“, „%ecx“);
- 20 return (uint64_t)hi << 32 |lo;
- 21 }
- 22
- 23 #define START() \
- 24 uint32_t tStart = rdtsc();
- 25
- 26 #define STOP() \
- 27 uint32_t tEnd = rdtsc(); \
- 28 printf(„%d,“, tEnd - tStart);
- 29
- 30 int main(){
- 31 int i=0;
- 32 vector<uint32_t> vecReal; // holds all the times for the real function
- 33 vector<uint32_t>::iterator tlter;
- 34 uint32_t uiRealFoo = 0;
- 35
- 36 // measure the real libc function
- 37 printf(„>> The fopen calls:\n“);
- 38 for (i=0;i<20;i++)
- 39 {
- 40 START();
- 41 fopen(„doesnotexist“, „rb“);
- 42 STOP();
- 43 vecReal.push_back(tEnd - tStart);
- 44 }
- 45
- 46 // now remove the 5 highest and the 5 lowest values
- 47 printf(„\nremove the 5 max/5 min:\n“);
- 48 for (i=0;i<5;i++){
- 49 tlter = max_element(vecReal.begin(),vecReal.end());
- 50 printf(„+%d,“,*tlter);
- 51 vecReal.erase(tlter);
- 52 tlter = min_element(vecReal.begin(),vecReal.end());
- 53 printf(„-%d,“,*tlter);
- 54 vecReal.erase(tlter);
- 55 }
- 56 uiRealFoo = accumulate(vecReal.begin(),vecReal.end(),0);
- 57 printf(„\n\n>> Summary:\n“);
- 58 printf(„real sum = %d\n“, uiRealFoo);
- 59 // on my specific machine 170000 seems to be a good value
- 60 if (uiRealFoo > 170000){
- 61 printf(„>>> It seems that i am hacked :-(\n“);
- 62 }else{
- 63 printf(„>>> Everything seems to be OK\n“);
- 64 }
- 65 }
-
In den Zeilen 38-44 ist eine Schleife definiert, welche 20 Wiederholungen der Ausführung einer Programmfunktion „fopen()“ (Öffnen einer Datei) der Standardbibliothek stdio.h einschließlich Messung der Ausführungszeit für diese Programmfunktion „fopen()“ vorsieht. Die Zeitmessung wird mittels des Ausdrucks START() in Zeile 40 von Listing 1 ausgeführt, vergleiche hierzu auch die Definition aus Zeile 24, sowie mittels des Ausdrucks STOP() in Zeile 42, vergleiche hierzu auch die Definition aus Zeile 27 von Listing 1.
-
Sodann werden mittels der Zeilen 47-55 von Listing 1 noch die fünf höchsten und die fünf niedrigsten der insgesamt 20 Messwerte für die Ausführungszeit der Programmfunktion „fopen()“ gelöscht. Anschließend erfolgt mittels der Zeilen 56-60 eine Auswertung dahingehend, ob die ermittelte Ausführungszeit größer ist als ein vorgebbarer Schwellwert (vorliegend beispielhaft der Wert 170000).
-
Listing 1 ermöglicht demnach vorteilhaft die Anwendung des erfindungsgemäßen Prinzips. Ein entsprechender Quellcode kann beispielsweise in ein oder mehrere Anwendungsprogramme bzw. Computerprogramme CP integriert werden, die zur Ausführung auf der Recheneinheit 100 vorgesehen sind. Es versteht sich, dass die vorstehend genannte Bezugnahme bzw. Zeitmessung bezüglich der Programmfunktion „fopen()“ nur beispielhaft gewählt worden ist und auf ein oder mehrere andere Programmfunktionen, insbesondere auch Systemaufrufe, übertragbar ist.
-
Nachfolgend ist beispielhaft als „Listing 2“ ein Quellcode eines ebenfalls in der Programmiersprache C abgefassten Computerprogramms zur Veranschaulichung von weiteren Aspekten der Ausführungsformen wiedergegeben. Den einzelnen Codezeilen sind Zeilennummern, vorliegend von 1-101, vorangestellt, um eine nachfolgende Erläuterung und Referenzierung auf den Quellcode zu vereinfachen:
- 1 #include <stdio.h>
- 2 #include <stdint.h>
- 3 #include <string.h>
- 4 #include <algorithm>
- 5 #include <numeric>
- 6 #include <vector>
- 7 using namespace std;
- 8
- 9 inline uint64_t rdtsc(){
- 10 uint32_tlo, hi;
- 11 _asm__volatile_(
- 12 „xorl %%eax, %%eax\n“
- 13 „cpuid\n“
- 14 „rdtsc\n“
- 15 : „=a“ (lo), „=d“ (hi)
- 16 :
- 17 : „%ebx“, „%ecx“);
- 18 return (uint64_t)hi << 32 |lo;
- 19}
- 20
- 21 int internal_strcmp(const char *egg1, const char *egg2){
- 22 while (*egg1 == *egg2){
- 23 egg1++;
- 24 egg2++;
- 25 if (! (*egg1)) return 0;
- 26 }
- 27 // return value not relevant for the timing
- 28 return 0;
- 29}
- 30 31 #define START() \ 32 uint32_t tStart = rdtsc();
- 33
- 34 #define STOP() \
- 35 uint32_t tEnd = rdtsc(); \
- 36 printf(„%d,“, tEnd - tStart);
- 37
- 38 int main(){
- 39 int i=0;
- 40 vector<uint32_t> vecReal; // holds all the times for the real function
- 41 vector<uint32_t> vecFake; // holds all the times fot the fake function
- 42 vector<uint32_t>::iterator tlter;
- 43
- 44 uint32_t uiRealFoo = 0;
- 45 uint32_t uiFakeFoo = 0;
- 46
- 47 // measure the real libc function
- 48 printf(„>> The real strcmp:\n“);
- 49 for (i=0;i<20;i++){
- 50 START();
- 51 strcmp(„1234567890“, „1234567890“);
- 52 STOP();
- 53 vecReal.push_back(tEnd - tStart);
- 54 }
- 55
- 56 // now remove the 5 highest and the 5 lowest values
- 57 printf(„\nremove the 5 max/5 min:\n“);
- 58 for (i=0;i<5;i++){
- 59 tlter = max_element(vecReal.begin(),vecReal.end());
- 60 printf(„+%d,“,*tlter);
- 61 vecReal.erase(tlter);
- 62 tlter = min_element(vecReal.begin(),vecReal.end());
- 63 printf(„-%d,“,*tlter);
- 64 vecReal.erase(tlter);
- 65 }
- 66 uiRealFoo = accumulate(vecReal.begin(),vecReal,end(),0);
- 67
- 68 // measure the internal compare function
- 69 printf(„\n\n>> The internal compare strcmp:\n“);
- 70 for (i=0;i<20;i++)
- 71 {
- 72 START();
- 73 internal_strcmp(„1234567890“,„1234567890“);
- 74 STOP();
- 75 vecFake.push_back(tEnd - tStart);
- 76 }
- 77 // now remove the 5 highest and the 5 lowest values
- 78 printf(„\nremove the 5 max/5 min:\n“);
- 79 for (i=0;i<5;i++){
- 80 tlter = max_element(vecFake.begin(),vecFake.end());
- 81 printf(„+%d,“,*tlter);
- 82 vecFake.erase(tlter);
- 83 tlter = min_element(vecFake.begin(),vecFake.end());
- 84 printf(„-%d,“,*tlter);
- 85 vecFake.erase(tlter);
- 86 }
- 87 uiFakeFoo = accumulate(vecFake.begin(),vecFake.end(),0);
- 88
- 89 printf(„\n\n>> Summary:\n“);
- 90 printf(„real sum = %d\n“, uiRealFoo);
- 91 printf(„fake sum = %d\n“, uiFakeFoo);
- 92 uint32_t delta = max(uiFakeFoo,uiRealFoo) - min(uiFakeFoo,uiRealFoo);
- 93 printf(„delta = %d\n“, delta);
- 94 float percentage = ((float)delta) / ((float)uiFakeFoo) * 10.0;
- 95 printf(„percent = %f\n\n“,percentage);
- 96 if (percentage>1.5){
- 97 printf(„>>> I AM HOOKED ! :-()\n“);
- 98 }else{
- 99 printf(„>>> everything's OK :-)\n“);
- 100 }
- 101 }
-
Das Listing 2 führt beispielhaft einen Vergleich der Ausführungszeiten der Programmfunktion „strcmp()“ (Vergleich von Zeichenketten) der Standardbibliothek „libc“ bzw. „stdio.h“ mit den Ausführungszeiten einer beispielhaft vorgesehenen eigenen Implementierung einer Funktion für den Vergleich von Zeichenketten, „internal_strcmp()“, vergleiche Zeile 21-26, aus. Die Ausführungszeit der Programmfunktion der Standardbibliothek wird in der Schleife in den Zeilen 49-54 ermittelt, die Ausführungszeit der eigenen Implementierung in den Zeilen 70-76, jeweils wiederum mit 20 Wiederholungen. Wie schon vorstehend unter Bezugnahme auf Listing 1 beschrieben werden jeweils 10 Extremwerte der 20 Wiederholungen verworfen, vergleiche die Zeilen 56-66 bzw. 77-87. Eine Auswertung der verbleibenden Ausführungszeiten erfolgt vorliegend in den Zeilen 92-99.
-
Das erfindungsgemäße Prinzip ermöglicht vorteilhaft den Schutz von Anwendungsprogrammen CP bzw. zugehörigen Laufzeitumgebungen vor Manipulationen an Programmfunktionen, wie sie beispielsweise in Standardbibliotheken (z.B. libc bzw. „stdio.h“ usw.) enthalten sind. Insbesondere kann auf diese Weise auch vergleichsweise neuer Schadsoftware des „root-kit“-Typs begegnet werden, die versucht, die etablierten Standardbibliotheken von Laufzeitumgebungen zu „kapern“ und die darin enthaltenen Programmfunktionen PF, welche von beispielsweise der Anwendersoftware CP aufgerufen werden, durch manipulierte Versionen solcher Programmfunktionen zu ersetzen. Da derartige manipulierte Versionen üblicherweise eine signifikant abweichende Laufzeit bzw. Ausführungszeit im Vergleich zu den Originalversionen aufweisen, kann eine derartige Manipulation unter Anwendung des erfindungsgemäßen Prinzips effizient erkannt werden.
-
Generell ermöglicht die Anwendung des erfindungsgemäßen Prinzips, Angriffe auf Programmfunktionen bzw. entsprechende Laufzeitumgebungen festzustellen, bei denen Manipulationen von Eingabedaten und/oder Ausgabedaten während des Aufrufs der Programmfunktion bzw. der Rückgabe der Ausgabedaten, beispielsweise nach Art einer man-in-the-middle-attack, erfolgen. Insbesondere können Anwendungsprogramme bzw. Computerprogramme geschützt werden, welche möglicherweise auf manipulierte Programmfunktionen bzw. Bibliotheken zugreifen könnten. Das erfindungsgemäße Prinzip nutzt vorteilhaft die Tatsache aus, dass das physikalische Verhalten, insbesondere die Ausführungszeit, einer manipulierten Programmfunktion bzw. Laufzeitumgebung in vielen Fällen nicht sinnvoll verschleiert werden kann.
-
Bei der Recheneinheit 100 kann es sich bei bevorzugten Ausführungsformen beispielsweise um eine Recheneinheit eines eingebetteten Systems (Englisch: embedded system) handeln, oder auch um eine Recheneinheit (z.B. CPU, Prozessor, Mikrocontroller, digitaler Signalprozessor, usw.) eines andersartigen Systems, beispielsweise auch eines Personalcomputers.
-
Während konventionelle Sicherheitsmaßnahmen betreffend Software-Sicherheit sich derzeit üblicherweise ausschließlich auf einen Quellcode oder andere Varianten wie beispielsweise Binärcode von Anwendungsprogrammen beziehen, berücksichtigt das erfindungsgemäße Prinzip mögliche Manipulationen von Standardbibliotheken und Laufzeitumgebungen und deren Erkennung.
-
Das erfindungsgemäße Prinzip kann sehr flexibel und bedarfsgerecht eingesetzt werden. Beispielsweise kann ein Softwareentwickler, der das Computerprogramm CP entwickelt, festlegen, welche Aufrufe bzw. Programmfunktionen PF unter Anwendung des erfindungsgemäßen Prinzips abzusichern sind. Es ist bei manchen Ausführungsformen beispielsweise denkbar, dass weniger wichtige Programmfunktionen nicht durch das erfindungsgemäße Prinzip abgesichert werden, wohingegen wichtigere Programmfunktionen abgesichert werden. Eine dynamische Festlegung, wann das erfindungsgemäße Prinzip Anwendung findet, ist anderen Ausführungsformen zufolge ebenfalls denkbar, beispielsweise während der Laufzeit des Computerprogramms CP, beispielsweise in Abhängigkeit von ein oder mehreren Betriebsparametern des Computerprogramms CP oder der Recheneinheit 100. Beispielsweise kann vorgesehen sein, dass die erfindungsgemäße Absicherung bei manchen Ausführungsformen immer dann für gewisse Funktionsaufrufe vorgesehen ist, wenn die Recheneinheit in einem bestimmten Zielsystem integriert ist, was beispielsweise aufgrund von Kommunikationsmustern oder sonstigen Betriebsparametern der Recheneinheit 100 erkannt werden kann.
-
Besonders vorteilhaft bedingt die Anwendung des erfindungsgemäßen Prinzips vergleichsweise wenig Zusatzaufwand, insbesondere bezüglich der Ausführungszeit des Computerprogramms CP, weil effiziente Befehle und Mechanismen zur präzisen Zeitmessung wie beispielsweise Präzisionstimer häufig bereits in aktuellen Recheneinheiten 100 integriert sind. Der Programmieraufwand ist ebenfalls vergleichsweise gering, vergleiche die vorstehend beispielhaft beschriebenen Listings 1, 2.
-
Des Weiteren ist das erfindungsgemäße Prinzip auch dann effizient nutzbar, wenn sich die Laufzeitumgebung bzw. die Programmbibliothek(en) ändern. In diesem Fall sind lediglich entsprechend aktualisierte Messwerte bzw. Sollwerte für die Ausführungszeiten bereitzustellen.