Использование setuid в Ubuntu для исполнения Java из C - PullRequest
0 голосов
/ 12 июня 2011

Я использую Ubuntu 11.04.

Я пытаюсь использовать execlp-программу "C" для запуска Java-программы, а затем я хочу установить setuid для программы "C", чтобы Java-программа могла выполняться как root. Вот пример этого здесь:

http://www.coderanch.com/t/110254/Linux-UNIX/setuid

Я следовал примеру до буквы, но вместо того, чтобы быть пользователем tomcat, я использовал root.

Root может выполнять программу "C", которая, в свою очередь, выполняет программу Java. И, прежде чем передать права владения root, Пользователь (я) может запустить программу «C», которая выполняет программу Java. Но однажды я настроился на использование setuid, и Пользователь пытается выполнить программу. Я получаю ошибку типа LD_LIBRARY_PATH: java: ошибка при загрузке общих библиотек: libjli.so: не удается открыть файл общих объектов: нет такого файла или каталога

Файл libjli.so существует в Java JRE. Пользователь и Root могут видеть этот файл, когда они запускаются по отдельности. Но пользователь не может увидеть его, когда запускает программу после установки root.

Есть ли какой-нибудь другой способ, которым LD_LIBRARY_PATH root устанавливается при запуске программы setuid? Это интерактивная или неинтерактивная проблема?

Есть идеи? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 12 июня 2011

Установка бита setuid для файла изменит эффективный UID процесса, но не реальный UID.Динамический компоновщик проверит, если EUID ≠ RUID, и если так, он проигнорирует все переменные окружения.Ваша оболочка должна сама отфильтровать переменные окружения (важно!) И после этого изменить действительный UID в соответствии с действующим UID.

Предупреждение: Не забудьте очистить средупеременные хорошо, если вы не в порядке с предоставлением всем на коробке полный root-доступ.

0 голосов
/ 12 июня 2011

Чтобы обойти ограничения среды LD_* для программ setuid, на большинстве систем POSIX вы можете сделать это в коде оболочки:

setreuid(0, 0);

, который установит действительные UID и равными root, хотя это будет работать, только если сама программа была запущена с включенным битом setuid.

Я бы этого не сделал.

Посмотрите, почему ваша Java-программа должна запускаться с правами root, и посмотрите, есть ли более эффективные способы предоставления ей необходимых привилегий без фактического запуска с правами root.

0 голосов
/ 12 июня 2011

Поскольку переменные окружения LD_* могут использоваться для загрузки кода в процесс, все они игнорируются двоичными файлами setuid. Вам, вероятно, понадобится сделать двоичный файл setuid оболочкой, которая выполняет программу на Си.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...