Vor vielen, vielen Jahren (1984 um genau zu sein) veröffentlichte Ken Thompson eine Dankesrede für den Turing Award. Dieses Paper mit dem Titel "Reflections on Trusting Trust" sollte als eins der grundlegenden Paper in die Geschichte der Computersicherheit eingehen (genau genommen beschreibt das Paper lediglich die Arbeit von Paul Karger und Roger Schell, die die vorgestellte Attacke bereits 1974 formuliert hatten). Thompson beschreibt darin ein Dilemma, dem die Analyse eine sicheren Systems unterliegt: Mensch und Maschine verstehen unterschiedliche Sprachen. Der Quelltext eines Programms, welcher vom Menschen zu lesen ist, wird von der Maschine nicht verstanden. Diese versteht lediglich einen Binärcode, den wiederum der Mensch nicht (bzw. nahezu nicht) lesen kann. Die Übertragung von Quell- in Maschinencode geschieht durch Compiler.
Thompsons Idee basiert nun auf dem Problem des Bootstrappings: irgendwann muss der Prozess des kompilierens mal gestartet werden. Es muss also mal ein erster Compiler existieren, der diesen ersten Vorgang vornimmt. Dieser muss wiederum in Maschinencode vorliegen, denn sonst könnte ihn die Maschine nicht ausführen. An dieser Stelle setzt Thompson an und formuliert die Idee eine "bösen" Compilers, welcher bei der Übertragung vom Quell- in den Maschinencode die entstehende Software infiziert (mit einer Hintertür oder was auch immer). Diese ist so ausgelegt, daß sie, wenn der Compiler sich selbst übersetzen muss, dazu führt, daß die Routine zur Erzeugung der Hintertür wieder in den Compiler eingebaut wird (für genauere Ausführungen schaue man einfach in das Paper). An dieser Stelle hat man bei der Analyse eines sicheren Systems nun ein Problem: entweder man vertraut diesem ersten Compiler und kann dann (theoretisch) allen weiteren Quellcode analysieren um so sicherzustellen, daß das System keine Hintertüren hat oder man kann ihn nicht verwenden (der paranoide Ansatz lautet dann hier: man kann keinen verwenden, denn es könnte ja jeder eine Lücke haben). Sicherheit, die auf Analyse basieren will, hat mit Vertrauen so ihre Schwierigkeiten. Das Problem des "bösen" Compilers blieb lange ungelöst. Bis jetzt...
Im Dezember 2005 veröffentlichte David A. Wheeler "Countering Trusting Trust through Diverse Double-Compiling", ein Paper, welches die Lösung des beschriebenen Problems darstellt. Schaut man sich an, wie trivial diese Lösung ist, so kann man nur den Kopf schütteln, das man nicht früher drauf gekommen ist. Die Idee ist folgende:
Nehmen wir an, wir haben zwei Compiler (als Binaries) A und B und den Quellcode Sa von A. Wir kompilieren nun Sa sowohl mit A, als auch mit B und erhalten Ca und Cb. Diese beiden Binaries dürften unterschiedlich sein, da sie mit verschiedenen Compilern erzeugt wurden. Durch unterschiedliche Optimierungsstrategien etc. können sie sich auf Byteebene unterscheiden. Sie sind allerdings funktional äquivalent, will heißen: sie tun exakt dasselbe (zumindest sollten sie das). Nun kompilieren wir Sa nochmal mit Ca und mit Cb. Hieraus resultieren dann die Binaries Ea und Eb. Da Ca und Cb funktional absolut identisch sein sollten, sollten auch Ea und Eb bitgenau gleich sein. Sind sie es nicht, so ist entweder A oder B nicht vertrauenswürdig und muss verworfen werden. Ersetzt man B nun durch einen vertrauenswürdigen Compiler T, so kann man prüfen, ob A vertrauenswürdig ist. Der vertrauenswürdige Compiler wird in diesem Modell lediglich verwendet, um Sa zu übersetzen. Es ist vollkommen egal, wie langsam der ist und ob der irgendwelche Optimierungen etc. beherrscht. Er kann also so einfach, wie möglich gebaut werden, im Extremfall direkt in Maschinensprache. Man hat auf diese Art und Weise das Problem aus dem Ursprungspaper gelöst: es besteht wieder ein direkter Zusammenhang zwischen dem vom Quellcode beschriebenen Verhalten und dem ausgeführten Code auf dem Prozessor. Für einen Menschen ist die Analyse des Quellcodes unendlich viel einfacher, als die des Maschinencodes. Über 30 Jahre nach der Formulierung des ursprünglichen Problems gibt es nun eine Lösung und diese ist auch noch so einfach und leicht nachvollziehbar. Meinen Respekt, Mr. Wheeler...
Quellen:
- http://www.acm.org/classics/sep95/
- http://www.acsa-admin.org/2005/papers/47.pdf
- http://www.schneier.com/blog/archives/2006/01/countering_trus.html