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@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
이제 루트 사용자로서 /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는 권한이 없는 프로세스가 다른 프로세스에 신호를 보내는 데 필요한 권한과 관련하여 다양한 규칙을 구현합니다. 커널 1.0~1.2.2에서는 보낸 사람의 유효 사용자 ID가 받는 사람의 유효 사용자 ID와 일치하거나 보낸 사람의 실제 사용자 ID가 받는 사람의 실제 사용자 ID와 일치하는 경우 신호를 보낼 수 있습니다. 커널 1.2.3부터 1.3.77까지, 발신자의 유효 사용자 ID가 수신자의 실제 또는 유효 사용자 ID와 일치하면 신호가 전송될 수 있습니다. 현재 규칙은 커널 1.3.78에 채택된 POSIX.1-2001을 준수합니다.
답변4
신호가 전송되지만 프로세스 소유자는 루트에 속합니다. 따라서 다른 사용자에게는 프로세스를 종료할 수 있는 권한이 없으므로 권한 오류 문제가 발생합니다.
프로세스에 대한 소유권(적절한 권한)이 있는 경우에만 프로세스를 종료할 수 있습니다.