모든 UID가 0인 경우에도 seteuid가 실패합니다.

모든 UID가 0인 경우에도 seteuid가 실패합니다.

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이며, 다른 보안 프레임워크는 없습니다.

관련 정보