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