0

私はsetreuidと少し混乱しています。

シナリオ: プロセスは通常のユーザー (id: cateof) として実行されますが、ごく短時間、root として実行する必要があります。アクセス許可を cateof から root に昇格させてから、通常のユーザーに戻す必要があります。私が最初に考えたのは、「ルート呼び出し」を setreuid(0, 0); の間にネストすることでした。および setreuid(ruid, euid); 十分でしょうが、私は間違っていました。通常のユーザーに戻る唯一の方法は、「root 呼び出し」の後に setreuid(ruid, euid) を生で 2 回呼び出すことです。

コードは次のとおりです。

int main(...) {
    //check the permission, that the program is setuid
    //become normal user 
    ruid = getuid ();
    euid = geteuid ();
    setreuid(ruid, euid); 
    ...
    setreuid(0, 0);
    root_action();
    setreuid(ruid, euid); //undo root #1
    setreuid(geteuid(), getuid()); //undo root#2

最後の行でsetreuid(geteuid(), getuid())を呼び出さないと、プロセスはルートとして実行され続けます。なぜ私はそれを2回呼び出す必要があるのですか???

4

1 に答える 1

1

setreuidの最初の呼び出しは、実際には何もしません-特権を削除しません。基本的に、実際のuidをmyに設定getuidし、有効なuidをmygeteuidに設定します。これは、setuidアプリの場合はあなたと同じです。得られた。

setuidプログラムの開始時に、rootユーザーとして実行しbob、次にgetuid() == bobgeteuid() == root

特権を削除したい場合は、おそらく次のように呼び出す必要があります。

setreuid(euid, ruid);

Thadは、有効なuidをに設定しbob、実際のuidをに設定しroodます。それ以降に行われることはすべて、非特権ユーザーのボブによるものであるかのようにrootなります。保存されたユーザーID情報を消去していないため、この時点で特権に切り替える機能が完全に削除されていないことを理解しています。

ルート権限の取得は、次の方法で行われます。

setreuid(ruid, euid);

同様に、最後に、特権を再ドロップするときは、同じことを行う必要があります。

setreuid(euid, ruid);

つまり、有効なuidをidに設定しbobます。[ここでの回答][1]も同様の状況であり、詳細をもう少し簡潔に説明しています。

一般的に、この情報を確認するとき、小さなprinterhelperは次のようになります。

void printids(char *header) {
    uid_t ruid, euid, saveduid;
    getresuid(&ruid, &euid, &saveduid);
    printf("%s ruid=%d euid=%d saveduid=%d\n", header, ruid, euid, saveduid);
}

すべてのステップで特権/uid情報を決定するのに役立ちます。

seteuid()少し手間がかかるよりも、特権の一時的な変更に使用する方が少し簡単setreuid()です。この呼び出しを使用してsetresuid()、実際の効果的で保存されたユーザーID値の設定をより明確にすることもできます。

特権の保存と削除:

setresuid(ruid, ruid, euid);

root権限の再取得:

setresuid(euid, euid, -1);

root以外の権限に戻る:

setresuid(ruid, ruid, -1);

つまり、保存されたユーザーIDにルート情報を保持させ、ルートと非ルートを切り替えrealuidて値を操作します。euid

于 2012-05-08T15:58:56.877 に答える