3

私は suid エリアを探索していますが、この質問に答えることができないことに気づきました。質問のために、プログラム バイナリが suid であり、ユーザー 1001 が所有し、ユーザー 1000 (両方ともroot 以外) が実行していると仮定します。つまり、RUID=1000、EUID=1001 です。

_POSIX_SAVED_IDSが設定されている場合、RUID と EUID を (それぞれ) 1000 から 1001 の間で変更するためにsetuid()andを使用できます。seteuid()

ただし、_POSIX_SAVED_IDSが設定されていない場合は、後でseteuid(1000)行うことができなくなり、後で同じことを行います。seteuid(1001)setuid(1001)setuid(1000)

EUID を RUID に変更し、後で戻る可能性を維持するために、GNU Setuid Program Exampleで見つけた解決策は、使用するsetreuid(1001,1000)(それらを交換する) ことです。これにより、RUID が変更されるため、プログラムにどのような影響がありますか? 私が理解していることから、プロセスの所有者が変更されるため、プロセスを強制終了または操作する権限に影響があります。
_POSIX_SAVED_IDS を使用しないシステムは?

4

2 に答える 2

1

POSIXは_POSIX_SAVED_IDS正の値で定義する必要があるため、システムにが欠けていることはありません_POSIX_SAVED_IDS

出典: http: //pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html

于 2012-10-15T20:12:46.570 に答える
0

これに対処する必要がありましたが、これまでのところ、以下の部分は適切に回答されていません。

EUID を RUID に変更し、後で戻る可能性を維持するために、GNU Setuid Program Example で見つけた解決策は、setreuid(1001,1000) を使用することです (それらを交換します)。これにより、RUID が変更されるため、プログラムにどのような影響がありますか? 私が理解していることから、プロセスの所有者が変更されるため、プロセスを強制終了または操作する権限に影響があります。

どこでも起こるのは、EUID が、ファイルへのアクセスやプロセスの強制終了などのアクセス許可に使用される唯一のものであるということです (いくつかのまれな例外が適用される場合があります)。アイデアは、EUID と RUID の間で切り替えることができるということですが、それらの間のみです。カーネルは、これら 2 つの ID を追跡する必要があります。

seteuid非ルートユーザーの場合、EUID、RUID、およびカーネルがサポートしている場合は SUID のいずれかに切り替えることのみが許可されます。

システムが POSIX に準拠している場合、SUID を使用できるため、次のようになります。

// uids are: EUID=1001, RUID=1000, SUID=1001
seteuid(1000) ; // works because RUID=1000
// uids are: EUID=1000, RUID=1000, SUID=1001
seteuid(1001); // works because SUID=1001

SUID のないシステム:

// uids are: EUID=1001, RUID=1000
seteuid(1000); // works because RUID=1000
// uids are: EUID=1000, RUID=1000
seteuid(1001); // fails, neither EUID, nor RUID is 1001

逆に

// uids are: EUID=1001, RUID=1000
setreuid(1001, 1000) ; // works because EUID=1001 and RUID=1000
// uids are: EUID=1000, RUID=1001
setreuid(1000, 1001); // works because EUID=1000 and RUID=1001

SUID を変更する必要があるため、POSIX 準拠システムで特権を永続的に削除する標準的な方法は見つかりませんでした。gnu 拡張のみが利用可能です:

// uids are: EUID=1001, RUID=1000, SUID=1001
setresuid(1000, 1000, 1000);
// uids are: EUID=1000, RUID=1000, SUID=1000

参照: https://people.eecs.berkeley.edu/~daw/papers/setuid-usenix02.pdf

于 2019-02-13T17:47:22.707 に答える