2016-09-14 1 views
10

erwartete Ich habe eine librandom.so Bibliothek und ein main ausführbare, die kompiliert wurde, wie folgt:

$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN" 

Sie sind beide im selben Verzeichnis. Seit main hat $ORIGIN in seiner rpath, es funktioniert gut - ./main gibt ohne Fehler zurück.

Nun, ich main Einstellung mit setuid als root auszuführen:

$ sudo chown root main 
$ sudo chmod a+s main 
$ ./main 

ich main seit $ORIGIN scheitern wird nicht erwartet, in setuid Anwendungen erweitert. Überraschenderweise funktioniert es.

Wenn ich main aus einem anderen Verzeichnis laufen, aber es tut nicht wie erwartet:

$ cd /tmp  
$ /path/to/main 
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory 

Warum es funktioniert, wenn ich main von seinem enthält Verzeichnis laufen?

Antwort

2

Ich erwartete Main fehlschlagen, da $ ORIGIN in Setuid-Anwendungen nicht erweitert wird. Überraschenderweise funktioniert es.

Glibc hat eine lange Geschichte von $ORIGIN auch für suid Binärdateien erweitert (siehe zum Beispiel CVE-2010-3847). Die Motivation dahinter ist, dass suid-Binaries, die für rpath verwenden, durch das Design kaputt sind, so dass Glibc-Entwickler nie sehr daran interessiert waren, dies zu beheben. Einige Downstream-Distributionen haben Patches auf der Oberseite von Glibc zur Verfügung gestellt, die die ORIGIN-Erweiterung deaktivieren, so dass die genaue Situation von Ihrer Distribution abhängt.

Lustig genug, nur freistehende $ORIGIN wird erweitert werden - wenn Sie es durch ersetzen z. $ORIGIN/libs fängt es an zu versagen.

Warum funktioniert es, wenn ich main von seinem enthaltenden Verzeichnis aus führe?

Sobald Sie Ihre Datei verschieben, wird $ ORIGIN zu einem anderen Ordner erweitert, der nicht mehr die erforderliche Bibliothek enthält.

+0

In Bezug auf die zweiten Teile - Ich verschiebe nicht die Datei, nur das aktuelle Verzeichnis. 'ORIGIN' ist relativ zum Speicherort der ausführbaren Datei und nicht zum aktuellen Arbeitsverzeichnis. –

+0

Rechts. Es scheint, dass Ubuntu eine Variante des Glibc-Patches verwendet, die '$ ORIGIN' auf eine leere Zeichenfolge erweitert (z. B. beschrieben in [diesem Kommentar] (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0)). Der dynamische Linker wird dies dann als CWD behandeln, was das Verhalten erklären würde. Sie können dies [wahrscheinlich den Entwicklern melden] (https://bugs.launchpad.net/ubuntu/), aber ich bezweifle, dass sie daran interessiert sind. – yugr

Verwandte Themen