Что происходит, когда пользователь, не являющийся пользователем root, отправляет сигналы в процесс пользователя root?

Мне интересно о безопасности сигналов UNIX.

SIGKILL убьет этот процесс. Итак, что происходит, когда процесс пользователя без root посылает сигнал процессу пользователя root? Выполняет ли процесс обработчик сигнала?

Я следую принятому ответу (gollum's), и я печатаю man capabilites , и я нахожу много вещей о ядре Linux. Из man capabilities :

 NAME capabilities - overview of Linux capabilities DESCRIPTION For the purpose of performing permission checks, traditional UNIX implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged processes (whose effective UID is nonzero). Privileged processes bypass all kernel permission checks, while unprivileged processes are subject to full permission checking based on the process's credentials (usually: effective UID, effective GID, and supplementary group list). Starting with kernel 2.2, Linux divides the privileges traditionally associated with superuser into distinct units, known as capabilities , which can be independently enabled and disabled. Capabilities are a per-thread attribute. 

  • fork () и как сигналы передаются процессам
  • Фоновый процесс сценария по-прежнему сохраняется после закрытия терминала
  • Декодировать флаги для команды Kill
  • Отключите отображение информации о «завершенном xxx» в bash
  • Является ли nohup неопределенным?
  • выход ограничения на выход И избежать сигнала 13
  • Как поймать сигнал в командной строке?
  • Разница между закрытием терминала с помощью кнопки закрытия и Ctrl-D
  • 4 Solutions collect form web for “Что происходит, когда пользователь, не являющийся пользователем root, отправляет сигналы в процесс пользователя root?”

    В Linux это зависит от возможностей файла.

    Возьмите следующий простой источник mykill.c :

     #include <stdio.h> #include <sys/types.h> #include <signal.h> #include <stdlib.h> void exit_usage(const char *prog) { printf("usage: %s -<signal> <pid>\n", prog); exit(1); } int main(int argc, char **argv) { pid_t pid; int sig; if (argc != 3) exit_usage(argv[0]); sig = atoi(argv[1]); pid = atoi(argv[2]); if (sig >= 0 || pid < 2) exit_usage(argv[0]); if (kill(pid, -sig) == -1) { perror("failed"); return 1; } printf("successfully sent signal %d to process %d\n", -sig, pid); return 0; } 

    построить это:

     gcc -Wall mykill.c -o /tmp/mykill 

    Теперь, когда пользователь root запускает процесс сна в фоновом режиме:

     root@horny:/root# /bin/sleep 3600 & [1] 16098 

    Теперь, когда обычный пользователь пытается его убить:

     demouser@horny:/home/demouser$ ps aux | grep sleep root 16098 0.0 0.0 11652 696 pts/20 S 15:06 0:00 sleep 500 demouser@horny:/home/demouser$ /tmp/mykill -9 16098 failed: Operation not permitted 

    Теперь, когда пользователь root изменит кепки /tmp/mykill :

     root@horny:/root# setcap cap_kill+ep /tmp/mykill 

    И попробуйте снова как обычный пользователь:

     demouser@horny:/home/demouser$ /tmp/mykill -9 16098 successfully sent signal 9 to process 16098 

    Наконец, пожалуйста, удалите /tmp/mykill по понятным причинам;)

    Ничего:

     strace kill -HUP 1 [...] kill(1, SIGHUP) = -1 EPERM (Operation not permitted) [...] 

    kill(2) объясняет:

    Примечания к Linux

    В разных версиях ядра Linux применяет различные правила для разрешений, необходимых для непривилегированного процесса для отправки сигнала другому процессу. В ядрах 1.0-1.2.2 сигнал может быть отправлен, если эффективный идентификатор пользователя отправителя совпадает с идентификатором получателя, или реальный идентификатор пользователя отправителя совпадает с идентификатором получателя. Из ядра 1.2.3 до 1.3.77 сигнал может быть отправлен, если эффективный идентификатор пользователя отправителя соответствует либо реальному, либо эффективному идентификатору пользователя получателя. Существующие правила, которые соответствуют POSIX.1-2001, были приняты в ядре 1.3.78.

    сигнал будет нести, но владелец процесса принадлежит root. поэтому другой пользователь не имеет права прекратить процесс, чтобы вы получили проблему с ошибкой разрешения.

    процесс прекращения действия возможен только тогда, когда вы владеете собственностью (собственными правами) процесса.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.