2011-05-12 52 views
2

我有一个作为用户www运行的web应用程序。然而,有一点需要代表用户Alice和Bob从Linux文件系统读取文件。JNI + setuid问题

这样做的一种方法是启动一个shell(Runtime.exec())并调用一个C setuid可执行文件来更改userid并读取该文件。

有没有办法用JNI来实现这个(Web应用程序需要以www而不是root身份运行)?我试图编写一个调用Linux上的本地方法的Java JNI程序(我使这些本地方法由root拥有,并设置了setuid位)。但是除非我以root身份运行Java程序,否则不会让我切换用户ID。有什么我失踪了吗?有没有办法做到这一点?

谢谢!

回答

2

不,没有。

  1. 的方法是根:setuidsetgid只能在两种情况下(在普通的Linux)来使用。
  2. 该过程是从setuidsetgid位以其模式启动的。

在前一种情况下,该进程可能会无条件地调用这些函数来采用任何身份。在后面的例子中,我只能在父进程的uid/gid和从其启动的文件的uid/gid之间来回切换进程。

也就是说,如果setuid,它可能会采用文件的uid,如果是setgid,gid。

既然你是在java中,exec-ed程序是java本身,你不想是setuid或setgid,除非你想创建一个巨大的安全风险。

您可以编写一个C或C++程序,通过JNI调用接口启动JVM,并将该程序设置为setuid或setgid,然后在那里调用JNI代码可以使适当的调用切换。