下運行的進程的環境假設我有一個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;
}
謝謝。我看了你提到的代碼。它最終調用ptrace_may_access(task,PTRACE_MODE_READ)除了uid,suid和euid之外還檢查進程的gid/egid/sgid。給可執行setgid並添加setresgid調用解決了我的問題。 – 2012-03-09 21:00:03