通常、これはバイナリのsuid-rootを作成することによって行われます。
プログラムに対する攻撃を困難にするためにこれを管理する1つの方法は、次のようにrootとして実行されるコードを最小化することです。
int privileged_server(int argc, char **argv);
int unprivileged_client(int argc, char **argv, int comlink);
int main(int argc, char **argv) {
int sockets[2];
pid_t child;
socketpair(AF_INET, SOCK_STREAM, 0); /* or is it AF_UNIX? */
child = fork();
if (child < 0) {
perror("fork");
exit(3);
} elseif (child == 0) {
close(sockets[0]);
dup2(sockets[1], 0);
close(sockets[1]);
dup2(0, 1);
dup2(0, 2); /* or not */
_exit(privileged_server(argc, argv));
} else {
close(sockets[1]);
int rtn;
setuid(getuid());
rtn = unprivileged_client(argc, argv, sockets[0]);
wait(child);
return rtn;
}
}
これで、非特権コードはfd comlink(接続されたソケット)を介して特権コードと通信します。対応する特権コードは、comlinkの終わりとしてstdin/stdoutを使用します。
特権コードは、実行する必要のあるすべての操作のセキュリティを検証する必要がありますが、このコードは非特権コードに比べて小さいため、かなり簡単です。