すべてのUIDが0の場合でもsetuidは失敗します。

すべてのUIDが0の場合でもsetuidは失敗します。

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

ここで何が起こっているのでしょうか?私の考えでは、root(UID 0とCAP_SETUID)で実行されることは、他のユーザーの有効なUIDを想定できると思います。

編集する:この問題「通話を実行するには、seteuid当時EUIDが0でなくてもSUIDは0でなければなりません」と示されているため、私の質問には完全に答えません。私のSUIDは0、私のCAP_SETUIDは1、他のセキュリティフレームワークはありません。

関連情報