同じブートサイクルでsetuid(0)を使用してプロセスにroot権限を再割り当てすることはできません。

同じブートサイクルでsetuid(0)を使用してプロセスにroot権限を再割り当てすることはできません。

ターミナルで、次のcmdを使用してこの機能(組み込みファイルにCAP_SETUIDを設定する代わりに)を追加しました。確認された setuid/seteuid が正常に動作しています。

setcap  cap_sys_admin,cap_setuid+ep   /usr/bin/<processname>

今、私のプロセスをroot権限に設定したいのですが-->sync()-->元の権限に設定--->いくつかのタスクを実行します-->再びrootとして設定--->sync()

setuid()を使用している間、ブートサイクルごとに一度だけプロセスをrootに設定できることがわかりました。ただし、 seteuid() を介しても実行できます。試してみましたが、まだ期待した結果は得られません。

私が見逃している部分や作業中の部分を提案してもらえますか?

int id = geteuid();
int r0= seteuid(0); // This will raise process to root mode     
sync();  //process can perform operation as root  user
seteuid(id);  //set process as non root  user

最初のr0は0[成功]で、2番目のr0は-1[seteuid(0)のエラー]です。 (同じ発売サイクルで)よろしくお願いします。

答え1

残念ながら、カーネル文書には明確な説明がありません。ヒントは次のとおりですman 2 setuid

ユーザーがrootまたはプログラムがset-user-ID-rootの場合は、特別な注意が必要です。 setuid()は呼び出し元の有効なユーザーIDを確認し、スーパーユーザーの場合はすべてのプロセス関連のユーザーIDがuidに設定されます。 。これが発生した後、プログラムがroot権限を再取得することは不可能になります。

この主張が無効になるように機能を追加することはあまり意味がありません。 FSCAPプログラムがSUIDルートプログラムよりも強力な理由は何ですか?

もしこの回答SOで正しい場合、あなたの質問は次のように解釈されることがあります。

デフォルトでは、UID変換中に機能セットが失われます。

setuid()とのさまざまな動作seteuid()は意図的であり、さまざまなシナリオを網羅しています(ルートに戻すことはできません(許可しません))。

関連情報