Linux 시스템에 일부 C++ 코드가 있고 그 목적은 일부 코드를 임의의 사용자로 실행하는 것입니다.
#include <sys/capability.h>
#include <unistd.h>
void doAsUser(uid_t uid) {
if (CAP_IS_SUPPORTED(CAP_SETUID)) {
cout << "Do we have CAP_SETUID? " << cap_get_bound(CAP_SETUID) << endl;
} else {
cout << "CAP_SETUID not supported!" << endl;
}
uid_t ruid, euid, suid;
getresuid(&ruid, &euid, &suid);
cout << "UIDs: " << ruid << " " << euid << " " << suid << endl;
// assume credentials of user
status = seteuid(uid);
if (status < 0) {
cerr << "FATAL ERROR: Couldn't set uid: " << strerror(errno) << endl;
exit(1);
}
// do stuff here...
// re-assume credentials of program
status = seteuid(my_uid);
if (status < 0) {
cerr << "FATAL ERROR: Couldn't reset uid: " << strerror(errno) << endl;
exit(1);
}
}
그러나 이 함수를 실행하면 확실히 다음과 같은 결과가 출력됩니다.
$ sudo ./program
...
Do we have CAP_SETUID? 1
UIDs: 0 0 0
FATAL ERROR: Couldn't set uid: Operation not permitted
여기서 무슨 일이 일어나고 있는 걸까요? 제 생각에는 루트(UID 0 및 CAP_SETUID)로 실행되는 것이 다른 사용자의 유효한 UID를 가정할 수 있다고 생각합니다.
편집하다:이 문제"통화를 수행하려면 seteuid
당시 EUID가 0이 아니더라도 SUID는 0이어야 합니다"라고 나와 있기 때문에 내 질문에 완전히 대답하지 않습니다. 내 SUID는 0이고, 내 CAP_SETUID는 1이며, 다른 보안 프레임워크는 없습니다.