Программа с флагом Suid не работает должным образомLinux

Ответить Пред. темаСлед. тема
Anonymous
 Программа с флагом Suid не работает должным образом

Сообщение Anonymous »

У меня есть простая программа, чтобы проверить, имеет ли указанный пользователь (1001) доступ к указанному файлу. Владелец программы - «root», и дополнительно у программы есть набор флага S '(SUID). После выполнения «Sudo Su» и запуска программы результат верен. Функции «Access» показывают, что пользователь 1001 не имеет доступа к файлу.

output: < /p>
Program user ids at start: real: 0, efective: 0, set: 0
Switch to user uid: 1001 gid: 1001
Program user id's after switch: real: 1001, efective: 1001, set: 1001
Program group id's after switch: real: 1001, efective: 1001, set: 1001
File read permission acces: -1, euidacces: -1
< /code>
Но после входа в систему как пользователь 1000, который является владельцем тестируемого файла и имеет все права на него, результат неверен.
Программа возвращает, что пользователь 1001 имеет Доступ к чтению и все отображаемые сообщения указывают на то, что программа правильно переключается на пользователь 1001.

output: < /p>
Program user ids at start: real: 1000, efective: 0, set: 0
Switch to user uid: 1001 gid: 1001
Program user id's after switch: real: 1001, efective: 1001, set: 1001
Program group id's after switch: real: 1001, efective: 1001, set: 1001
File read permission acces: 0, euidaccess: 0
< /code>
Где проблема ?? Я нашел ошибку в библиотеке?? 22.04) < /p>
Источник программы, скомпилированный с 'gcc test.c -o test2': < /p>
#define _GNU_SOURCE
#include
#include
#include
#include
#include

int main(int argc, char **argv) {
uid_t uid = 1001, ruid, euid, suid;
uid_t rgid, egid, sgid;
const char *path = "/backed11/test2.bin";
// Output from ls: -rw-rw---- 1 1000 1000 16401 gru 30 11:49 /backed11/test2.bin
struct passwd *pw = getpwuid(uid);
if(pw == NULL) {
printf("Incorrect user ID: %d errno: %d\n", uid, errno);
return(errno);
}
if(getresuid(&ruid, &euid, &suid) < 0) {
printf("getresuid error: %d\n", errno);
return(errno);
}
printf("Program user ids at start: real: %d, efective: %d, set: %d\n", ruid, euid, suid);
printf("Switch to user uid: %d gid: %d\n", pw->pw_uid, pw->pw_gid);
int st = setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid);
if(st < 0) {
printf("setregid error for gid %d : %d\n", pw->pw_gid, errno);
return(errno);
}
st = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
if(st < 0) {
printf("setreuid error: %d\n", errno);
return(errno);
}
if(getresuid(&ruid, &euid, &suid) < 0) {
printf("getresuid error: %d\n", errno);
return(errno);
}
if(getresgid(&rgid, &egid, &sgid) < 0) {
printf("getresgid error: %d\n", errno);
return(errno);
}
printf("Program user id's after switch: real: %d, efective: %d, set: %d\n", ruid, euid, suid);
printf("Program group id's after switch: real: %d, efective: %d, set: %d\n", rgid, egid, sgid);
st = access(path, R_OK);
int st2 = euidaccess(path, R_OK);
printf("File read permission acces: %d, euidaccess: %d\n", st, st2);
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... g-properly
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»