กระบวนการที่ยกเลิกการเลื่อนระดับสิทธิ์ผ่านsetuid()
และsetgid()
ดูเหมือนจะไม่ได้รับความเป็นสมาชิกกลุ่มของ uid / gid ที่พวกเขาตั้งค่า
ฉันมีกระบวนการเซิร์ฟเวอร์ที่ต้องดำเนินการเป็นรูทเพื่อเปิดพอร์ตสิทธิพิเศษ หลังจากนั้นจะยกเลิกการเลื่อนระดับไปเป็น uid / gid ที่ไม่มีสิทธิพิเศษเฉพาะ1 - เช่นของผู้ใช้foo
(UID 73) ผู้ใช้foo
เป็นสมาชิกของกลุ่มbar
:
> cat /etc/group | grep bar
bar:x:54:foo
ดังนั้นถ้าฉันเข้าสู่ระบบในฐานะfoo
ฉันสามารถอ่านไฟล์ที่/test.txt
มีคุณสมบัติเหล่านี้:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
อย่างไรก็ตามโปรแกรม C ต่อไปนี้ (คอมไพล์std=gnu99
) เมื่อรันรูท:
#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;
}
รายงานการอนุญาตถูกปฏิเสธเสมอ ฉันคิดว่าสิ่งนี้เกี่ยวข้องกับการเป็นกระบวนการที่ไม่ใช่การเข้าสู่ระบบ แต่เป็นการขัดขวางวิธีที่สิทธิ์ควรทำงาน
1. ซึ่งมักจะเป็น SOP สำหรับเซิร์ฟเวอร์และฉันคิดว่าต้องมีวิธีแก้ปัญหานี้เนื่องจากฉันพบรายงานว่ามีคนทำด้วย Apache - เพิ่ม Apache ลงในกลุ่มเสียงและสามารถใช้ระบบเสียงได้ แน่นอนว่าสิ่งนี้อาจเกิดขึ้นในทางแยกและไม่ใช่กระบวนการดั้งเดิม แต่ในความเป็นจริงกรณีนี้เหมือนกันในบริบทของฉัน (เป็นกระบวนการลูกที่แยกหลังจากการเรียก setuid)
setgid(54)
แทนsetgid(73)
(เหมือนใน/etc/groups
กลุ่มbar
มี gid 54) ใช้งานได้หรือไม่
setuid()
อีกหลังจากที่คุณทำ ... แต่ hmmm ... ฉันคิดว่าคุณสามารถทำได้seteuid()
...
setuid()
/setgid()
โทรไปรอบ ๆ