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、他のセキュリティフレームワークはありません。