2012-03-09 46 views
0

下運行的進程的環境假設我有一個PID 1234的過程中下用戶A.獲得不同的用戶

後臺運行,如果我運行下面的程序爲用戶A,它成功。如果我以用戶B的身份運行它,它將以open: Permission denied失敗。

這很有道理,因爲environ文件爲用戶A所有,並且只有A的讀權限。 但是,如果我爲用戶A設置程序set-user-ID並將其作爲用戶B運行,則它將失敗read: Permission denied。這似乎沒有發生與具有相同權限的常規文件。如果A是根,這也不會發生。

任何想法爲什麼?是否有其他方法可以獲得適用於此問題的另一個流程的環境?

#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(int argc, const char *argv[]) 
{ 
    unsigned char ch = 0; 
    int fd = -1; 
    int read_result = -1; 

    setresuid(geteuid(), geteuid(), geteuid()); 

    fd = open("/proc/1234/environ", O_RDONLY); 
    if (-1 == fd) { 
     perror("open"); 
     return EXIT_FAILURE; 
    } 

    read_result = read(fd, &ch, 1); 
    if (-1 == read_result) { 
     perror("read"); 
     return EXIT_FAILURE; 
    } 

    close(fd); 

    return EXIT_SUCCESS; 
} 

回答

0

正如你所看到的,如果你的程序運行沒有 SETUID,開放(2)給你Permission denied,而如果你 SETUID運行程序,開放(2)工作正常,但讀( 2)導致相同的錯誤。發生這種情況是因爲在每個文件操作期間在/proc/* inode中進行了額外的權限檢查。看起來這個額外的權限檢查使用的是正在運行的進程的EUID以外的內容。如果您運行GNU/Linux,請參閱注意<kernel_source>/fs/proc/base.c和environ_read()函數中的代碼開頭位於同一文件中。

一個可能快速的解決方案:程序文件的

  • 集所有者root
  • 集所有者組到一些特殊羣體
  • 添加用戶應當運行的程序(用戶B)到該特殊組
  • 集模式位到4550(R-SR-X ---)
  • 呼叫setuid(getuid())閱讀之後儘快,即下降priveleges文件

在這種情況下從給定的組中的任何用戶可以讀取的任何其他用戶/proc/*/environ

如果你想減少程序的權限,只允許讀取特定用戶(用戶A)的environ文件,那麼你可能應該考慮一些其他的技巧。例如配置文件,其中包含可以讀取其environ文件的用戶。

一定要小心額外的權限。特別是與根權限權限。儘快進行必要的特權操作並刪除權限。

+0

謝謝。我看了你提到的代碼。它最終調用ptrace_may_access(task,PTRACE_MODE_READ)除了uid,suid和euid之外還檢查進程的gid/egid/sgid。給可執行setgid並添加setresgid調用解決了我的問題。 – 2012-03-09 21:00:03