Trojan Source Attack, was ist das?

18/11/21

Wie wäre es, wenn es möglich wäre, Compiler dazu zu bringen, andere Binärdateien als die für den Menschen sichtbare Logik im Quellcode zu erstellen? Wir zeigen Ihnen, dass dies nicht nur möglich, sondern auch leicht auszunutzen ist ...

Dies ist in der Einleitung des Beitrags nachzulesen „Trojaner-Quelle: Unsichtbare Schwachstellen“, kürzlich veröffentlicht von Prof. Ross Anderson von der Universität Cambridge, Autor des Textes "Sicherheitstechnik" und von Nicholas Boucher, seinem Doktoranden. 

Wie so oft in der Cyberwelt waren wir neugierig und beschlossen, der Sache nachzugehen …

Denken wir zunächst daran, dass mit modernen Programmiersprachen geschriebene Programme einen Compiler benötigen, d. h. ein weiteres Programm, das den Text unseres Programms analysiert, seine syntaktische Korrektheit überprüft und ihn in ein optimiertes Programm in der vom Computer ausführbaren Sprache übersetzt. Schon daraus verstehen wir, wie kritisch es bei der Entwicklung eines Compilers ist, dass unbeabsichtigt Schwachstellen in das Programm eingefügt werden können.

Ken Thomson, einer der Väter von Unix, warnte bereits in den 80er Jahren in seinem berühmten Vortrag anlässlich der Verleihung des „Turing-Preises“ (das Äquivalent des Nobelpreises für Informationstechnologie) mit dem vielsagenden Titel vor diesen Risiken "Überlegungen zum vertrauensvollen Vertrauen" . Der C-Sprach-Compiler ist selbst ein in der C-Sprache geschriebenes Programm. Um also dem vom Compiler erstellten ausführbaren Programm zu vertrauen, müssen Sie nicht nur demjenigen vertrauen, der das Programm geschrieben hat, sondern auch dem Compiler.

Kehren wir nun zum Artikel von Boucher und Anderson zurück und betrachten wir zunächst einen Compiler als einen Textparser, der die Begriffe und die Syntax der Programmiersprache kennt. Die zur Textbildung verwendeten Zeichen müssen in einem Computer kodiert werden. 

Um zu verstehen, woraus diese von Boucher und Anderson vorgestellte neue Art von Angriff besteht, müssen wir zunächst über die Codierung und die für die Codierung verwendeten Standards sprechen.

Einer der im Laufe der Zeit am häufigsten verwendeten Standards in der Computerwelt ist ASCII. Amerikanischer Standardcode für den Informationsaustausch. Die erste Ausgabe dieser Norm wurde 1963 veröffentlicht und im Laufe der Jahre mehrmals geändert. Es wurden sieben Bits verwendet, um 128 verschiedene Zeichen zu kodieren. 

Mit der Entwicklung von Computersystemen änderten sich die Anforderungen und es wurde notwendig, den ASCII-Standard zu erweitern, um die Kodierung von Zeichen aus verschiedenen Sprachen oder für bestimmte Umgebungen zu ermöglichen.

So wurde nach und nach der als UNICODE bekannte Standard übernommen. Dieser Standard ermöglicht die Kodierung von 144.697 Zeichen und verschiedenen Symbolen. Hierzu zählen sogenannte Alphabete Von links nach rechts (von links nach rechts, z. B. Italienisch, Russisch, Englisch ...) e Von rechts nach links (von rechts nach links, z. B. Arabisch, Hebräisch ...). Im Fall von Unicode, einem der heute am weitesten verbreiteten Kodierungsstandards, wird ein Algorithmus namens Bidirektionaler Algorithmus (BiDi). 

Der BiDi-Algorithmus ist darauf ausgelegt, die Anzeige von Text automatisch über sogenannte Steuerzeichen (Override-Zeichen) zu verwalten, mit denen Sie explizit angeben können, wie ein bestimmter Textabschnitt behandelt werden soll (z. B Von rechts nach links überschreiben, RLO, legt fest, dass der Text, auf den es sich bezieht, als behandelt werden soll rechts nach links). Steuerzeichen sind unsichtbare Zeichen auf dem Bildschirm, mit denen Sie die Anzeige von Textteilen steuern können. Hier sind einige der am häufigsten verwendeten.

Darüber hinaus können die Steuerzeichen „verschachtelt“ werden, wodurch die Anzeige eines Textes auf sehr komplexe Weise neu angeordnet werden kann.

Wenn es sich nun bei dem auf dem Bildschirm angezeigten Text um einen Programmcode handelt, ist zu beachten, dass die Syntax der meisten Programmiersprachen es grundsätzlich nicht zulässt, diese Steuerzeichen direkt in den Quellcode einzufügen, wie dies der Fall wäre offensichtlich die Steuerlogik des Programms ändern. Da viele Sprachen jedoch Kommentare und Zeichenfolgen zulassen, ist es möglich, Steuerzeichen in Kommentare oder Zeichenfolgen einzufügen und sie so auf den Quellcode auszuwirken BiDi überschreibt Sie berücksichtigen keine Zeichenfolgen- und Kommentartrennzeichen.

Der von Boucher und Anderson beschriebene Angriffstyp basiert auf diesem typischen Merkmal heutiger Codierung. Tatsächlich ist es dank der Steuerzeichen möglich, den Unterschied zwischen dem, was angezeigt wird, und dem, was tatsächlich codiert und an den Compiler und Interpreter übergeben wird, auszunutzen, um die von Boucher und Anderson beschriebene Art von Angriff „Trojan Source Attack“ durchzuführen.

Boucher und Anderson zeigten außerdem, dass diese Art von Angriff in gängigen Programmiersprachen wie C, C++, C#, JavaScript, Java, Rust, Go und Python möglich ist. 

Das folgende Beispiel im Python-Code zeigt, dass sich der links codierte (und daher auf der Maschine ausgeführte) Code vom angezeigten Quellcode (rechts) unterscheidet.

Letzterem zufolge würde man am Ende der Ausführung einen Wert von 50 in der Bank ['alice'] erwarten, während der aktuelle Wert in der Praxis immer noch 100 betragen wird.

Die Tatsache, dass es bisher keine Beweise für einen solchen Angriff gibt, beruhigt uns nicht für die Zukunft, da andere wie wir möglicherweise das Papier gelesen und möglicherweise die Entscheidung getroffen haben, die Konzepte zu testen.

Davide Ariu, Giorgio Giacinto und Alessandro Rugolo

Um mehr zu erfahren:

Trojaner-Quelle: Unsichtbare Sicherheitslücken

„Trojan Source“-Bug bietet neuartige Möglichkeit, Programmkodierungen anzugreifen (techxplore.com)

Trojan Source-Angriff ist gefährlich für Compiler von Programmsprachen (gridinsoft.com)

Angriffe mit Trojanern

GitHub – nickboucher/trojan-source: Trojan Quelle: Invisible Vulnerabilities

Der bidirektionale Unicode-Textalgorithmus – Entwicklerhandbücher | MDN (mozilla.org)

https://doi.org/10.1145/358198.358210

https://www.cl.cam.ac.uk/~rja14/book.html