У меня есть простая программа, чтобы проверить, имеет ли указанный пользователь (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
Программа с флагом Suid не работает должным образом ⇐ Linux
-
Anonymous
1740232953
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79458076/program-with-suid-flag-not-working-properly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия