euid, ruid, suid
ユーザー識別変数
ruid
: 実ユーザーIDはプロセスを開始したユーザーを示します。euid
: 有効ユーザーIDとして知られ、システムがプロセス特権を確定するために使用するユーザーIDを表します。一般的に、euid
はruid
と同じであり、SetUIDバイナリの実行などの場合を除いて、euid
はファイル所有者のIDを取り、特定の操作権限を付与します。suid
: この保存されたユーザーIDは、一時的に特定のタスクを実行するために高特権プロセス(通常はrootとして実行)が特権を一時的に放棄する必要がある場合に重要です。後で元の昇格された状態を取り戻します。
重要な注意事項
rootで動作していないプロセスは、現在のruid
、euid
、またはsuid
に一致するようにeuid
を変更できます。
set*uid関数の理解
setuid
: 最初の仮定とは異なり、setuid
は主にruid
ではなくeuid
を変更します。特権プロセスの場合、setuid
はruid
、euid
、およびsuid
を指定されたユーザー(通常はroot)と一致させ、これらのIDを効果的に固定します。詳細な情報はsetuid man pageにあります。setreuid
およびsetresuid
: これらの関数はruid
、euid
、およびsuid
を微調整することを可能にします。ただし、その機能はプロセスの特権レベルに依存します。rootプロセスまたはCAP_SETUID
機能を持つプロセスは、これらのIDに任意の値を割り当てることができます。詳細はsetresuid man pageおよびsetreuid man pageから得ることができます。
これらの機能はセキュリティメカニズムではなく、プログラムが他のユーザーのIDを採用する際など、意図した操作フローを容易にするために設計されています。
setuid
はrootへの特権昇格に一般的に使用されるかもしれませんが、これらの関数の違いを区別することは、さまざまなシナリオでユーザーIDの動作を理解し操作するために重要です。
Linuxでのプログラム実行メカニズム
execve
システムコール
execve
システムコール機能:
execve
は最初の引数で決定されたプログラムを開始します。argv
は引数用、envp
は環境用の2つの配列引数を取ります。動作: 呼び出し元のメモリ空間を保持しますが、スタック、ヒープ、およびデータセグメントをリフレッシュします。プログラムのコードは新しいプログラムに置き換えられます。
ユーザーIDの保持:
ruid
、euid
、および補助グループIDは変更されません。新しいプログラムがSetUIDビットを設定している場合、
euid
に微妙な変更が加えられる可能性があります。実行後、
suid
はeuid
から更新されます。ドキュメント: 詳細な情報は
execve
man pageにあります。
system
関数
system
関数機能:
execve
とは異なり、system
はfork
を使用して子プロセスを作成し、その子プロセス内でexecl
を使用してコマンドを実行します。コマンドの実行:
execl("/bin/sh", "sh", "-c", command, (char *) NULL);
を使用してsh
を介してコマンドを実行します。動作:
execl
はexecve
の形式であるため、新しい子プロセスのコンテキストで同様に動作します。ドキュメント:
system
man pageからさらなる洞察を得ることができます。
SUIDを持つbash
およびsh
の動作
bash
およびsh
の動作bash
:-p
オプションがeuid
とruid
の扱いに影響を与えます。-p
なしでは、bash
は最初に異なる場合にeuid
をruid
に設定します。-p
を使用すると、初期のeuid
が保持されます。詳細は
bash
man pageで確認できます。sh
:bash
の-p
に類似したメカニズムを持っていません。ユーザーIDに関する動作は明示的に述べられておらず、
-i
オプションの下でのみeuid
とruid
の等しさの保持が強調されています。追加情報は
sh
man pageで入手できます。
これらの操作方法は、操作とプログラム間の移行を可能にし、ユーザーIDがどのように管理および保持されるかに特定の微妙な違いがある、多様なオプションを提供します。
実行中のユーザーIDの動作をテストする
詳細については、https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail から取得した例を確認してください。
ケース1: system
とbash
をsh
と組み合わせてsetuid
を使用する
system
とbash
をsh
と組み合わせてsetuid
を使用する目的: setuid
をsystem
およびbash
としてsh
と組み合わせて使用した場合の効果を理解する。
Cコード:
コンパイルと権限:
分析:
ruid
とeuid
は最初にそれぞれ99(nobody)と1000(frank)から始まります。setuid
は両方を1000に揃えます。system
は/bin/bash -c id
を実行します。これはshからbashへのシンボリックリンクによるものです。-p
を付けずに実行されるbash
は、euid
をruid
に合わせ、結果として両方が99(nobody)になります。
ケース2: setreuidをsystemと一緒に使用する
Cコード:
コンパイルと権限:
実行と結果:
分析:
setreuid
は ruid と euid を両方とも 1000 に設定します。system
は bash を呼び出し、ユーザー ID を等しく保持するため、実質的に frank として動作します。
ケース 3: execve と setuid の相互作用の探索
目的: setuid と execve の相互作用を探る
実行と結果:
分析:
ruid
は99のままですが、euid は1000に設定され、setuid の効果と一致しています。
Cコード例2(Bashの呼び出し):
実行と結果:
分析:
euid
はsetuid
によって1000に設定されていますが、-p
がないため、bash
はruid
(99) に euid をリセットします。
Cコード例3 (bash -p を使用):
実行と結果:
参考文献
Last updated