2012-03-02 37 views
0

我試圖與設置setuid位的python腳本執行。屬於用戶'bgmc'的程序必須在目錄'/ home/bgmc'中創建一些文件,但是被另一個用戶'client'調用。事實上,我不希望用戶'客戶'更改程序創建的文件。我使用的C-包裝調用程序(見setuid on shell scripts):如何在非root用戶的程序中設置setuid位?

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    setuid(0); 
    system("/home/bgmc/myprogram.sh"); 
    return 0; 
} 

我設置程序的setuid位。當c編譯的程序屬於根目錄時,程序運行良好並創建預期的文件。在C編譯程序的性能,那麼:

8 -rws--x--x 1 root root 4657 Mar 2 16:25 myprogram 

然而,當我更改用戶組myprogram來bgmc:bgmc,程序不能再創建文件:「權限被拒絕」。我試圖改變行:

setuid(0); 

與:

setuid(1002); 

由於1002是 'bgmc' 的用戶ID(我使用命令 「ID -u bgmc」 此),但是這沒」幫助。

我寧願不給該程序的root訪問權限。有沒有辦法來防止這種情況?

回答

2

不知道這些,因爲你的問題是在信息非常少,但是你忘了更改後店主對文件的權限重置?在大多數系統中,所有權的任何更改都會自動刪除setuid位,如果需要,您必須自行重新添加。

還要注意的是setuid的shell腳本是一個主要漏洞;這就是爲什麼內核不允許你直接創建shell腳本setuid。至少,你應該:

  1. 使用execve,而不是system調用它,並
  2. 清除出從環境中的一切(或傳遞一個新的空環境execve)。

因爲它是現在,誰可以運行該程序可以讓它爲所欲爲,通過控制環境變量喜歡。

+0

謝謝您的回答。既然你說過setuid shell腳本是很危險的,我試着設置腳本來代替。然而,這似乎並不奏效,儘管我的目錄具有正確的權限(775)。在Linux下,setgid腳本既沒有效果?我應該在這種情況下製作一個c-wrapper嗎? – 2012-03-07 10:42:55

+0

setgid的問題與setuid相同。無論組擁有什麼權限,您都可以爲系統上的所有用戶授予這些權限,因爲利用腳本獲取這些權限並不重要。因此,內核不支持腳本中的setgid。 – 2012-03-07 14:12:22

+0

謝謝!我用你說的'execve'(或者更確切地說'execle',我想這些都是等價的)並且給它一個空的環境。我的問題是:究竟應該怎樣清除這種方式?因爲通過清除環境,我的程序無法再對python中的某些庫(包含「import」;即「import matplotlib.pyplot」)進行重寫。所以,我寧願不明確的一切.. – 2012-03-07 16:17:03

相關問題