2016-09-14 2 views
10

У меня есть 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 из содержащего его каталога?

ответ

2

Я ожидал, что основная ошибка произойдет, поскольку $ ORIGIN не расширен в приложениях setuid. Удивительно, но это работает.

Glibc имеет долгую историю расширения $ORIGIN даже для Suid бинарных файлов (смотри, например, CVE-2010-3847). Мотивация заключается в том, что суицидальные двоичные файлы, использующие $ORIGIN для rpath, разбиты по дизайну, поэтому разработчикам Glibc никогда не очень хотелось это исправлять. Некоторые дистрибутивы, расположенные ниже по потоку, предоставили исправления на складе Glibc, которые запрещают расширение ORIGIN, поэтому точное соответствие зависит от вашего дистрибутива.

Забавно, только отдельно стоящий $ORIGIN будет расширен - если вы замените его, например. $ORIGIN/libs он начнет терпеть неудачу.

Почему это работает, когда я запускаю main из его содержащей директории?

Как только вы переместите свой файл, $ ORIGIN будет разворачиваться в другую папку, которая больше не содержит требуемую библиотеку.

+0

Что касается вторых частей - я не перемещаю файл, а только текущий каталог. '$ ORIGIN' относится к местоположению исполняемого файла, а не к текущему рабочему каталогу. –

+0

Справа. Похоже, Ubuntu использует вариант патча Glibc, который расширяет '$ ORIGIN' до пустой строки (например, описанный в [этом комментарии] (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0)). Затем динамический компоновщик будет рассматривать это как CWD, который объясняет поведение. Вы можете [сообщить об этом разработчикам] (https://bugs.launchpad.net/ubuntu/), но я сомневаюсь, что они будут интересны. – yugr

Смежные вопросы