LD_LIBRARY_PATH в envp arg execve () удаляется, даже если вызывающая родительская программа setuid отбросила свою привилегированную - PullRequest
0 голосов
/ 17 декабря 2018

Справочная информация: Я понял, что родительская программа с setuid не может хранить LD_LIBRARY_PATH как часть env по соображениям безопасности, поэтому любой дочерний процесс также не будет "видеть" LD_LIBRARY_PATH.

Контекст: Моя родительская программа (см. https://github.com/shadow-robot/ethercat_grant/blob/kinetic-devel/src/ethercat_grant.cpp) нуждается в setuid для изменения возможностей, таких как CAP_NET_RAW дочерней программы.Однако дочерняя программа (под моим контролем, например, https://github.com/shadow-robot/ros_ethercat/blob/kinetic-devel/ros_ethercat_loop/src/main.cpp) использует библиотеки, найденные с помощью RPATH, которые сами нуждаются в доступе к библиотекам зависимостей, не находящимся под моим контролем и находящимся только через LD_LIBRARY_PATH (из-за недавно примененного RUNPATH в Ubuntu Bionic).https://github.com/shadow-robot/ethercat_grant/issues/4).

Поэтому мне нужен обходной путь для передачи LD_LIBRARY_PATH дочернему процессу. Я подумал, что execve () должен помочь, и мой вопрос только об этом здесь.

Обходной путь: Я putenv () LD_LIBRARY_PATH = / my / path / в родительском приложении, отбрасываю привилегии и затем вызываю execve () с новым env. Я полагаю, это безопасно как LD_LIBRARY_PATHповторное добавление в env используется только как обычный пользователь, а не как привилегированный. См. код здесь https://github.com/ubi-agni/ethercat_grant/blob/env_append/src/ethercat_grant.cpp

Проблема: LD_LIBRARY_PATH снова сбрасывается в execve (). [EDIT]Похоже, что он ведет себя правильно (если привилегированные отбрасываются перед вызовом execve), если cap_set_file ранее не использовался, поэтому проблема заключается в связи между возможностями и execve каким-то образом [/ EDIT]

Исследование: Я нашел какой-то старый, все еще открытый отчет об этом нежелательном поведении http://austingroupbugs.net/view.php?id=922, но это не объясняется подробно (в man ld.soили другое) что даже если setuid совпадает с seteuid (то же самое для групп) после удаления привилегий, execve () снова сбросит LD_LIBRARY_PATH.

Вопрос: Я хотел бы знать, что такое поведениевсе еще предназначен, или если я пропустил некоторые возможности proc / thread, я должен также изменить, чтобы дочерний процесс не унаследовал родительское «безопасное» выполнение и, следовательно, сохранил мой новый env без изменений?[EDIT] Похоже, это действительно связано с возможностями, влияющими на дочерний процесс. [/ EDIT]

спасибо.

1 Ответ

0 голосов
/ 18 декабря 2018

Теперь, когда я обнаружил, что проблема связана с возможностями и , а не с setuid , кажется, это также желаемое поведение, как упомянуто в этом посте https://stackoverflow.com/a/10215158/10801865

...