Klebebindung
Anwendungen statisch linken mit Statifier und Ermine
Schnürende Statiker
Als nächstes wenden Sie sich dem Programm zu, das Sie in eine portable Anwendung verwandeln möchten. Von ihm benötigen Sie den Aufenthaltsort sowie den Namen der ausführbaren Programmdatei. Diesen übergeben Sie nun zusammen mit dem gewünschten Namen der statisch gelinkten Datei an Ermine oder Statifier. So rafft letzterer beispielsweise per
$ statifier /bin/ls staticls
alle von ls benötigten Bibliotheken zusammen, tackert sie an dem Binary fest und legt das Ergebnis unter dem Namen staticls ab. Im Fall von Ermine führt folgender Einzeiler zum gleichen Ergebnis:
$ ./ErmineLightTrial.i386 /bin/ls --output=staticls
Das statisch gelinkte Programm legt gegenüber dem Original extrem an Umfang zu. Das ls-Kommando blähen die angefügten Bibliotheken beispielsweise von schlanken 93 KByte auf rund 2 MByte auf. Wie Listing 2 zeigt, besitzt es jedoch im Gegenzug keine Abhängigkeiten und läuft somit auf jeder beliebigen Distribution.
Die Tabelle "Programmgrößen unter Ubuntu 8.10" vergleicht noch ein paar weitere von Statifier und Ermine produzierte Ergebnisse. Das kommerzielle Ermine arbeitet zwar meist etwas effizienter als der quelloffene Kollege, erfreulicherweise gehen jedoch beide recht flott zu Werke: Auf einem Core-2-Duo-Rechner lagen in allen Fällen nach maximal 4 Sekunden die modifizierten Anwendungen vor – mit einer Ausnahme: Bei dem Versuch, das kleine Spielchen Gnometris in ein statisch gelinktes Programm zu verwandeln, verfing sich Statifier reproduzierbar in einer Endlosschleife.
Programmgrößen unter Ubuntu 8.10
| Programm | Original | Statifier | Ermine Light |
|---|---|---|---|
| ls | 96.216 Byte | 1.990.656 Byte | 2.279.044 Byte |
| Gnuchess | 172.164 Byte | 3.112.960 Byte | 2.560.132 Byte |
| VICE | 1.235.844 Byte | 19.603.456 Byte | 16.070.240 Byte |
| Gnometris | 116.032 Byte | – | 21.050.976 Byte |
Da sie Bibliotheken nicht umständlich auf der Festplatte suchen, laufen statisch gelinkte Programme prinzipiell etwas schneller ab. Bei kleineren Werkzeugen wie ls bleiben die Unterschiede jedoch verschwindend gering.
Pferdefüße und Ausfallerscheinungen
Statisch gelinkte Programme bringen aber auch Nachteile mit sich: So können Sie etwa keine (Sicherheits-)Updates mehr einspielen. Erscheint eine aktualisierte Version des Programms oder einer der verwendeten Bibliotheken, müssen Sie erneut Ermine oder Statifier anwerfen.
Letzterer kämpft noch mit einem ganz besonderen Problem: Durchweg alle modernen Distributionen arbeiten mit aktivierter Stack- und Address-Space-Layout-Randomization (ASLR, [3]). Dabei weist der Linux-Kernel jeder Bibliothek und jedem Programm einen zufällig gewählten Platz im Hauptspeicher zu. Das soll die Sicherheit erhöhen und Angriffe erschweren, bringt aber auch Statifier vollkommen durcheinander. In der Folge produziert die Software unbrauchbare Programme, die direkt nach ihrem Start mit einem Speicherfehler ("Segmentation Fault") kollabieren (siehe Listing 3).
Die derzeit einzige Abhilfe besteht darin, ASLR vorübergehend abzuschalten. Dazu melden Sie sich als Benutzer mit Root-Rechten an und schreiben in die passende virtuelle Datei eine Null. Anschließend überprüfen Sie durch Ausgabe der Datei, ob die Einstellungen passen:
# echo 0 > /proc/sys/kernel/randomize_va_space # cat /proc/sys/kernel/randomize_va_space 0
Jetzt erstellen Sie mit Statifier das gewünschte Programm noch einmal. Dummerweise müssen Sie ASLR so lange deaktivieren (auch auf anderen Systemen), wie Sie mit der statisch gelinkten Anwendung arbeiten. Ob das die geschaffene Sicherheitslücke aufwiegt, müssen Sie selbst entscheiden.
# Adress Space Randomization abschalten $statifier /bin/ls staticls $./staticls Segmentation fault $sudo su root@kkissling# echo 0 > /proc/sys/kernel/randomize_va_space root@kkissling# exit exit $statifier /bin/ls staticls $./staticls Bilder Dokumente lost+found […]
Trouble mit OpenSuse 11.1
Unter OpenSuse 11.1 meldete Statifier ein Problem mit dem Debugger gdb und erstellte keine statische Version von ls. Es half, die Zeilen 42 bis 46 in der Datei /usr/lib/statifier/32/statifier_dump.sh mit Hilfe einer Raute (#) auszukommentieren, wozu Sie Root-Rechte brauchen. Nach dem Speichern der veränderten Datei, erledigte Statifier den Job, ohne zu murren.



