Nehmen wir an, ich arbeite für eine große Dienstleistungsorganisation außerhalb der USA / Großbritanniens. Wir verwenden häufig UNIX- und Linux-Server.
Beim Lesen dieses Artikels wird erwähnt, dass es einfach wäre, eine Backdoor in einen C-Compiler einzufügen. Dann würde jeder mit diesem Compiler kompilierte Code auch eine Backdoor enthalten. Angesichts der jüngsten Lücken in Bezug auf das Mandat der NSA / GCHQ, Hintertüren / Schwachstellen in allen Verschlüsselungsmethoden, Hardware und Software zu beseitigen, ist der Compiler jetzt ein kritischer Fehlerpunkt. Möglicherweise können alle Standard-UNIX / Linix-Distributionen kompromittiert werden. Wir können es uns nicht leisten, dass unsere Systeme, Daten und Kundendaten von betrügerischen Regierungen kompromittiert werden.
Angesichts dieser Informationen möchte ich einen vertrauenswürdigen Compiler von Grund auf neu erstellen, dann habe ich eine sichere Basis, auf der ich aufbauen kann, damit ich das Betriebssystem und die Anwendungen mithilfe dieses Compilers aus dem Quellcode erstellen kann.
Frage
Was ist der richtige (und sichere) Weg, um einen Compiler aus dem Quellcode zu kompilieren (ein scheinbar Hühnerei-Szenario) und dann eine vertrauenswürdige Unix / Linux-Distribution von Grund auf neu zu kompilieren?
Sie können davon ausgehen, dass ich oder andere Benutzer in der Lage sind, den Quellcode auf Sicherheitslücken hin zu lesen und zu verstehen. Daher wird der Quellcode vor dem Kompilieren zunächst überprüft. Was ich wirklich brauche, ist eine Arbeitsanleitung, um diesen Compiler von Grund auf sicher zu erstellen und kann verwendet werden, um den Kernel, andere Teile des Betriebssystems und Anwendungen zu kompilieren.
Der Sicherheitsstapel muss auf der Basisebene beginnen, wenn Sie dem Betriebssystem oder den Anwendungen, die auf diesem Stapel ausgeführt werden, vertrauen möchten. Ja, ich verstehe, dass es möglicherweise Hardware-Hintertüren gibt, die beim Erstellen einen Mikrocode in den Compiler einfügen. Momentan können wir nicht viel dagegen tun, es sei denn, wir verwenden Chips, die nicht in den USA entwickelt wurden. Lassen Sie uns diese Ebene zunächst sortieren und davon ausgehen, dass ich sie möglicherweise auf einem alten Computer erstellen könnte, bevor Backdoors eingefügt wurden.
Wie Bruce Schneier sagt: "Den Ingenieuren sage ich Folgendes: Wir haben das Internet aufgebaut, und einige von uns haben dazu beigetragen, es zu untergraben. Jetzt müssen diejenigen von uns, die die Freiheit lieben, es reparieren."
Zusätzliche Links:
Antworten:
AFAIK bietet die einzige Möglichkeit, die vollständige Sicherheit zu gewährleisten, darin, einen Compiler in Assembler-Sprache zu schreiben (oder die Festplatte direkt selbst zu ändern ). Nur dann können Sie sicherstellen, dass Ihr Compiler keine Hintertür einfügt - dies funktioniert, da Sie den Compiler tatsächlich vollständig entfernen.
Von dort aus können Sie Ihren von Grund auf neu erstellten Compiler verwenden, um z. B. die GNU-Toolchain zu booten. Dann können Sie Ihre benutzerdefinierte Toolchain verwenden, um ein Linux From Scratch- System zu kompilieren .
Beachten Sie, dass Sie zur Vereinfachung einen zweiten Intermediary Compiler in C (oder einer anderen Sprache) haben können. Sie würden also Compiler A in Assembly schreiben und diesen Compiler dann in C / C ++ / Python / Brainfuck / whatever umschreiben, um Compiler B zu erhalten, den Sie mit Compiler A kompilieren würden. Dann würden Sie Compiler B verwenden, um gcc und friends zu kompilieren.
quelle
Ein möglicher Weg, obwohl es in der Praxis sehr lange dauern würde, wäre, zu den Wurzeln zurückzukehren. Die Entwicklung von GNU begann 1984 und die ursprüngliche Version von Minix (die während der frühen Linux-Entwicklung für Bootstrapping-Zwecke verwendet wurde) wurde 1987 veröffentlicht.
Die gesamte Antwort basiert auf der Annahme, dass "[Sie] oder andere die Fähigkeit haben, Quellcode auf Sicherheitslücken hin zu lesen und zu verstehen, sodass der Quellcode vor dem Kompilieren zuerst überprüft wird" und dass Sie dem Ergebnis einer solchen Analyse vertrauen können . Ohne das ist diese Antwort wahrscheinlich schlimmer als wertlos, da Sie viel Zeit für absolut keinen Nutzen aufwenden werden.
Wenn Sie eine Kopie des ursprünglichen Minix-Buches mit Quellcode finden, können Sie sie aus dem Buch eingeben. Kompilieren Sie es und verwenden Sie dann einen anderen Dekompiler auf einem anderen System, um sicherzustellen, dass der Compiler die erwartete Maschinensprachen-Binärausgabe generiert. (Der Code besteht nur aus 12.000 Zeilen, vermutlich C, was zwar zeitaufwändig ist, aber immer noch in Ordnung ist, wenn Sie ein solches Projekt ernst meinen.) Sie könnten sogar Ihren eigenen Disassembler schreiben; das sollte nicht sehr schwierig sein.
Besorgen Sie sich die ältesten Versionen der GNU-Dienstprogramme, die Sie möglicherweise in die Finger bekommen können (da diese vermutlich weniger Code enthalten und weniger von externen Bibliotheken abhängig sind), lesen Sie den Code durch und erstellen Sie ihn für Minix (dies kann jedoch einige Arbeit erfordern; was Sie tun) Es ist unbedingt zu vermeiden, Anpassungen am Quellcode vorzunehmen, da dies das Hinzufügen von Patches zu einem späteren Zeitpunkt sehr fehleranfällig macht und einen ähnlichen Disassemble-Verifizierungszyklus für die GNU-Tools durchläuft. An diesem Punkt vertrauen Sie dem Betriebssystem und der Toolchain, sodass Sie nur den Quellcode im Patchset durchgehen müssen (alles, was nicht im Patchset enthalten ist, ist bereits vertrauenswürdig), aber die Tools sind im Vergleich zu Ihrer Verwendung immer noch sehr primitiv und grob bis heute. Erwarten Sie zum Beispiel nicht, dass mehr als die grundlegendste Funktionalität der Systemtools funktioniert.Lose XKCD lesen.
Irgendwann werden Sie ein System haben, das eine frühe Version des Linux-Kernels kompilieren und booten kann, ähnlich wie es in den frühen neunziger Jahren der Fall war, als Linux unter Hackern an Bedeutung gewann. Ich würde empfehlen, zu diesem Zeitpunkt auf Linux zu migrieren (die Systembibliotheken und die Toolchain gegen Linux neu zu erstellen, den Linux-Kernel zu erstellen, in Linux zu booten und möglicherweise den Linux-Kernel und die GNU-Toolchain unter Linux neu zu erstellen; der letzte Beweis, dass das System jetzt selbstständig ist). Hosting), aber das liegt weitgehend bei Ihnen. Überprüfen Sie weiterhin die Patches, patchen Sie den Kernel, die Bibliotheken und die grundlegenden GNU-Tools und erstellen Sie sie neu, bis Sie zu modernen Versionen gelangen.
Dann haben Sie ein vertrauenswürdiges Basis-Betriebssystem und einen Compiler, mit denen Sie moderne Software erstellen können. Bis dahin können Sie z. B. den Linux From Scratch- Anleitungen folgen , um ein System zu erstellen, das nützliche Aufgaben ausführen kann .
Das "Compiler" -System kann zu keinem Zeitpunkt in irgendeiner Weise mit einem Netzwerk verbunden werden (auch nicht als VM auf einem vernetzten Host). Sie würden das Risiko eingehen, durch netzwerkfähige Komponenten einschließlich des Kernels zu gelangen. Wenn Sie sich Sorgen über einen Thompson-Compiler-Angriff machen , müssen Sie damit rechnen, dass auch jeder VM-Host kompromittiert wird. Verwenden Sie sneakernet, um den Quellcode von dem physischen Host, auf dem Sie die Dinge kompilieren, und die Binärdateien abzurufen. Erwarten Sie Probleme beim Ein- und Ausschalten von Dateien auf dem System, bevor Sie den Punkt erreichen, an dem die Unterstützung für USB-Massenspeicher implementiert wurde. Wenn Sie wirklich paranoid, Code Druckquelle Listings und geben Sie sie mit der Hand in (und hoffen , dass der Druckertreiber und Drucker nicht über einen ähnlichen Code in ihnen) oder lesen Sie den Code auf einem Computermonitor und tippen Sie ihn in einen anderen Computer ein, der sich physisch neben dem Computer befindet, aber nicht mit ihm verbunden ist.
Ja, das wird viel Zeit in Anspruch nehmen . Der Vorteil dieses Ansatzes besteht jedoch darin, dass jeder Schritt inkrementell ist, was bedeutet, dass es für etwas Bösartiges viel schwieriger ist, durchzukommen, wenn es nicht über einen Zeitraum von vielen Versionen hinweg sehr allmählich eingeführt wird. Dies ist darauf zurückzuführen, dass die Anzahl der Änderungen bei jedem Schritt vergleichsweise gering ist und daher leichter zu überblicken ist. Vergleichen Sie das Patchset mit dem Changelog und stellen Sie sicher, dass Sie genau bestimmen können, welcher Changelog-Eintrag jeder Änderung im Quellcode entspricht. Dies setzt wiederum voraus, dass Sie die Möglichkeit haben (möglicherweise durch jemanden, dem Sie vertrauen), zu überprüfen, dass solche Änderungen nicht in die Codebasis eingeschleust wurden, aber Sie sollten einem vertrauenswürdigen System so nahe kommen wie einem reinen Software-System. Firmware Ansatz kann.
quelle
Wenn Sie einen vertrauenswürdigen Compiler benötigen, können Sie sich akademische Arbeiten wie das compcert- Projekt ansehen . Es ist ein Compiler, der vom INRIA (einem französischen öffentlichen IT-Labor) entwickelt wurde, um "zertifiziert" zu werden, dh um eine semantisch perfekt dem Code entsprechende ausführbare Datei zu erstellen (und natürlich wurde dies mathematisch bewiesen).
quelle
Während das manuelle Erstellen eines eigenen Compilers als Ausgangspunkt am sichersten ist, besteht eine andere Möglichkeit darin, ein System von einer 5 (oder 10) Jahre alten Installations-CD zu installieren, von der Sie überzeugt sind, dass sie erstellt wurde, bevor diese Exploits existierten. Verwenden Sie dies dann als Grundlage, um die neue geprüfte Quelle zu kompilieren.
quelle