Чтобы отбросить все привилегии (пользователя и группы), вам нужно удалить группу перед пользователем.Учитывая, что userid
и groupid
содержат идентификаторы пользователя и группы, в которую вы хотите перетаскивать данные, и если предположить, что эффективные идентификаторы также являются корневыми, это достигается путем вызова setuid () и setgid () :
if (getuid() == 0) {
/* process is running as root, drop privileges */
if (setgid(groupid) != 0)
fatal("setgid: Unable to drop group privileges: %s", strerror(errno));
if (setuid(userid) != 0)
fatal("setuid: Unable to drop user privileges: %S", strerror(errno));
}
Если вы параноик, вы можете попытаться вернуть свои привилегии root, что должно дать сбой.Если это не сработает, вы спаситесь:
if (setuid(0) != -1)
fatal("ERROR: Managed to regain root privileges?");
Кроме того, если вы все еще параноик, вы можете захотеть seteuid () и setegid () тоже, но в этом нет необходимости, поскольку setuid () и setgid () уже устанавливают все идентификаторы, если процесс принадлежит пользователю root.
Список дополнительных групп является проблемой, поскольку POSIX нетфункция для установки дополнительных групп (есть getgroups () , но нет setgroups ()).Существует расширение BSD и Linux setgroups () , которое вы можете использовать, если это вас касается.
Вам также следует chdir("/")
или в любом другом каталоге,так что процесс не остается в корневом каталоге.
Поскольку ваш вопрос касается Unix в целом, это очень общий подход.Обратите внимание, что в Linux это больше не является предпочтительным подходом.В текущих версиях Linux вы должны установить возможность CAP_NET_BIND_SERVICE
на исполняемом файле и запускать его как обычный пользователь.Корневой доступ не требуется.