Это нормально для процесса, чтобы переключиться на несуществующего пользователя? - PullRequest
0 голосов
/ 14 февраля 2020

Рассмотрим следующий код, который является упрощением 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.

Хотя ядро ​​ни на что не жаловалось, но я в этом сомневаюсь является частью юридического кода, так как он переключен на пользователя и никогда не существует.

...