質問: プログラムのセクションにはルートアクセスが必要です ルートアクセスを必要とするいくつかの「ハウスキーピング」タスクを実行する必要があります(linux、debian)。通常は1回だけですが、実行されたことを確認する必要があります。ただし、プログラム全体をrootとして実行したくはありません。プログラム全体をrootとして使用せずに、これらのタスクを実行するための適切なパターンはありますか?タスクは固定されており、システムの外部からの入力はありません(つまり、ユーザー入力は必要ありません)。いくつかの既知のタスクには、ホスト名の変更とsdカードのフォーマットが含まれます。
回答: 答えは 特権分離 であり、sshや他の多くのネットワークデーモンで使用されています。アイデアは、2番目のプロセスをフォークすることです。プロセスの1つがroot権限を削除します。これらのプロセスの間にはパイプがあります。特権プロセスは、パイプからの入力を待機し、操作を実行して、パイプを使用して結果を返します。 (注:一部のオペレーティングシステムでは、パイプが双方向でない場合があるため、ソケットペアの方が優れている可能性があります。つまり、よりポータブルなオプションです。)特権コードは非常に注意深く実装する必要があるため、スタックを破壊する脆弱性はありません。もちろん、特権コードは任意のコマンドを実行する要求を受け入れることができません。そうしないと、特権分離の利点が失われます。つまり、特権コードは、特権タスクを実行するために、要求内のすべてを検証する必要があります。