
UNIXシグナルのセキュリティについて知りたいです。
SIGKILL
プロセスを終了します。では、非ルートプロセスがルートプロセスにシグナルを送信した場合はどうなりますか?プロセスはまだシグナルハンドラを実行していますか?
私は許可された答え(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.
答え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
最後に明らかな理由で削除してください ;)
答え2
何もありません:
strace kill -HUP 1
[...]
kill(1, SIGHUP) = -1 EPERM (Operation not permitted)
[...]
答え3
kill(2)
マニュアルページでは、以下について説明します。
Linuxノート
さまざまなカーネルバージョンでは、Linuxは、権限のないプロセスが他のプロセスにシグナルを送信するために必要な権限に関してさまざまなルールを実装しています。カーネル 1.0 ~ 1.2.2 では、送信者の実効ユーザー ID が受信者の実効ユーザー ID と一致するか、送信者の実ユーザー ID が受信者の実ユーザー ID と一致する場合にシグナルを送信できます。カーネル1.2.3から1.3.77まで、発信者の有効なユーザーIDが受信者の実際のまたは有効なユーザーIDと一致すると、信号が送信される可能性があります。現在の規則は、カーネル1.3.78で採用されているPOSIX.1-2001に準拠しています。
答え4
シグナルは送信されますが、プロセス所有者はルートに属します。したがって、他のユーザーにはプロセスを終了する権限がないため、権限エラーの問題が発生します。
プロセスの所有権(適切な権限)がある場合にのみ、プロセスを終了できます。