У меня есть простая программа, чтобы проверить, имеет ли указанный пользователь (1001) доступ к указанному файлу. Владелец программы - «root», и дополнительно у программы есть набор флага S '(SUID). После выполнения «Sudo Su» и запуска программы результат верен. Функции «Access» показывают, что пользователь 1001 не имеет доступа к файлу.
output: < /p>
идентификаторы пользователей программы при запуске: Real: 0 , Efective: 0, установите: 0
Переключение на User UID: 1001 GID: 1001
ID пользователя программы After Switch: Real: 1001, Efective: 1001, SET: 1001
идентификаторы группы программ после переключения: Real: 1001, Efective: 1001, Set: 1001
Acces: -1, euidacces: -1 < /strong> < /p >
Но после входа в систему в качестве пользователя 1000, который является владельцем тестируемого файла и имеет все права на него, результат неверен.
Программа возвращает, что пользователь 1001 имеет доступ к чтению и все отображаемые сообщения указывают на то, что программа правильно переключается на пользователь 1001.
output: < /p>
идентификаторы пользователей программы в Start: Real: 1000, Efective: 0, установите: 0
переключать на пользователь UID: 1001 GID: 1001
идентификаторы пользователя программы после переключения: Real: 1001, Efective: 1001, SET: 1001
идентификаторы группы программ после переключения: Real: 1001, Efective: 1001, SET: 1001
Acces Acces: 0, Euidaccess: 0 < /strong> < /p> < /p> < /p> < /p> < /p> < /p> < /p> < /p> < /p> < /p> < /p> < /p> br /> Где проблема ?? Я нашел ошибку в библиотеке?? 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
Программа с флагом Suid не работает должным образом ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение