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