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?
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. –
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