首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用JNI无法在java中seteuid

调用JNI无法在java中seteuid
EN

Stack Overflow用户
提问于 2018-08-09 01:16:05
回答 1查看 340关注 0票数 1

我的应用程序需要以无根用户的身份运行,但需要切换到其他用户以执行一些命令。

我试着:

  1. 写个JNI, Java_SetUIDJNI_setuid(JNIEnv *env,jobject thisObj,jstring uname) { const char *name = jstringTostring(env,uname);int pid;struct passwd *p;show_ids();if (p= getpwnam(name)) ==空){perror(名称);exit(EXIT_FAILURE);} pid = (int) p->pw_uid;printf("pid=%d\n",pid);如果(seteuid (pid) < 0) { perror ("setuid");退出(EXIT_FAILURE);} show_ids();}
  2. 将其构建为rootchmod u+s -rwsr-xr-x1根76155 8月7日16:56 libsetuid.so*
  3. 在java中调用它 api =新的SetUIDJNI();//调用本机方法api.setuid("slurm");

但是,如果以无根的形式运行它,它就不能工作。

代码语言:javascript
复制
/opt/jdk1.8/jre/bin/java -Djava.library.path=../jni HelloJNI
 The real user ID is: 1000
 The effective user ID is :1000   <= which expected is 0
 setuid: Operation not permitted

但是,如果runner是root的话就能工作了。

代码语言:javascript
复制
The real user ID is: 0
The effective user ID is :0
pid=1002The real user ID is: 0
The effective user ID is :1002

这里有什么不对劲吗?

更新

将JNI部件修改为可执行的c

代码语言:javascript
复制
void show_ids (void)
 {
    printf ("The real user ID is: %d\n", getuid());
    printf ("The effective user ID is :%d\n", geteuid());
  }

 int main(void)
 {

    show_ids();
    if (seteuid (1002) < 0) {
      perror ("setuid");
      exit (EXIT_FAILURE);
    }
    show_ids();
    return (0);
  }

将其构建为root并运行chmod u+s

代码语言:javascript
复制
-rwsr-xr-x  1 root root 8814 Aug  9 11:44 a.out*

以普通用户的身份运行并工作。

代码语言:javascript
复制
./a.out
The real user ID is: 1000
The effective user ID is :0
The real user ID is: 1000
The effective user ID is :1002
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 07:36:02

JNI没有为您工作的原因是,seteuid进程的有效用户id不是0(根用户)。

显然,您试图通过在本机库上设置"setuid“位来生成有效的用户id。那不管用。类似地,将JAR文件(或类文件)作为setuid无法工作。setuid位仅在可执行文件上有意义;即操作系统本身知道如何执行的文件。

那么我们如何为Java程序实现"setuid行为“呢?

  • 理论上,您可以将/usr/bin/java标记为setuid为root。--不要这样做!--如果这样做的话,您运行的每个程序都将作为根用户运行。那就不好了。
  • 理论上,您可以编写一个shell脚本来启动应用程序。 #!/bin/sh java some.pkg.Main "$@“ 并将脚本标记为setuid为root。不要这样做! Setuid脚本是一个安全风险。(在Linux / UNIX的某些版本中,shell脚本并不尊重setuid位。)

解决方案是用本机代码编写自定义JVM启动程序,编译并链接它,并使启动程序可执行setuid。请注意,发射器必须非常小心地写出来,以对抗颠覆它的人。例如:

  • 它应该忽略CLASSPATH环境变量,不应该允许以任何其他方式提供类路径。
  • 它不应将用户提供的JAR文件作为参数。
  • 它应该注意用户不能通过干扰JAR文件的路径来欺骗它来运行错误的Java代码。
  • 还有其他事情..。我从来没想过!

实际上,以特权用户的身份运行Java应用程序可能更安全.根本不依赖"setuid root“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51757591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档