Quá trình mà de-leo thang đặc quyền thông qua setuid()
và setgid()
dường như không kế thừa các thành viên nhóm của uid / gid họ thiết lập.
Tôi có một quy trình máy chủ phải được thực thi như root để mở một cổng đặc quyền; sau đó, nó giảm xuống mức uid / gid không riêng tư cụ thể, 1 - ví dụ: của người dùng foo
(UID 73). Người dùng foo
là thành viên của nhóm bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Do đó, nếu tôi đăng nhập foo
, tôi có thể đọc một tệp /test.txt
có các đặc điểm sau:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Tuy nhiên, chương trình C sau (biên dịch std=gnu99
), khi chạy root:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
Luôn báo cáo Quyền bị từ chối . Tôi tưởng tượng điều này có liên quan đến nó là một quá trình không đăng nhập, nhưng nó cản trở cách thức các quyền được cho là hoạt động.
1. Thường là SOP cho máy chủ và tôi nghĩ phải có cách giải quyết vấn đề này khi tôi tìm thấy một báo cáo về ai đó làm điều đó với apache - apache đã được thêm vào nhóm âm thanh và sau đó rõ ràng có thể sử dụng hệ thống âm thanh. Tất nhiên, điều này có thể xảy ra trong một ngã ba chứ không phải quá trình ban đầu, nhưng trên thực tế trường hợp này giống nhau trong bối cảnh của tôi (đó là một quá trình con được chia rẽ sau cuộc gọi setuid).
setgid(54)
thay vì setgid(73)
(như trong /etc/groups
, nhóm bar
có gid 54), nó có hoạt động không?
setuid()
một lần nữa sau khi bạn làm điều đó ... nhưng, hmmm ... Tôi nghĩ rằng bạn có thể với seteuid()
...
setuid()
/setgid()
cuộc gọi xung quanh.