У меня есть librandom.so
библиотека и main
exectuable, которая была составлена следующим образом:
$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
Они оба в том же каталоге. Так как main
имеет $ORIGIN
в своем rpath
, он отлично работает - ./main
возвращается без ошибок.
Теперь я устанавливаю main
работать с setuid
в root
:
$ sudo chown root main
$ sudo chmod a+s main
$ ./main
Я ожидал main
на провал, так как $ORIGIN
не разлагаются в setuid
приложениях. Удивительно, но это работает.
Если я бегу main
из другой директории, хотя, делает неудачу, как и ожидалось:
$ 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
Почему это работает, когда я запускаю main
из содержащего его каталога?
Что касается вторых частей - я не перемещаю файл, а только текущий каталог. '$ ORIGIN' относится к местоположению исполняемого файла, а не к текущему рабочему каталогу. –
Справа. Похоже, Ubuntu использует вариант патча Glibc, который расширяет '$ ORIGIN' до пустой строки (например, описанный в [этом комментарии] (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0)). Затем динамический компоновщик будет рассматривать это как CWD, который объясняет поведение. Вы можете [сообщить об этом разработчикам] (https://bugs.launchpad.net/ubuntu/), но я сомневаюсь, что они будут интересны. – yugr