Рассмотрим следующий код, который является упрощением ncopa / su-exe c
#include <sys/types.h>
#include <assert.h>
#include <err.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
uid_t parse_uid(const char *arg)
{
assert(arg[0] != '\0');
char *end;
uid_t uid = strtol(arg, &end, 10);
assert(*end == '\0');
return uid;
}
int main(int argc, char* argv[])
{
if (argc < 3)
return 1;
uid_t uid = parse_uid(argv[1]);
if (setuid(uid) < 0)
err(1, "setuid(%i)", uid);
setenv("HOME", "/", 1);
char **cmdargv = &argv[2];
execvp(cmdargv[0], cmdargv);
err(1, "%s", cmdargv[0]);
return 1;
}
. Он может переключиться на любого несуществующего пользователя:
sudo ./a.out 65535 sleep 10m
и вы можете найти процесс sleep 10m
идентификатора пользователя 65535
в ps
или htop
.
Хотя ядро ни на что не жаловалось, но я в этом сомневаюсь является частью юридического кода, так как он переключен на пользователя и никогда не существует.