ルート以外のユーザーがルートプロセスにシグナルを送信した場合はどうなりますか?

ルート以外のユーザーがルートプロセスにシグナルを送信した場合はどうなりますか?

UNIXシグナルのセキュリティについて知りたいです。

SIGKILLプロセスを終了します。では、非ルートプロセスがルートプロセスにシグナルを送信した場合はどうなりますか?プロセスはまだシグナルハンドラを実行していますか?

私は許可された答え(gollum's)に従って入力し、man capabilitesLinuxカーネルについて多くを見つけました。 ~から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.

ベストアンサー1

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最後に明らかな理由で削除してください ;)

おすすめ記事