2016-01-18 1 views
1

Я пишу программу, которая будет работать как разные пользователи на основе аутентификации. Программа является root setuid и использует PAM-аутентификацию перед отменой привилегий.Программа все еще может открывать только корневые файлы после setuid и setgid

Я использую setuid() и setgid() для удаления привилегий после аутентификации. Но, по-видимому, этого недостаточно, так как после вызова этой программы у меня все еще есть доступ к файлам root только open().

Любые предложения?

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

// Code to drop Priv 
int u = 1000, g = 1000; 

printf("Starting User %d Group %d\n", (int) getuid(), (int) getgid()); 
printf("Setting User %d Group %d\n", u, g); 
if (setgid(g) || setuid(u)) { 
    printf("Could not set uid or gid %d", errno); 
    return 0; 
} 
printf("Have set User %d Group %d\n", (int) getuid(), (int) getgid()); 

Выход из этого:

Starting User 0 Group 0 
Setting User 1000 Group 1000 
Have set User 1000 Group 1000 

И все же после вызова этого кода моя программа все еще может открыть файл, который корневые только права:

-rw-r----- 1 root root 505 May 5 2015 rootFile 

Код для открыто достаточно просто:

// Later 
int fd = open("rootFile", O_RDONLY); 
if (fd == -1) { 
    // Never happens 
} else { 
    // Happens 
} 
+1

Что такое 'pritnf'? Любые другие ошибки копирования? –

+0

Нет. Я просто использовал модифицированную функцию 'printf' и должен был заменить эти вызовы функций, чтобы сделать ее имеющей смысл. –

ответ

4

Посмотрите на эту статью: https://www.securecoding.cert.org/confluence/display/c/POS36-C.+Observe+correct+revocation+order+while+relinquishing+privileges

Похоже, что у вас может быть «проблема» с надменными группами. Перед установкой gid и uid выполните

setgroups(0, NULL); 

и ваш код должен работать.

+0

Спасибо, что указал мне в правильном направлении. Для этой цели я буду использовать 'initgroups()'. –