🔍 Was beobachte ich?

Code-Review, SAST, Dependency-Scan: Die gesamte Prüfarbeit richtet sich auf den Quelltext. Nach Compiler, Build-Image und Pipeline-Plugins frage ich meist vergeblich. Sie gelten als Werkzeug, nicht als Angriffsfläche.

🎯 Was soll eigentlich erreicht werden?

Ausgeliefert werden soll nur, was geprüft wurde. Der Quelltext ist dafür der naheliegende Ort: lesbar, versioniert, nachvollziehbar.

⚠️ Warum funktioniert das nicht?

Ken Thompson hat 1983 in seinem Turing-Award-Vortrag „Reflections on Trusting Trust“ vorgeführt, warum das nicht reicht. Er präparierte einen C-Compiler: Beim Übersetzen des Login-Programms baute dieser eine Hintertür ein. Und beim Übersetzen seiner selbst gab er genau diese Fähigkeit an die nächste Compiler-Fassung weiter. Danach ließ sich der Compiler-Quelltext säubern: Die Hintertür lebte im Binary weiter – sichtbar war sie in keiner einzigen Zeile. Ausgeliefert wird nicht, was man liest, sondern was das Werkzeug daraus macht.

Aus dem Laborversuch wurde Praxis. XcodeGhost, 2015: Entwicklungsteams in China luden Xcode von einem Filehoster statt bei Apple, weil das schneller ging. Die manipulierte Entwicklungsumgebung schrieb Schadcode in jede App, die sie baute. Laut Unterlagen aus dem Verfahren Epic gegen Apple waren es 2.500 Apps und 128 Millionen Betroffene. SolarWinds, 2020: Die Schadsoftware SUNSPOT beobachtete den Build-Server und tauschte im Moment der Kompilierung eine Quelldatei aus. Das Repository blieb sauber, das Ergebnis signierte der Hersteller. xz-utils, 2024: Das Git-Repository enthielt die Nutzlast getarnt als Testdateien. Erst ein Autotools-Skript, das allein im Release-Archiv lag, baute daraus beim Übersetzen die Hintertür.

💡 Was funktioniert besser?

Den Build zum Prüfgegenstand machen. Reproduzierbare Builds beantworten die entscheidende Frage: Erzeugen zwei unabhängige Umgebungen aus demselben Quellstand dasselbe Ergebnis, Bit für Bit? Dazu gehören Herkunftsnachweise nach SLSA, fest gepinnte und signierte Build-Images statt „latest“ und Releases, die aus dem Repository entstehen statt aus einem hochgeladenen Archiv.

📚🔍