2011-05-12 54 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代碼可以使適當的調用切換。