Ist Ken Thompsons Compiler-Hack immer noch eine Bedrohung?


156

Ken Thompson Hack

Ken Thompson beschrieb 1984 eine Methode zur Beschädigung einer Compiler-Binärdatei (und anderer kompilierter Software, z. B. eines Anmeldeskripts auf einem * nix-System). Ich war gespannt, ob die moderne Kompilierung diese Sicherheitslücke geschlossen hat oder nicht.

Kurze Beschreibung:

Schreiben Sie den Compiler-Code neu, um 2 Fehler zu enthalten:

  • Beim Kompilieren seiner eigenen Binärdatei muss der Compiler diese Fehler kompilieren
  • Beim Kompilieren eines anderen vorgewählten Codes (Login-Funktion) muss eine beliebige Backdoor kompiliert werden

Somit funktioniert der Compiler normal - wenn er ein Anmeldeskript oder ähnliches kompiliert, kann er eine Sicherheits-Backdoor erstellen, und wenn er in Zukunft neuere Versionen von sich selbst kompiliert, behält er die vorherigen Fehler bei - und die Fehler existieren nur im Compiler binär sind also extrem schwer zu erkennen.

Fragen:

Ich konnte im Internet keine Antworten auf diese Fragen finden:

  • In welcher Beziehung steht dies zur Just-in-Time-Kompilierung?
  • Werden Funktionen wie das Programm, das Anmeldungen auf einem * nix-System verarbeitet, kompiliert, wenn sie ausgeführt werden?
  • Ist dies immer noch eine gültige Bedrohung, oder hat es seit 1984 Entwicklungen in der Sicherheit der Zusammenstellung gegeben, die verhindern, dass dies ein bedeutendes Problem darstellt?
  • Betrifft das alle Sprachen?

Warum will ich es wissen?

Ich bin darauf gestoßen, als ich einige Hausaufgaben gemacht habe, und es schien interessant, aber mir fehlt der Hintergrund, um konkret zu verstehen, ob es sich um ein aktuelles oder ein gelöstes Problem handelt.

Referenzmaterial


6
Die Diverse Double Compiling-Strategie ist eine relativ zuverlässige Methode, um das Vorhandensein eines RoTT-manipulierten Compilers zu erkennen.
dmckee

3
Ich stelle mir vor, die NSA hat viel Arbeit in diese Art von Angriff gesteckt.
Paul M

Antworten:


110

Dieser Hack muss im Kontext verstanden werden. Es wurde zu einer Zeit und in einer Kultur veröffentlicht, in der Unix auf allen Arten von Hardware das vorherrschende System war.

Was den Angriff so beängstigend machte, war, dass der C-Compiler das zentrale Softwareelement für diese Systeme war. Fast alles im System durchlief bei der Erstinstallation den Compiler (Binärdistributionen waren aufgrund der heterogenen Hardware selten). Jeder hat die ganze Zeit Sachen zusammengestellt. Die Leute haben den Quellcode regelmäßig überprüft (sie mussten oft Anpassungen vornehmen, um ihn überhaupt kompilieren zu können), sodass das Einfügen von Hintertüren durch den Compiler eine Art "perfektes Verbrechensszenario" zu sein schien, in dem man nicht gefasst werden konnte.

Heutzutage ist Hardware viel kompatibler und Compiler spielen daher eine viel geringere Rolle im täglichen Betrieb eines Systems. Ein kompromittierter Compiler ist nicht mehr das gruseligste Szenario - Rootkits und ein kompromittiertes BIOS sind noch schwerer zu erkennen und loszuwerden.


27
Oder, da die meisten Leute nichts aus dem Quellcode kompilieren (sagen wir mal unter Windows), reicht ein durchschnittlicher Trojaner :) (Ich bin damit einverstanden, dass ein kompromittierter Compiler viel zu viel kostet)
Andres F.

16
@ArjunShankar: Ein nicht freier proprietärer reiner Binärcompiler benötigt diese Hintertür nicht und kann sie auch nicht haben . Diese Hintertür gilt nur für Compiler, die Sie selbst aus dem Quellcode kompilieren.
Ruakh

12
Mit Ausnahme des Desktops ist Unix und alle seine Varianten nach wie vor das dominierende Betriebssystem.
Rob

7
@ruakh: Vielleicht verstehe ich Ihre Betonung auf "dies" nicht, aber ich bin nicht einverstanden. Wenn diese Hintertür in dem Unternehmen eingeführt wurde, das zufällig den nicht-freien, proprietären Compiler besitzt, und diesen Compiler zum Kompilieren neuer Versionen desselben Compilers verwendet, hat diese Hintertür eine viel schlechtere Auswirkung als im ursprünglichen Szenario. Sie benötigen nur einen Angriffsvektor, um alle zu infizieren.
Orithena

8
Stellen Sie sich vor, jemand kompromittiert einen Ubuntu-Build-Server und ersetzt den Compiler, ohne die Quelle zu ändern. Es kann eine Weile dauern, bis dies herausgefunden wird, und bis dahin werden Ubuntu-Images mit dem darin eingebauten kompromittierten Compiler (zusammen mit den kompromittierten Login-Assemblys oder was haben Sie?) An alle Benutzer verteilt. Ich denke, das ist immer noch ein durchaus berechtigtes Anliegen.
Jimmy Hoffa

74

Der Zweck dieser Rede bestand nicht darin, eine Schwachstelle hervorzuheben, die behoben werden muss, oder sogar eine theoretische Schwachstelle vorzuschlagen, deren wir uns bewusst sein müssen.

Der Zweck war, dass wir in Bezug auf Sicherheit niemandem vertrauen müssen, aber das ist leider unmöglich. Man muss immer jemandem vertrauen (daher der Titel: "Reflections On Trusting Trust")


Selbst wenn Sie der paranoide Typ sind, der seine Desktop-Festplatte verschlüsselt und es ablehnt, Software auszuführen, die Sie nicht selbst kompiliert haben, müssen Sie Ihrem Betriebssystem dennoch vertrauen. Auch wenn Sie das Betriebssystem selbst kompilieren, müssen Sie dem verwendeten Compiler vertrauen. Und selbst wenn Sie Ihren eigenen Compiler kompiliert, Sie noch brauchen zu vertrauen , dass die Compiler! Und das erwähnen nicht einmal die Hardware-Hersteller!

Man kommt einfach nicht damit davon, niemandem zu vertrauen . Das ist der Punkt, an dem er versucht hat rüberzukommen.


2
Wenn Sie einen Open-Source-Compiler haben, dessen Verhalten nicht von einem von der Implementierung definierten oder nicht festgelegten Verhalten abhängt, kompilieren Sie ihn mit einer Reihe unabhängig entwickelter Compiler (vertrauenswürdig oder nicht) und kompilieren Sie dann ein Programm mit allen verschiedenen kompilierten Versionen von In diesem Open-Source-Modus sollte jeder Compiler genau die gleiche Ausgabe produzieren. Wenn sie dies tun, würde dies bedeuten, dass der einzige Weg, wie ein Trojaner in einem sein könnte, der wäre, wenn er in allen identisch wäre. Das erscheint eher unwahrscheinlich. Einer meiner Ärmel mit viel .net, aber ...
Supercat

9
@supercat: Du scheinst den Punkt zu verfehlen. Sie sagen, dass der vorgestellte Hack Ken Thompson umgangen werden kann. Ich sage, dass der bestimmte Hack, den er gewählt hat, keine Rolle spielt; Es war nur ein Beispiel, um zu demonstrieren, dass man immer jemandem vertrauen muss . Deshalb ist diese Frage ein wenig bedeutungslos - sie geht dem Wald vor lauter Bäumen völlig aus dem Weg.
BlueRaja - Danny Pflughoeft

9
@supercat: Es ist sehr unwahrscheinlich, dass verschiedene Compiler aufgrund unterschiedlicher Entwurfsentscheidungen, Optimierungen usw. denselben Bytecode für ein nicht triviales Programm erzeugen. Dies wirft die Frage auf: Woher wissen Sie überhaupt, dass die Binärdateien identisch sind?
Ankit Soni

1
@AnkitSoni: Meine Antwort geht ins Detail. Wenn Sie einen geeignet geschriebenen Open-Source-Compiler / Linker durch verschiedene Compiler speisen, sollten sich unterschiedliche ausführbare Dateien ergeben, die sich identisch verhalten . Wenn sich die ausführbaren Dateien tatsächlich identisch verhalten, werden sie dieselbe Ausgabe erzeugen, wenn der Code für den Open-Source-Compiler / Linker durch sie geleitet wird. Um die Dateien zu vergleichen, könnte man sie auf eine Diskette kopieren und einen antiken Computer verwenden, um sie zu vergleichen.
Supercat

2
Bedeuten einige dieser Konversationen nicht, dass sich die Binärdateien / Hardware für die von Ihnen getesteten Dinge wie erwartet verhielten? Es könnte noch etwas drin sein, auf das Sie nicht getestet haben und das Sie nicht kennen.
Bart Silverstrim

53

Nein

Der Angriff war, wie ursprünglich beschrieben, niemals eine Bedrohung. Während ein Compiler dies theoretisch tun könnte, müsste der Compiler dafür programmiert werden, um den Angriff tatsächlich auszuführen

  • Erkennen, wann der zu kompilierende Quellcode von einem Compiler stammt, und
  • Finden Sie heraus, wie Sie beliebigen Quellcode ändern, um den Hack darin einzufügen.

Dazu muss man aus dem Quellcode herausfinden, wie der Compiler funktioniert, damit er ihn ohne Unterbrechung ändern kann.

Stellen Sie sich zum Beispiel vor, dass das Verknüpfungsformat die Datenlängen oder den Versatz des kompilierten Maschinencodes irgendwo in der ausführbaren Datei speichert. Der Compiler müsste selbst herausfinden, welche davon aktualisiert werden müssen und wo, wenn er die Exploit-Payload einfügt. Nachfolgende Versionen des Compilers (harmlose Version) können dieses Format beliebig ändern, sodass der Exploit-Code diese Konzepte effektiv verstehen müsste.

Dies ist eine selbstgesteuerte Programmierung auf hoher Ebene, ein hartes KI-Problem (zuletzt habe ich überprüft, dass der Stand der Technik Code generiert, der praktisch durch seine Typen bestimmt wird). Schauen Sie: Nur wenige Menschen können das überhaupt; Sie müssten zuerst die Programmiersprache lernen und die Code-Basis verstehen.

Selbst wenn das KI-Problem gelöst ist, werden die Leute bemerken, dass das Kompilieren ihres winzigen Compilers zu einer Binärdatei mit einer großen KI-Bibliothek führt.

Analoger Angriff: Bootstrapping-Vertrauen

Eine Verallgemeinerung des Angriffs ist jedoch relevant. Das Grundproblem ist, dass Ihre Vertrauenskette irgendwo beginnen muss, und in vielen Bereichen könnte ihr Ursprung die gesamte Kette auf eine schwer zu erkennende Weise untergraben.

Ein Beispiel, das sich im wirklichen Leben leicht umsetzen lässt

Ihr Betriebssystem, beispielsweise Ubuntu Linux, stellt die Sicherheit (Integrität) von Updates sicher, indem heruntergeladene Update-Pakete anhand des Signaturschlüssels des Repositorys überprüft werden (mithilfe von Public-Key-Kryptografie). Dies garantiert jedoch nur dann die Echtheit der Aktualisierungen, wenn Sie nachweisen können, dass der Signaturschlüssel einer legitimen Quelle gehört.

Woher hast du den Signaturschlüssel? Beim ersten Herunterladen der Betriebssystemverteilung.

Sie müssen darauf vertrauen, dass die Quelle Ihrer Vertrauenskette, dieser Signaturschlüssel, nicht böse ist.

Jeder, der MITM die Internetverbindung zwischen Ihnen und dem Ubuntu-Download-Server herstellen kann - dies könnte Ihr ISP sein, eine Regierung, die den Internetzugang kontrolliert (z. B. China), oder Ubuntus Hosting-Anbieter -, könnte diesen Prozess gekapert haben:

  • Stellen Sie fest, dass Sie das Ubuntu-CD-Image herunterladen. Dies ist ganz einfach: Stellen Sie sicher, dass die Anforderung an einen der (öffentlich aufgeführten) Ubuntu-Spiegelserver gesendet wird, und fragen Sie nach dem Dateinamen des ISO-Images.
  • Stellen Sie die Anfrage von ihrem eigenen Server aus und geben Sie Ihnen ein CD-Image, das den öffentlichen Schlüssel und den Speicherort des Angreifers anstelle von Ubuntus enthält.

Von da an erhalten Sie Ihre Updates sicher vom Server des Angreifers. Updates werden als Root ausgeführt, sodass der Angreifer die volle Kontrolle hat.

Sie können den Angriff verhindern, indem Sie sicherstellen, dass das Original authentisch ist. Dies setzt jedoch voraus, dass Sie das heruntergeladene CD-Image mit einem Hash validieren (nur wenige tun dies tatsächlich ) - und der Hash selbst muss sicher heruntergeladen werden, z. B. über HTTPS. Und wenn Ihr Angreifer ein Zertifikat auf Ihrem Computer hinzufügen kann (wie in einer Unternehmensumgebung üblich) oder eine Zertifizierungsstelle (z. B. China) kontrolliert, bietet auch HTTPS keinen Schutz.


47
Das ist falsch. Der Compiler muss nur bestimmen, wann er eine ganz bestimmte Quelldatei aus seinem eigenen Quellcode mit ganz bestimmten Inhalten kompiliert, nicht, wann er überhaupt einen Compiler kompiliert !!!
Kaz

14
@Kaz - Irgendwann können Änderungen am Compiler oder Anmeldeprogramm über das Board an den Punkt gelangen, an dem sie den Compiler- / Anmeldeerkenner der Hintertür außer Kraft setzen, und nachfolgende Iterationen würden die Hintertür verlieren. Dies ist analog zu einer zufälligen biologischen Mutation, die Immunität gegen bestimmte Krankheiten gewährt.
Russell Borogove

12
Die erste Hälfte Ihrer Antwort hat das Problem, das Kaz beschreibt, aber die zweite Hälfte ist so gut, dass ich trotzdem +1 gebe!
Ruakh

7
Ein böser Compiler, der nur seine eigene Quelle erkennt, ist einfach zu erstellen, in der Praxis jedoch relativ wertlos - nur wenige Leute, die bereits eine Binärdatei dieses Compilers haben, würden diese verwenden, um die Binärdatei neu zu erstellen. Damit der Angriff über einen längeren Zeitraum erfolgreich ist, würde der Compiler mehr Intelligenz benötigen, um neuere Verdions seiner eigenen Quelle zu patchen und damit auf die im Snswer beschriebenen Probleme zu stoßen.
user281377

5
Ein Erkenner für einen bestimmten Compiler kann recht allgemein gehalten sein und es ist unwahrscheinlich, dass er angesichts einer neuen Version kaputt geht. Nehmen wir zum Beispiel gcc - viele Codezeilen in gcc sind sehr alt und haben sich nicht wesentlich geändert. Einfache Dinge wie der Name ändern sich fast nie. Bevor die Erkennung fehlschlägt, ist es wahrscheinlich, dass der eingefügte Code fehlerhaft ist. In Wirklichkeit sind beide Probleme weitgehend theoretisch - in der Praxis hätte ein Malware-Autor keine Probleme, mit dem (langsamen) Tempo der Compiler-Entwicklung auf dem Laufenden zu bleiben.
Eamon Nerbonne

25

Erstens, meine Lieblingsbeschreibung dieses Hacks heißt Strange Loops .

Dieser bestimmte Hack könnte heute sicherlich (*) in einem der großen Open-Source-OS-Projekte durchgeführt werden, insbesondere in Linux, * BSD und dergleichen. Ich würde erwarten, dass es fast identisch funktionieren würde. Beispielsweise laden Sie eine Kopie von FreeBSD herunter, die über einen ausgenutzten Compiler zum Ändern von openssh verfügt. Von da an werden Sie das Problem bei jedem Upgrade von openssh oder dem Compiler nach Quelle fortsetzen. Angenommen, der Angreifer hat das System ausgenutzt, das zum Packen von FreeBSD verwendet wurde (wahrscheinlich, da das Image selbst beschädigt ist oder der Angreifer tatsächlich der Packager ist), dann wird das Problem jedes Mal neu erzeugt, wenn das System FreeBSD-Binärdateien neu erstellt. Es gibt viele Möglichkeiten, wie dieser Angriff fehlschlagen kann, aber sie unterscheiden sich nicht grundlegend davon, wie Kens Angriff fehlgeschlagen sein könnte (**). Die Welt hat sich wirklich nicht so sehr verändert.

Natürlich könnten ähnliche Angriffe von ihren Besitzern genauso einfach (oder einfacher) in Systeme wie Java, das iOS SDK, Windows oder ein anderes System eingeschleust werden. Bestimmte Arten von Sicherheitslücken können sogar in die Hardware eingearbeitet werden (insbesondere die Schwächung der Zufallszahlengenerierung).

(*) Aber mit "sicher" meine ich "im Prinzip". Sollten Sie erwarten, dass diese Art von Loch in einem bestimmten System existiert? Nein, ich würde es aus verschiedenen praktischen Gründen für ziemlich unwahrscheinlich halten. Mit der Zeit, wenn sich der Code ändert und ändert, steigt die Wahrscheinlichkeit, dass diese Art von Hack seltsame Fehler verursacht. Und das erhöht die Wahrscheinlichkeit, dass es entdeckt wird. Weniger geniale Hintertüren würden Verschwörungen erfordern, um aufrechtzuerhalten. Natürlich wissen wir, dass in verschiedenen Telekommunikations- und Netzwerksystemen "rechtmäßige Abhör-Hintertüren" installiert wurden, so dass in vielen Fällen diese Art von aufwändigem Hack unnötig ist. Der Hack ist offen installiert.

Also immer Verteidigung in die Tiefe.

(**) Unter der Annahme, dass Kens Angriff jemals tatsächlich stattgefunden hat. Er hat gerade besprochen, wie es gemacht werden kann. Er hat nicht gesagt, dass er es tatsächlich getan hat, soweit ich weiß.


In Bezug auf Ihre zweite Fußnote sagte Ken: "Bauen und nicht verteilen."
8bittree,

15

Betrifft das alle Sprachen?

Dieser Angriff betrifft hauptsächlich Sprachen, die sich selbst hosten. Das sind Sprachen, in denen der Compiler in der Sprache selbst geschrieben ist. C, Squeak Smalltalk und der PyPy Python-Interpreter wären davon betroffen. Perl, JavaScript und der CPython-Python-Interpreter würden dies nicht tun.

In welcher Beziehung steht dies zur Just-in-Time-Kompilierung?

Nicht sehr viel. Es ist die Selbst-Hosting-Natur des Compilers, die es ermöglicht, den Hack zu verbergen. Ich kenne keine selbsthostenden JIT-Compiler. (Vielleicht LLVM?)

Werden Funktionen wie das Programm, das Anmeldungen auf einem * nix-System verarbeitet, kompiliert, wenn sie ausgeführt werden?

Nicht gewöhnlich. Die Frage ist aber nicht, wann es kompiliert wird, sondern von welchem ​​Compiler . Wenn das Anmeldeprogramm von einem fehlerhaften Compiler kompiliert wurde, ist es fehlerhaft. Wenn es von einem sauberen Compiler kompiliert wird, ist es sauber.

Ist dies immer noch eine gültige Bedrohung, oder hat es seit 1984 Entwicklungen in der Sicherheit der Zusammenstellung gegeben, die verhindern, dass dies ein bedeutendes Problem darstellt?

Dies ist immer noch eine theoretische Bedrohung, aber nicht sehr wahrscheinlich.

Eine Möglichkeit, dies zu verringern, besteht darin, mehrere Compiler zu verwenden. Ein LLVM-Compiler, der selbst von GCC kompiliert wurde, passiert beispielsweise keine Hintertür. Ebenso passiert ein von LLVM kompilierter GCC keine Hintertür. Wenn Sie also über diese Art von Angriff besorgt sind, können Sie Ihren Compiler mit einer anderen Art von Compiler kompilieren. Das bedeutet, dass der böse Hacker (bei Ihrem Betriebssystemhersteller?) Beide Compiler schädigen muss, um sich gegenseitig zu erkennen. Ein viel schwierigeres Problem.


Ihr letzter Absatz ist streng genommen nicht wahr. Theoretisch könnte Code den zu kompilierenden Compiler erkennen und die Hintertür entsprechend ausgeben. Dies ist in der realen Welt natürlich unpraktisch, aber nichts hindert es von Natur aus. Aber dann ging es bei der ursprünglichen Idee nicht um echte praktische Bedrohungen, sondern um eine Lektion im Vertrauen.
Steven Burnap

Gutes Argument. Immerhin enthält der Hack eine Backdoor für die Anmeldung und eine Modifikation für den Compiler, sodass er auch eine Modifikation für einen anderen Compiler enthalten kann. Aber es wird immer unwahrscheinlicher.
Sean McMillan

Pünktliche Kompilierung könnte ein Vergnügen sein. Wenn ein Code nur dann eine Sicherheitslücke aufweist, wenn ein bestimmtes Teil JIT-kompiliert ist, kann dies unbemerkt bleiben. (nur reines thoery)
GameDeveloper

12

Es gibt eine theoretische Chance dafür. Es gibt jedoch eine Möglichkeit zu überprüfen, ob ein bestimmter Compiler (mit verfügbarem Quellcode) durch die Diverse-Doppelkompilierung von David A. Wheeler kompromittiert wurde .

Verwenden Sie grundsätzlich sowohl den verdächtigen Compiler als auch einen anderen unabhängig entwickelten Compiler, um die Quelle des verdächtigen Compilers zu kompilieren. Dies gibt Ihnen SC sc und SC T . Kompilieren Sie nun die verdächtige Quelle mit diesen beiden Binärdateien. Wenn die resultierenden Binärdateien identisch sind (mit Ausnahme einer Reihe von Dingen, die durchaus legitimerweise variieren können, z. B. verschiedene Zeitstempel), hat der verdächtige Compiler das Vertrauen tatsächlich nicht missbraucht.


Entweder das oder der vertrauenswürdige Compiler ist nicht so vertrauenswürdig, wie der Benutzer gedacht hat. Bei zwei unabhängigen Implementierungen einer Sprache ist die Wahrscheinlichkeit, dass sie dieselbe Hintertür enthalten, vernachlässigbar.
Damian Yerrick

Oder das Diff-Tool, mit dem Sie sie vergleichen, wurde ebenfalls kompromittiert;)
iCodeSometime

@kennycoc Das Schreiben eines Vergleichstools "Sind diese beiden Dateien identisch?" ist jedoch unter allen Umständen nicht so schwierig (da dies bei einem Syscall-Verweis in 2 bis 16 Stunden im binären Maschinencode möglich sein sollte).
Vatine

3

Als spezifischer Angriff ist er so bedrohlich wie nie zuvor, was so gut wie überhaupt keine Bedrohung darstellt.

In welcher Beziehung steht dies zur Just-in-Time-Kompilierung?

Ich bin mir nicht sicher, was du damit meinst. Ist ein JITter dagegen immun? Ist es anfälliger? Nicht wirklich. Als Entwickler ist IHRE App anfälliger, weil Sie nicht bestätigen können, dass sie nicht ausgeführt wurde. Beachten Sie, dass Ihre noch nicht entwickelte App grundsätzlich gegen diese und alle praktischen Variationen immun ist. Sie müssen sich nur um einen Compiler kümmern, der neuer ist als Ihr Code.

Werden Funktionen wie das Programm, das Anmeldungen auf einem * nix-System verarbeitet, kompiliert, wenn sie ausgeführt werden?

Das ist nicht wirklich relevant.

Ist dies immer noch eine gültige Bedrohung, oder hat es seit 1984 Entwicklungen in der Sicherheit der Zusammenstellung gegeben, die verhindern, dass dies ein bedeutendes Problem darstellt?

Es gibt keine wirkliche Sicherheit der Kompilierung und kann es auch nicht sein. Das war wirklich der Punkt seines Gesprächs, dass man irgendwann jemandem vertrauen muss.

Betrifft das alle Sprachen?

Ja. Grundsätzlich müssen Ihre Anweisungen irgendwann in etwas verwandelt werden, das der Computer ausführt, und diese Übersetzung kann falsch ausgeführt werden.


-2

David Wheeler hat einen guten Artikel: http://www.dwheeler.com/trusting-trust/

Ich mache mir mehr Sorgen um Hardware-Angriffe. Ich denke, wir brauchen eine VLSI-Design-Toolchain mit FLOSS-Quellcode, die wir selbst modifizieren und kompilieren können, damit wir einen Mikroprozessor bauen können, bei dem die Tools keine Hintertüren einfügen. Die Werkzeuge sollten uns auch den Zweck eines Transistors auf dem Chip erläutern. Dann könnten wir eine Probe der fertigen Chips öffnen und sie mit einem Mikroskop untersuchen, um sicherzustellen, dass sie die gleichen Schaltkreise haben, die die Werkzeuge angeblich haben sollten.


3
-1, der Großteil Ihrer Antwort kann die Frage nicht beantworten.

-3

Auf Systemen, auf denen die Endbenutzer Zugriff auf den Quellcode haben, müssten Sie diese Art von Angriff verbergen. Das wären Open-Source-Systeme in der heutigen Welt. Das Problem ist, dass, obwohl für alle Linux-Systeme die Abhängigkeit von einem einzigen Compiler besteht, der Angriff für alle wichtigen Linux-Distributionen auf die Build-Server gelangen muss. Da diese die Compiler-Binärdateien nicht direkt für jede Compiler-Version herunterladen, musste sich die Quelle für den Angriff in mindestens einer früheren Version des Compilers auf ihren Build-Servern befinden. Entweder diese oder die allererste Version des Compilers, die sie als Binärdatei heruntergeladen haben, müsste kompromittiert worden sein.


2
Ihre Antwort kratzt an der Oberfläche der Frage, spricht aber nicht wirklich an, was gefragt wird.

-4

Wenn man Quellcode für ein Compiler / Build-System hat, dessen Ausgabe von nichts anderem als dem Inhalt der bereitgestellten Quelldateien abhängen sollte, und wenn man mehrere andere Compiler hat und weiß, dass sie nicht alle den gleichen Compiler-Hack enthalten, kann man das Stellen Sie sicher, dass Sie eine ausführbare Datei erhalten, die von nichts anderem als dem Quellcode abhängt.

Angenommen, man hat Quellcode für ein Compiler / Linker-Paket (z. B. die Groucho Suite), der so geschrieben ist, dass seine Ausgabe weder von einem bestimmten Verhalten noch von etwas anderem als dem Inhalt der Eingabequelldateien abhängt, und man kompiliert / Verknüpft diesen Code mit einer Vielzahl von unabhängig erstellten Compilern / Linker-Paketen (z. B. der Harpo Suite, der Chico Suite und der Zeppo Suite), sodass für jedes eine andere Gruppe von ausführbaren Elementen (G-Harpo, G-Chico und G-Zeppo). Es wäre nicht unerwartet, wenn diese ausführbaren Dateien unterschiedliche Befehlsfolgen enthalten würden, sie sollten jedoch funktional identisch sein. Der Nachweis, dass sie in allen Fällen funktionsgleich sind, wäre jedoch wahrscheinlich ein unlösbares Problem.

Glücklicherweise ist ein solcher Beweis nicht erforderlich, wenn man die resultierenden ausführbaren Dateien nur für einen einzigen Zweck verwendet: das erneute Kompilieren der Groucho-Suite. Kompiliert man die Groucho-Suite mit G-Harpo (ergibt GG-Harpo), G-Chico (GG-Chico) und G-Zeppo (GG-Zeppo), so ergeben sich alle drei Dateien, GG-Harpo, GG-Chico und GG-Zeppo sollten alle Byte für Byte identisch sein. Wenn die Dateien übereinstimmen, bedeutet dies, dass alle in ihnen vorhandenen "Compiler-Viren" identisch vorhanden sein müssen (da alle drei Dateien byteweise identisch sind, können sich ihre Verhaltensweisen in keiner Weise unterscheiden Weg).

Abhängig vom Alter und der Abstammung der anderen Compiler kann möglicherweise sichergestellt werden, dass ein solcher Virus in ihnen nicht plausibel vorhanden ist. Wenn man beispielsweise einen antiken Macintosh verwendet, um einen Compiler, der 2007 von Grund auf neu geschrieben wurde, durch eine Version von MPW zu führen, die in den 1980er Jahren geschrieben wurde, wissen die Compiler der 1980er Jahre nicht, wo sie einen Virus in den 2007er Compiler einfügen sollen. Es mag heute für einen Compiler möglich sein, eine Code-Analyse so gut wie möglich durchzuführen, um dies herauszufinden, aber der für eine solche Analyse erforderliche Rechenaufwand würde den zum einfachen Kompilieren des Codes erforderlichen Rechenaufwand bei weitem überschreiten und hätte nicht unbemerkt bleiben können in einem Markt, in dem die Kompilierungsgeschwindigkeit ein Hauptverkaufsargument war.

Ich würde davon ausgehen, dass, wenn man mit Kompilierungswerkzeugen arbeitet, bei denen die Bytes in einer ausführbaren Datei, die erzeugt werden sollen, in keiner Weise von etwas anderem als dem Inhalt der eingereichten Quelldateien abhängen sollten, es möglich ist, eine einigermaßen gute Immunität von einem Thompson zu erreichen -Stil-Virus. Leider scheint aus irgendeinem Grund der Nichtdeterminismus bei der Zusammenstellung in einigen Umgebungen als normal zu gelten. Ich erkenne, dass es auf einem Multi-CPU-System möglich sein kann, dass ein Compiler schneller läuft, wenn bestimmte Aspekte der Codegenerierung variieren, je nachdem, welcher der beiden Threads zuerst eine Arbeit beendet.

Andererseits bin ich mir nicht sicher, warum Compiler / Linker keinen "kanonischen Ausgabemodus" bieten sollten, bei dem die Ausgabe nur von den Quelldateien und einem "Kompilierungsdatum" abhängt, das vom Benutzer möglicherweise überschrieben wird . Selbst wenn das Kompilieren von Code in einem solchen Modus doppelt so lange gedauert hätte wie das normale Kompilieren, würde ich vorschlagen, dass es einen erheblichen Wert hätte, in der Lage zu sein, jeden "Release-Build" Byte für Byte vollständig aus Quellmaterialien wiederherzustellen, selbst wenn dies dies bedeutete Release-Builds würden länger dauern als "normale Builds".


2
-1. Ich verstehe nicht, wie Ihre Antwort die Kernaspekte der Frage anspricht.

@ GlenH7: Viele ältere Kompilierungswerkzeuge erzeugen konsistent eine bitidentische Ausgabe, wenn sie bitidentische Eingaben erhalten [außerhalb von Dingen wie TIME , die so angepasst werden könnten, dass sie eine "offizielle" Kompilierungszeit anzeigen]. Mit solchen Tools kann man sich ziemlich gut vor Compilerviren schützen. Die Tatsache, dass einige gängige Entwicklungsframeworks keine Möglichkeit zum "deterministischen" Kompilieren von Code bieten, bedeutet, dass Techniken, die in älteren Tools vor Viren geschützt sein könnten, nicht effektiv mit neueren Tools verwendet werden können.
Supercat

Hast du das versucht? 1. Führen Sie mit Ihrer Abschlussarbeit. 2. Verwenden Sie kürzere Absätze. 3. Erläutern Sie den Unterschied zwischen "funktionsidentisch" (Ergebnis der ersten Stufe) und "bitidentisch" (Ergebnis der zweiten Stufe) genauer, möglicherweise mit einer Liste aller erstellten Compiler-Binärdateien und ihrer Beziehungen zueinander. 4. Zitieren Sie das DDC-Papier von David A. Wheeler.
Damian Yerrick
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.