私はsshfsで/を使ってディレクトリをマウントするためにユーザが呼び出せるプログラムを書いています。エラー処理と定型句が省略された基本レイアウトは次のとおりです。子プロセスはrootにseteuidする必要があります、親はありません
uid_t euid, ruid;
void mountDir(char *dirname, char *hostname){
childPid = fork();
if(childPid == 0){
char *sshfsArgs[6] = {"/usr/bin/sshfs", hostName, /*Other args*/};
seteuid(euid);
execv(sshfsArgs[0], sshfsArgs);
//I want to drop my setuid permissions with seteuid(ruid),
//but execv doesn't return.
}else{ //I'm the parent process.
//I don't want to have root permissions now.
wait(childPid);
}
}
void main(int argc, char **argv){
ruid = getuid();
euid = geteuid();
seteuid(ruid); //Drop the root permissions.
char **hostList = {"bulb.example.com", "char.example.com", argv[1]};
char * hostName = pickHost(hostList); //Pings them and picks one that responds.
mountDir("/net/home", hostName);
mountDir("/net/projects", hostName);
}
ここでもまた、多量のエラーチェックは省略されています。私はsshfs
を実行しているときにのみroot権限を持ちたいと思っています。 fork()
を呼び出す前にseteuid
特権を落とすいくつかの例がありますが、ここではそれらを子プロセスでのみ取得し、execv
の直後に失いたいと考えています。これをどうやって安全に行うのですか?子プロセスがルートにseteuid
を実行するとどうなりますか?親プロセスはこれまでにroot権限を取得していますか?