-
Die
Erfindung betrifft ein Verfahren zur Überwachung der bestimmungsgemäßen
Ausführung eines Programms durch einen Prozessor, der auf
einen Speicher zugreift. Die Erfindung betrifft weiterhin einen
Prozessor sowie einen tragbaren Datenträger. Speziell ist
die Erfindung für Anwendungen vorgesehen, bei denen Aspekte
der Sicherheit und Korrektheit der ausgeführten Programme
sowie der Zuverlässigkeit der Programmausführung
besondere Bedeutung haben.
-
Typischerweise
umfasst ein auf einem Prozessor ablaufendes Programm mehrere Funktionen,
die von einem Hauptprogramm aufgerufen werden. Die Funktionen oder
Unterprogramme werden mit spezifischen Programmbefehlen, z. B. CALL,
ECALL, usw., aufgerufen. Techniken zur Ausführung von Unterprogrammen sind
in vielfältigen Ausgestaltungen gut bekannt. Bei der Ausführung
eines Unterprogramm-Aufrufbefehls CALL wird unter anderem der aktuelle
Stand des Programmzählers in einem Stapelspeicher gespeichert.
Die Programmausführung wird dann an einer in dem Unterprogramm-Aufrufbefehl
angegebenen Adresse fortgesetzt. Sobald im Zuge der Unterprogrammausführung
der erste Unterprogramm-Rücksprungbefehl, z. B. RET, erkannt
wird, wird der Programmzähler mit dem jüngsten
Eintrag im Stapelspeicher geladen. Dieser Eintrag wird aus dem Stapelspeicher
entfernt, indem der Stapelzeiger entsprechend geändert,
beispielsweise dekrementiert, wird. Die Wirkung des Unterprogramm-Rücksprungbefehls
ist somit, dass die Programmausführung im aufrufenden Programm
mit demjenigen Befehl fortgesetzt wird, der dem Unterprogramm-Aufrufbefehl
folgt.
-
Wird
der Ablauf des Programms, z. B. durch einen Lichtangriff, gestört,
so kann es passieren, dass ein Unterprogramm-Aufruf erzeugt wird,
der nicht auf der korrekten Anfangsadresse des aufgerufenen Unterprogramms
landet. Alternativ ist es möglich, dass Aufrufe erzeugt
werden, die an sich innerhalb des korrekten Programmablaufs nicht
zugelassen sind.
-
Aus
der
DE 102 52 347
A1 ist ein Verfahren bekannt, bei dem während
des Programmablaufs zumindest eine Plausibilitätsüberprüfung
hinsichtlich der Zuordnung eines auszuführenden Unterprogramm-Rücksprungbefehls
zu einem vom Programmierer vorgesehenen Aufrufbefehl vorgenommen
wird. Dazu wird beim Aufruf eines Unterprogramms nicht nur die Rücksprung-Zieladresse,
sondern auch eine Rücksprungbefehlsadresse in einem Stapelspeicher
abgelegt. Aus der Rücksprungbefehlsadresse lässt
sich durch Auswerten einer vorgegebenen Beziehung ableiten, an welcher
Stelle gemäß der Intention des Programmierers
der zu dem gegenwärtig ausgeführten Unterprogramm-Aufrufbefehl
gehörige Unterprogramm-Rücksprungbefehl bei korrekter
Programmausführung zu erwarten ist. Beide genannten Adressen
werden im Stapelspeicher abgelegt. Bei der Abarbeitung jedes Unterprogramm-Rücksprungbefehls
wird überprüft, ob die Speicheradresse dieses Befehls
in der vorgegebenen Beziehung zu der im Stapelspeicher befindlichen
Rücksprungbefehlsadresse steht. Nachteilig hieran ist,
dass keine Überprüfung stattfindet, ob die Ausführung
eines Unterprogramms überhaupt zulässig ist.
-
Aus
der
WO 98/32072 A1 ist
ein Verfahren zur Überwachung der bestimmungsgemäßen
Ausführung von Softwareprogrammen bekannt, bei dem das Überschreiben
von zur späteren Verwendung gespeicherten Rücksprungadressen
und/oder die Verwendung von fehlerhaft gespeicherten oder überschriebenen
Rücksprungadressen als Rücksprungadresse verhin dert
werden. Auch das in dieser Veröffentlichung beschriebene Verfahren
bietet jedoch keinen ausreichenden Schutz für einen fehlerhaften
oder unerlaubten Unterprogrammaufruf.
-
Schließlich
ist aus der
EP 1 507
185 A1 ein Verfahren bekannt, gemäß dem
in einem aufrufbaren Unterprogramm ein Verweis auf das aufrufende
Programm enthalten ist, so dass eine Überprüfung
durchführbar ist, ob der Aufruf des Unterprogramms in erlaubter
Weise erfolgt. Zu Beginn eines Unterprogramms können hierbei
mehrere Kommandos mit erlaubten Sprungquellen hintereinander vorgesehen
sein, um den Einsprung in das Unterprogramm von verschiedenen Stellen
des Hauptprogramms zu ermöglichen. Nachteilig an der in dieser
Druckschrift vorgetragenen Lösung ist jedoch die statische
Zuordnung von Sprungquellen zu aufgerufenen Unterprogrammen.
-
Es
ist daher Aufgabe der vorliegenden Erfindung, ein Verfahren zur Überwachung
der bestimmungsgemäßen Ausführung eines
Programms anzugeben, das eine Überprüfung erlaubt,
ob der Aufruf eines Unterprogramms korrekt und zuverlässig
erfolgt. Es ist weiterhin Aufgabe der vorliegenden Erfindung, einen
Prozessor zur Durchführung des erfindungsgemäßen
Verfahrens sowie einen tragbaren Datenträger mit einem
erfindungsgemäßen Prozessor anzugeben.
-
Diese
Aufgaben werden gelöst durch ein Verfahren mit den Merkmalen
des Patentanspruches 1, einen Prozessor mit den Merkmalen des Patentanspruches
12 sowie einen tragbaren Datenträger mit den Merkmalen
des Patentanspruches 13.
-
Die
Erfindung schafft ein Verfahren zur Überwachung der bestimmungsgemäßen
Ausführung eines Programms durch einen Prozessor, der auf
einen Speicher zugreift. Bei dem Verfahren ist in dem Speicher eine
Tabelle vorgesehen oder wird dort angelegt, in welcher Tabelle einem
aufrufbaren Unterprogramm oder einer aufrufbaren Zieladresse zugeordnete
Identifikatoren eines aufrufenden Programms oder einer aufrufenden
Adresse gespeichert werden. Vor dem Sprung in das Unterprogramm
wird mittels der Tabelle geprüft, ob das aufrufende Programm
oder die aufrufende Adresse in der Tabelle dem Unterprogramm oder
der aufrufbaren Zieladresse zugeordnet ist. Wenn die Zuordnung korrekt
ist, wird das Unterprogramm ausgeführt. Wenn die Zuordnung
nicht besteht, wird eine Fehlerbehandlungsroutine aufgerufen.
-
Das
erfindungsgemäße Verfahren ermöglicht
einen korrekten Programmablauf hinsichtlich des Aufrufs von Unterprogrammen.
Der Programmablauf wird durch das erfindungsgemäße
Verfahren ständig auf Korrektheit bei Sprüngen
in Unterprogramme oder von Unterprogrammen zurück in ein
aufrufendes Programm überprüft. Insbesondere ist
ein sog. Ausblitzen von Sprüngen bzw. ein Überspringen
von Unterprogrammen nicht mehr möglich. Hierdurch wird
die Sicherheit des Ablaufs des Programms verbessert. So kann beispielsweise
durch einen Lichtangriff kein ungewollter Programmablauf gestartet
werden bzw. es können keine unzulässigen Teilabschnitte
ausgeführt werden. Die Zuordnung von Identifikatoren oder
Adressen eines aufrufenden Programms zu einem aufrufbaren Unterprogramm
oder einer aufrufbaren Zieladresse in einer Tabelle ermöglicht
eine große Flexibilität im Rahmen der Erstellung
des Programms. Darüber hinaus lässt sich der Programmablauf
mit einer hohen Effizienz durchführen.
-
In
einer Ausgestaltung der Erfindung ist in der Tabelle das Unterprogramm
oder die aufrufbare Zieladresse als überprüfbarer
Tabellenname gespeichert oder wird dort gespeichert.
-
Ferner
ist gemäß einer weiteren Ausgestaltung der Stand
des Programmzählers oder eine Checksumme eines Programmcodes
des aufrufenden Programms in der Tabelle gespeichert oder wird in
dieser gespeichert. Anstelle der Verwendung von Adressen eines Programmzählers
können auch Checksummen zur Überprüfung
des korrekten Programmablaufs verwendet werden. Diese Checksummen
können beispielsweise aus Codebereichen (z. B. Opcode-Fetch)
des Unterprogramms bzw. des aufrufenden Programms (Hauptprogramm)
gebildet werden.
-
Dem
Eintrag des aufrufenden Programms oder der aufrufenden Adresse ist
eine vorgegebene Adresse innerhalb der Tabelle zugeordnet, in der
ein vorgegebener Wert gespeichert ist, wenn keine Adresse des aufrufenden
Programms innerhalb der Adresse der Tabelle eingespeichert ist.
Durch diese zusätzliche Überprüfung kann
die Sicherheit des korrekten Programmablaufs weiterhin verbessert
werden. Insbesondere wird vor dem Abspeichern der Adresse des aufrufenden
Programms überprüft, ob der vorgegebene Wert in
der Speicheradresse der Tabelle enthalten ist, wobei im positiven
Fall die Adresse des aufrufenden Programms in die Speicheradresse
der Tabelle eingeschrieben wird und im negativen Fall auf eine fehlerhafte
Programmausführung geschlossen wird. Erst nach erfolgreicher Überprüfung
der Sprungquelle im Unterprogramm wird der entsprechende Adresswert
in die Tabelle geschrieben.
-
Gemäß einer
alternativen Ausgestaltung umfasst die Tabelle für jedes
aufrufende Unterprogramm eine Rücksprungadresse zu dem
aufrufenden Pro gramm. Dabei wird überprüft, ob
die Rücksprungadresse in dem Speicher, insbesondere einem
Stapelspeicher oder einem nichtflüchtigen Speicher (NVM),
gespeichert ist. Ist dies der Fall, wird die aufgerufene Unterfunktion
durchlaufen. Andernfalls wird der Programmablauf gesperrt oder eine
Fehlermeldung ausgegeben.
-
In
einer weiteren Ausbildung wird vor dem Rücksprung in das
aufrufende Programm überprüft, ob die Rücksprungadresse
in dem Speicher mit der im Programmablauf des Unterprogramms aufgerufenen
Rücksprungadresse übereinstimmt. Diese zweite Überprüfung
ist zweckmäßig, da es auch möglich ist, über
einen Lichtangriff mitten in ein Unterprogramm einzuspringen und
dieses teilweise auszuführen.
-
Alternativ
wird bei einem Aufruf eines Unterprogramms durch das aufrufende
Programm die Adresse des aufrufenden Programms beim Aufruf dem Unterprogramm übergeben
und in dem Speicher abgespeichert. Dabei wird zweckmäßigerweise
ein Vergleich zwischen der übergebenden und abgespeicherten
(Einsprung-)Adresse und dem Programmzähler vorgenommen,
wobei das Unterprogramm fortgesetzt wird, wenn bei dem Vergleich
eine Übereinstimmung der Adressen festgestellt wurde. Das
Unterprogramm wird nicht fortgesetzt, wenn bei dem Vergleich die Übereinstimmung
der Adressen nicht festgestellt werden konnte.
-
Zusätzlich
kann bei einem Rücksprung von dem Unterprogramm zu dem
aufrufenden Programm überprüft werden, ob der
Aufruf der Unterfunktion korrekt erfolgte. Insbesondere wird hierbei überprüft,
ob der Funktionsaufruf zulässig war, da, wie bereits erwähnt,
auch ein Sprung in die Mitte der Funktion erfolgen kann. Für
diese Überprüfung kann beispielsweise die Ü berprüfung
auf das Vorliegen eines festen Werts erfolgen, da der Startpunkt,
d. h. die Startadresse, des Unterprogramms bekannt ist.
-
Die
Erfindung schafft ferner einen Prozessor, der dazu eingerichtet
ist, ein Verfahren nach einem der vorherigen Ansprüche
auszuführen. Darüber hinaus schafft die Erfindung
einen tragbaren Datenträger, insbesondere eine Chipkarte
oder ein Chipmodul, der einen erfindungsgemäßen
Prozessor aufweist.
-
Die
Erfindung wird nachfolgen näher anhand der Figuren beschrieben.
Es zeigen:
-
1 ein
Blockdiagramm eines tragbaren Datenträgers, der einen Prozessor
nach einem Ausführungsbeispiel der Erfindung aufweist,
und
-
2 einen
beispielhaften Programmablauf des erfindungsgemäßen
Verfahrens.
-
In 1 ist
ein tragbarer Datenträger 10 gezeigt, der beispielsweise
als Chipkarte oder Chipmodul ausgebildet ist. In an sich bekannter
Weise enthält der Datenträger 10 einen
Halbleiterchip, auf dem ein Prozessor 12, ein Speicher 14 und
eine Schnittstelle 16 zur drahtgebundenen oder drahtlosen
Kommunikation ausgebildet sind. Der Speicher 14 weist mehrere
unterschiedliche Bereiche auf, nämlich im vorliegenden
Ausführungsbeispiel einen als RAM ausgestalteten Arbeitsspeicher 18,
einen als EEPROM ausgestalteten nichtflüchtigen Speicher 20 und
einen als maskenprogrammiertes ROM ausgestalteten Festwertspeicher 22.
-
Der
Festwertspeicher 22 enthält wesentliche Teile
des Betriebssystems des Datenträgers 10 und der von
diesem Betriebssystem ausgeführten Programme. Zwei Programmabschnitte
sind in 1 beispielhaft gezeigt, nämlich
ein aufrufendes Programm oder Hauptprogramm 24 und ein
aufgerufenes Programm oder Unterprogramm 26. Der Prozessor 12 weist
einen in Form eines Prozessorregisters ausgestalteten Programmzähler 28 auf,
welcher die Adresse des jeweils ausgeführten oder auszuführenden
Programmbefehls angibt. Weitere Abschnitte der auszuführenden
Programme können im nichtflüchtigen Speicher 20 enthalten
sein. Primär befinden sich in diesem Speicher 20 jedoch
ein Dateisystem, auf das die Programme zugreifen, sowie weitere
von dem Betriebssystem verwaltete Daten.
-
Die
Begriffe „Hauptprogramm” und „Unterprogramm” bezeichnen
vorliegend lediglich die Beziehung der Programmabschnitte 24 und 26 relativ
zueinander. Es versteht sich, dass das Hauptprogramm 24 seinerseits
von einem übergeordneten Programmabschnitt aufgerufen werden
kann, und dass das Unterprogramm 26 seinerseits weitere
Unterprogramme aufrufen kann und somit für diese weiteren
Unterprogramme als Hauptprogramm anzusehen ist.
-
Der
Arbeitsspeicher 18 dient zur temporären Aufnahme
von Werten während Berechnungsvorgängen. Insbesondere
ist im Arbeitsspeicher 18 ein Stapelspeicher 30 (stack)
angelegt, der unter anderem Unterprogramm-Rücksprungadressen
enthält. Der aktuelle Füllungsgrad des Stapelspeichers 30 – also
in unterschiedlichen Ausführungsformen entweder der jüngste
Eintrag oder der erste noch freie Speicherplatz – wird
durch einen Stapelzeiger 32 angegeben, der als Register
des Prozessors 12 ausgestaltet ist.
-
Das
erfindungsgemäße Verfahren ermöglicht
sichere Programmsprünge von einem aufrufenden Programm
zu einem aufrufbaren Unterprogramm, und umgekehrt, beispielsweise
unter Verwendung der Mikrocontrollerbefehle JMP und CALL. Ein typischer
Programmablauf ist beispielhaft nachfolgend dargestellt:
MOV
R6, #0×01 | |
MOV
R7, #0×FF | |
CALL
Test_Param | ;
Aufruf des Unterprogramms |
CJNE
R7, #0×34, WrongResult | |
MOV
Result, R7 | |
RET | |
| |
WrongResult: | |
SJMP
$ | ;
Endlosschleife |
-
Wird
der Programmablauf z. B. über einen Lichtangriff gestört,
so wird der Unterprogrammaufruf Test_Param und die Überprüfung
(CJNE) übersprungen.
-
Ein
anderes typisches Unterprogramm schaut beispielsweise wie folgt
aus:
PIN_CHECK: |
MOV
A, R6 |
XRL
A, R7 |
JNZ
WrongPin |
CALL
PIN_IS_VALID |
RET |
WrongPin: |
MOV
R7, #0×FF |
RET |
-
Wird
das Unterprogramm PIN_CHECK ausgeführt, so findet keine Überprüfung
statt, ob der Aufruf zulässig ist. Um den Aufruf des Unterprogramms
mittels des Befehls CALL oder JMP sicher zu machen, wird vor dem
Programmsprung der Wert des aktuellen Programmzählers in
einem Speicherbereich, z. B. dem Register, dem Stack oder einem
nichtflüchtigen Speicher, gesichert. Dies kann beispielsweise
wie folgt erfolgen:
MOV R2,
#0×01 |
MOV R3,
#0×FF |
|
MOV R6,
#High SPRUNG_QUELLE |
MOV R5,
#Low SPRUNG_QUELLE |
SPRUNG_QUELLE: |
CALL
Test_Param | ;
Aufruf des Unterprogramms |
CJNE R7,
#0×34, WrongResult |
MOV Result,
R7 |
RET |
|
WrongResult: |
SJMP
$ | ;
Endlosschleife |
-
Beim
Einsprung in die Unterprogrammfunktion wird überprüft,
ob der Funktionsaufruf zulässig ist. Diese Überprüfung
findet mittels einer (nicht dargestellten) Tabelle statt, die beispielsweise
in dem nichtflüchtigen Speicherbereich abgespeichert ist.
Wird in der Tabelle festgestellt, dass die Ad resse des aufrufenden
Programms vorhanden ist, so wird der Aufruf des Unterprogramms akzeptiert
und die Programmabarbeitung fortgesetzt. Andernfalls wurde ein unzulässiger
Sprung erkannt, woraufhin die Programmabarbeitung eingestellt wird.
Ein beispielhafter Programmablauf für die Überprüfung
ist nachfolgend dargestellt:
CheckJMP_CALL_ADDR: | |
MOV
DPTR, #TABELLE | ;
Laden der TABELLEN-Adresse |
CLR
A | |
MOVC
A, @A + DPTR | ; Überprüfung
ob Tabelle zum Unterpro |
MOV
R0, SP | ;
gramm gehört |
XRL
A, @R0 | ;
Test_Param_Start(High-Byte) |
MOV
R1, A | |
INC
DPTR | |
DEC
R0 | |
CLR
A | |
MOVC
A, @A + DPTR | |
XRL
A, @R0; | ;
Test_Param_Start(Low-Byte) |
XRL
A, R1 | |
JNZ
NO_TABLE_FOUND | |
Check_Entry: | ; Überprüfung
der Sprungquelle |
INC
DPTR | |
CLR
A | |
MOVC
A, @A + DPTR | |
XRL
A, R6 | ;
Sprungquelle (High-Byte) |
MOV
R1, A | |
INC
DPTR | |
CLR
A | |
MOVC
A, @A + DPTR | |
XRL
A, R5 | ;
Sprungquelle (Low-Byte) |
XRL
A, R1 | |
JNZ
NO_TABLE_FOUND | ;
kein gültiger Eintrag gefunden |
RET | |
| |
NO_TABLE_FOUND: | |
SJMP
$ | |
-
Eine
weitere Überprüfung besteht darin, dass für
den Eintrag der Sprungquelle eine feste RAM-/NVM-Adresse zugeordnet
wird. In dieser steht, wenn keine Adresse hinterlegt ist, beispielsweise
der Wert 0×55AA. Soll nun die Adresse des aufrufenden Programms
(Sprungquelle) abgespeichert werden, wird zunächst überprüft,
ob der vordefinierte Wert 0×55AA in diesem Speicher liegt.
Ist dies nicht der Fall, wurde eine fehlerhafte Programmausführung
durchgeführt und der Programmablauf abgebrochen oder eine
Fehlerbehandlungsroutine durchgeführt. Nach erfolgreicher Überprüfung
der Adresse des aufrufenden Programms im aufgerufenen Unterprogramm
wird die Adresse des aufrufenden Programms in die RAM-/NVM-Adresse
geschrieben. Dabei können anstatt der Adressen des Programmzählers
auch Checksummen zur Überprüfung verwendet werden.
Diese Checksummen können aus Codebereichen (z. B. Opcode-Fetch)
des Unterprogramms bzw. des Aufrufers gebildet werden.
-
In
einer anderen Ausgestaltung ist es zweckmäßig,
wenn für jedes aufzurufende Unterprogramm eine Tabelle
erstellt wird, die die Rücksprungadressen zu der bzw. den
aufrufenden Hauptprogrammen enthält. Wird nun ein Unterprogramm
aufgerufen, wird zunächst überprüft,
ob die Rücksprungadresse in dem Stapelspeicher für
den jeweiligen CALL vorhanden ist. Ist dies der Fall, so wird das
Unterprogramm durchlaufen. Andernfalls wird der Programmablauf gesperrt
oder eine Fehlermeldung ausgegeben. Vor dem Rücksprung
aus dem aufgerufenen Unterprogramm wird zweckmäßigerweise
nochmals überprüft, ob die Rücksprungadresse auf
dem Stapelspeicher mit der Adresse des aufrufenden Programms übereinstimmt.
Diese zweite Überprüfung ist zweckmäßig,
da es auch möglich ist, über einen Lichtangriff
mitten in ein ausgeführtes Unterprogramm einzuspringen
und dieses teilweise auszuführen.
-
Alternativ
zu der Tabelle mit den Rücksprungadressen kann auch ein
Verfahren eingesetzt werden, bei dem die Adresse des aufrufenden
Programms beim Aufruf mit übergeben wird. Die Adresse für
die Startadresse des aufgerufenen Unterprogramms kann z. B. auf
dem Stapelspeicher abgespeichert werden. Beim Einsprung in das Unterprogramm
wird zunächst die abgespeicherte Einsprungadresse mit dem
aktuellen Wert des Programmzählers (Programmcounter PC)
verglichen. Ist diese Adresse korrekt, wird das Programm fortgesetzt.
Andernfalls wird das Programm beendet bzw. eine Fehlermeldung ausgegeben
oder ein NME ausgelöst.
-
Auch
hier kann bei einem Rücksprung zuerst nochmals eine Überprüfung
durchgeführt werden, ob der Funktionsaufruf zulässig
war. Dies wird vorzugsweise deshalb durchgeführt, da, wie
bereits erwähnt, auch ein Sprung in die Mitte des Unterprogramms
erfolgen kann. Für diese Überprüfung
kann auf einen festen Wert abgeprüft werden, da der Startpunkt
des Unterprogramms bekannt ist.
-
In 2 ist
der schematische Ablauf des erfindungsgemäßen
Verfahrens zur Überwachung der bestimmungsgemäßen
Ausführung eines Programms durch einen Prozessor dargestellt.
Gemäß einem Schritt S1 wird eine Tabelle angelegt,
in der einem Unterprogramm (oder einer aufrufbaren Zieladresse) Adressen
eines aufrufenden Programms oder einer aufrufenden Adresse zugeordnet
und gespeichert werden. Gemäß Schritt S2 erfolgt
vor dem Sprung in das Unterprogramm eine Überprüfung,
ob das aufrufende Programm dem Unterprogramm zugeordnet ist. In
Schritt S3 wird überprüft, ob die Zuordnung korrekt
ist. Ist dies der Fall, so wird in Schritt S4 das Unterprogramm
ausgeführt. Ist die Zuordnung falsch, so wird gemäß Schritt
S5 eine Fehlerbehandlungsroutine aufgerufen.
-
ZITATE ENTHALTEN IN DER BESCHREIBUNG
-
Diese Liste
der vom Anmelder aufgeführten Dokumente wurde automatisiert
erzeugt und ist ausschließlich zur besseren Information
des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen
Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt
keinerlei Haftung für etwaige Fehler oder Auslassungen.
-
Zitierte Patentliteratur
-
- - DE 10252347
A1 [0004]
- - WO 98/32072 A1 [0005]
- - EP 1507185 A1 [0006]