2011-06-12 19 views
0

我正在運行Ubuntu 11.04。在Ubuntu中使用setuid來從C執行Java

我想使用「C」execlp程序來運行Java程序,然後我想setuid在「C」程序上,以便Java程序可以作爲根執行。這裏有這樣的一個例子:

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

我所不同的而不是Tomcat的用戶的示例,以信,我用根。

根能夠執行「C」程序,然後執行Java程序。並且,在給予root用戶所有權之前,用戶(我)可以運行執行Java程序的「C」程序。但是,一旦我設置爲使用setuid,並且用戶嘗試執行該程序。我得到什麼似乎是錯誤的LD_LIBRARY_PATH類型: java的:錯誤而載入共享庫:libjli.so:無法打開共享對象文件:

的libjli.so文件下,不存在任何這樣的文件或目錄Java JRE。 User和Root都可以在單獨運行時看到這個文件。但是當用戶在setuid到root之後運行程序時,用戶看不到它。

當setuid程序執行時,根的LD_LIBRARY_PATH是否設置了一些不同的方法?這是一個交互式還是非交互式問題?

任何想法?提前致謝。

回答

0

由於LD_*環境變量可用於將代碼加載到進程中,它們都被setuid二進制文件忽略。您可能需要將setuid二進制文件作爲執行C程序的包裝器。

+0

現在我有一個包裝Java程序的C程序。您是否建議我使用腳本來封裝包含Java程序的C程序?還是你的意思是別的?我願意嘗試一切。請說明。謝謝。 – 2011-06-12 04:16:56

+0

是的 - 無論是一個腳本或另一個C程序,適當地設置'LD_LIBRARY_PATH'和'exec()'是C程序。 – duskwuff 2011-06-12 04:18:53

+0

我不認爲這會奏效。鏈接器檢測來自進程的EUID和RUID的setuid位,該進程保存在exec中。 – 2011-06-12 04:28:38

0

設置文件上的setuid位將改變進程的有效UID,但不會改變真實的UID。動態鏈接器將檢查EUID≠RUID,如果是,它將忽略所有環境變量。你的包裝器必須自己過濾環境變量(重要的!),一旦完成,改變真正的UID以匹配有效的UID。

警告:不要忘記擦洗環境變量,除非您可以給每個人提供完全的根訪問權限。

+0

我可能把我以前的評論放在錯誤的框中。通過清理環境變量,是否意味着我應該在從「C」包裝器「執行」Java程序之前以某種方式僅呈現最小和必要的環境變量集? – 2011-06-13 04:56:32

+0

不止於此。您還必須檢查環境變量是否具有允許的值。如果你所需要的只是ICMP ping,那麼你會反過來 - 嘗試將ping功能放在C程序中,並讓該程序以root身份運行。這將更安全,更簡單。 – 2011-06-13 05:51:03

0

要解決的setuid程序的LD_*環境的約束,在大多數POSIX系統,你應該能夠在您的封裝代碼中做到這一點:

setreuid(0, 0); 

將設置兩個真正的有效的UID到爲root,但這隻有在程序本身已啓用並啓用setuid位時纔有效。

雖然我不會這樣做。

看看爲什麼您的Java程序需要以root身份運行,並查看是否有更好的方式給它提供所需的權限,而無需真正以root身份運行。

+0

我的要求是Java程序在不使用OS命令(即不能使用/ usr/bin/ping)的情況下執行icmp ping。 Java中的InetAddress類在isReachable方法中執行icmp ping,但僅限於以root身份運行。 – 2011-06-13 03:31:17

+0

我忘了補充一點。我有點擔心這個告誡: – 2011-06-13 03:53:51

+0

對不起,看起來像打回來提前發送我的評論。我擔心「清理環境變量」。這聽起來像是可能導致另一個話題,因爲我不夠聰明,不知道這意味着什麼。你能指點一下我能讀到的關於這個話題的東西嗎?非常感謝我收到的幫助。 – 2011-06-13 03:57:17

相關問題