2 つのケースがあります。
<ブロック引用> <オール>- 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)
をチェック) 、 例えば)。そのため、特権を取り戻すことができます。