LINUX.ORG.RU

SUID + Java


0

0

Добрый день! Дописал таки "ru" на работе. ;)

Есть такой вот вопрос:

Имеется программа в Яве, которая должна запускаться от рута (там всякие забавы с DHCP). Хотелось бы ей сделать SUID. Делаю:

=== Cut ===
muf@zoo:~/wtf$ cat jmeter.c
/**
* We need to run jmeter and jmeter-server with SUID so that
* it is able to use DHCP client, and we can't SUID bash script
* due to security reasons (everything called in SUID script
* doesn't have SUID), so we write this warp
*/
#include <unistd.h>

int main(int argc, char **argv)
{
execv("/usr/lib/jakarta-jmeter-wip/bin/jmeter", argv);
return 0;
}
=== Cut ===

Все запускается просто прекрасно.

=== Cut ===
muf@zoo:~/wtf$ gcc jmeter.c
muf@zoo:~/wtf$ ./jmeter
=== Cut ===

Появляются Жаба окошки.

А вот если делаю этому "запускателю" SUID:

=== Cut ===
muf@zoo:~/wtf$ sudo chmod +s jmeter
muf@zoo:~/wtf$ ./jmeter
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav a:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.jmeter.NewDriver.main(NewDriver.java:172)
Caused by: java.lang.UnsatisfiedLinkError: /usr/lib/j2sdk1.5-sun/jre/lib/i386/libawt.so: libmlib_image.so:cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1668)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:992)
at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38)
at sun.awt.DebugHelper.<clinit>(DebugHelper.java:29)
at java.awt.Component.<clinit>(Component.java:545)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at org.apache.jmeter.JMeter.class$(JMeter.java:739)
at org.apache.jmeter.JMeter.getIconMappings(JMeter.java:737)
at org.apache.jmeter.plugin.PluginManager.installPlugin(PluginManager.java:54)
at org.apache.jmeter.plugin.PluginManager.install(PluginManager.java:48)
at org.apache.jmeter.JMeter.startGui(JMeter.java:220)
at org.apache.jmeter.JMeter.start(JMeter.java:294)
... 5 more
=== Cut ===

Главная ошибка похоже тут:

=== Cut ===
Caused by: java.lang.UnsatisfiedLinkError: /usr/lib/j2sdk1.5-sun/jre/lib/i386/libawt.so: libmlib_image.so:cannot open shared object file: No such file or directory
=== Cut ===

Посоветуйте куда покопать.

Пути у либам не определены, копать в сторону setenv, LD_LIBRARY_PATH, предварительно посмотрев правильный список окружения через команду env.

anonymous
()

так это... мяу... SUID'ные программы чхали (и правильно!) на LD_LIBRARY_PATH. Попробуй сделать не exec, а, например, system()

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

system() вызовет bash'а и SUID не распространится. system() - это в этом смысле тоже самое что ставить SUID на bash-script - все вызванные в bash-script'е команды не будут уже иметь рута. Зато оказалось что похоже работает вот так: === Cut === int main(int argc, char **argv) { setuid(0); // вот оно! return execv("/home/muf/jakarta-jmeter-2.0.3/bin/jmeter", argv); return 0; } === Cut === Завтра еще на работе проверю но без setuid'а у меня тоже плюется на то что не находит библиотек. Про LD_LIBRARY_PATH не знаю - видимо таки передаются переменные окружения при execv раз работает?

dissident ★★
() автор топика
Ответ на: комментарий от no-dashi

#*&$^#$*&^*&^$

МОжно как-то запомнить что когда пишу сообщения то всегда "User line break"??

system() вызовет bash'а и SUID не распространится. system() - это в этом смысле тоже самое что ставить SUID на bash-script - все вызванные в bash-script'е команды не будут уже иметь рута.

Зато оказалось что похоже работает вот так:

=== Cut ===
int main(int argc, char **argv)
{
setuid(0); // вот оно!
return execv("/home/muf/jakarta-jmeter-2.0.3/bin/jmeter", argv);
return 0;
}
=== Cut ===

Завтра еще на работе проверю но без setuid'а у меня тоже плюется на то что не находит библиотек.

Про LD_LIBRARY_PATH не знаю - видимо таки передаются переменные окружения при execv раз работает?

dissident ★★
() автор топика
Ответ на: комментарий от dissident

ОК, с setuid(0) и setgid(0) все просто чудно, но пришла новая мысль. Единственное что требует эта Ява прога для рута это биндование на порт <1024. Соответственно лучше ей наверное дать своего юзера который имеет право слушать на одном из таких портов и сделать setuid() в этого юзера правда?

Только вот как дать юзеру право слушать на портах < 1024?

dissident ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.