GNU/Linux >> Linux の 問題 >  >> Linux

RealUID、保存された UID、有効な UID。どうしたの?

2 つのケースがあります。

<ブロック引用> <オール>
  • setuid プログラムの実行中に root 権限を一時的に落としたい
  • setuid プログラムの実行中に root 権限を完全に削除したい...
    • euid を実際のユーザー ID に設定してから、uid を任意の値に変更することで、一時的にこれを行うことができます。その後、root 権限が必要になったときに、uid を root に設定すると、有効なユーザー ID が root に戻ります。 .これは、保存されたユーザー ID が変更されていないためです。
    • uid をすぐに権限の低いユーザー ID に変更することで、権限を完全に削除できます。この後、何があっても root 権限を取り戻すことはできません。

    ケース 1:

    setuid プログラムの実行開始後

    1.seteuid(600);
    2.setuid(1000);
    3.setuid(0);
    

    この場合、root 権限を再び取得できます。

                  +----+------+------------+
                  | uid|euid  |saved-uid   |
                  |----|------|------------|
                1.|1000| 0    | 0          |
                2.|1000| 600  | 0          |
                3.|1000| 1000 | 0          |
                4.|1000|  0   | 0          |
                  |    |      |            |
                  +------------------------+
    

    ケース 2:

    setuid プログラムの実行開始後

    1.setuid(1000);
    2.setuid(0);
    
    
    
                   +----+------+------------+
                   | uid|euid  |saved-uid   |
                   |----|------|------------|
                 1.|1000|0     | 0          |
                 2.|1000|1000  | 1000       |
                   |    |      |            |
                   +------------------------+
    

    この場合、root 権限を取り戻すことはできません。これは次のコマンドで確認できます。

    cat /proc/PROCID/タスク/PROCID/ステータス |少ない

    Uid:    1000    0       0       0
    Gid:    1000    0       0       0
    

    このコマンドは、Uid と Gid を表示し、4 つのフィールドがあります (最初の 3 つのフィールドが対象です)。上記のようなもの

    3 つのフィールドは、uid、euid、および保存されたユーザー ID を表します。 setuid プログラムに一時停止 (ユーザーからの入力) を導入し、各ステップで cat /proc/PROCID/task/PROCID/status | less をチェックできます。 指図。各ステップで、前述のように保存された uid が変更されていることを確認できます。

    euid が root で、uid を変更すると、特権は完全に削除されます。有効なユーザー ID が root でない場合、保存されたユーザー ID は変更されず、いつでも root 特権を取り戻すことができます。あなたのプログラムで。


    <ブロック引用>

    説明 setuid() は、呼び出しプロセスの実効ユーザー ID を設定します。呼び出し元の実効 UID が root の場合、実際の UID と保存された set-user-ID も設定されます。

    Linux では、_POSIX_SAVED_IDS 機能を備えた POSIX バージョンのように setuid() が実装されています。これにより、set-user-ID (root 以外) プログラムは、すべてのユーザー特権を削除し、特権のない作業を行ってから、元の有効なユーザー ID を安全な方法で再利用できます。

    ユーザーが root であるか、プログラムが set-user-ID-root である場合は、特別な注意が必要です。 setuid() 関数は、呼び出し元の実効ユーザー ID をチェックし、それがスーパーユーザーである場合、すべてのプロセス関連のユーザー ID が uid に設定されます。これが発生すると、プログラムが root 権限を取り戻すことはできなくなります。

    したがって、root 特権を一時的にドロップし、非特権ユーザーの ID を想定し、後で root 特権を取り戻すことを望む set-user-ID-root プログラムは、setuid() を使用できません。これは seteuid(2) で実現できます。

    (Linux Programmers' Manual、2014-09-21、ページ setuid.2 より) )


    おお!これらの機能は正しく使うのが難しい.

    <ブロック引用>

    man ページには、setuid が実際の保存済みの有効な uid を変更すると記載されています。そのため、setuid(1000) を呼び出した後、3 つすべてが 1000 に変更されます。

    これは、euid 0 の場合にのみ当てはまります。setuid(0) を呼び出した時点で 、しかし、あなたは euid 1000 であり、保存されています uid 0 (getresuid(2) をチェック) 、 例えば)。そのため、特権を取り戻すことができます。


    Linux
    1. SSL証明書とは何ですか?

    2. とは :-!! Cコードで?

    3. sudo をトレースできません。有効な uid がゼロでないことを報告します

    1. Linuxユーザーとは何ですか?

    2. 「lc_all=c」は何をしますか?

    3. Setuidビットを適切に使用していますか?

    1. システム管理者とは何ですか?

    2. 何をしますか?

    3. エコー$は何ですか?行う??