Apa yang terjadi ketika pengguna non-root mengirimkan sinyal ke proses pengguna root?

33

Saya bertanya-tanya tentang keamanan sinyal UNIX.

SIGKILLakan membunuh prosesnya. Jadi, apa yang terjadi ketika proses pengguna non root mengirim sinyal ke proses pengguna root? Apakah prosesnya masih menjalankan pengendali sinyal?

Saya mengikuti jawaban yang diterima (gollum), dan saya mengetik man capabilites, dan saya menemukan banyak hal tentang kernel Linux. Dari 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.
lovespring
sumber
5
Selain SIGKILL, yang merupakan kasus khusus dan dikelola sepenuhnya oleh kernel, sinyal hanyalah permintaan. Proses penerimaan dapat melakukan apa saja yang mereka inginkan.
chepner
3
@ chepner Selain SIGKILL dan SIGSTOP ...
jlliagre
1
@ chepner Proses penerimaan harus secara aktif memutuskan ingin menangani sinyal. Jika proses penerimaan belum melakukannya, maka banyak sinyal secara default akan membunuh proses dengan cara yang persis sama SIGKILL. Awalnya SIGINT,, SIGKILLdan SIGTERMakan memiliki efek yang sama persis, satu-satunya perbedaan adalah bahwa proses penerimaan dapat mengubah default ini untuk beberapa di antaranya.
kasperd

Jawaban:

34

Di Linux itu tergantung pada kemampuan file.

Ambil mykill.csumber sederhana berikut :

#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;
}

bangun itu:

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

Sekarang saat root pengguna memulai proses tidur di latar belakang:

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

Sekarang ketika pengguna normal mencoba membunuhnya:

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

Sekarang saat pengguna root mengubah /tmp/mykillbatas:

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

Dan coba lagi sebagai pengguna normal:

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

Akhirnya tolong hapus /tmp/mykilluntuk alasan yang jelas;)

Gollum
sumber
3
Ikuti petunjuk Anda, saya ketik "kapabilitas manusia" dan saya menemukan banyak hal tentang kernel linux
lovespring
24

Tidak ada:

strace kill -HUP 1
[...]
kill(1, SIGHUP)    = -1 EPERM (Operation not permitted)
[...]
Hauke ​​Laging
sumber
1
Apakah keamanan semacam ini dilakukan oleh os level atau hard coded di pengatur sinyal pengguna?
lovespring
3
@lovespring Kernel tidak mengirimkan sinyal ke proses target. Syscall dikembalikan dengan kesalahan dan terlepas dari itu diabaikan.
Hauke ​​Laging
Itu tidak benar secara umum. Tergantung kemampuannya.
Gollum
1
@psmears ya, tetapi yang lain memiliki konsep serupa (misalnya "hak istimewa" pada solaris). Jadi jawaban "Tidak Ada" jelas salah.
Gollum
1
@ Gollum: Ini tidak sepenuhnya salah (setelah semua, itu adalah perilaku default pada semua OS Unix-family, dan satu-satunya yang mungkin pada banyak - termasuk kernel Linux yang lebih tua misalnya) tetapi Anda benar bahwa itu tidak lengkap - tetapi hanya menyebutkan "kapabilitas" tanpa menjelaskan lebih lanjut tentang di mana mereka didukung juga tidak lengkap dalam pertanyaan tentang Unix umum :)
psmears
5

kill(2) halaman manual menjelaskan:

Catatan Linux

Di berbagai versi kernel, Linux telah memberlakukan aturan yang berbeda untuk izin yang diperlukan untuk proses yang tidak berkepentingan untuk mengirim sinyal ke proses lain. Dalam kernel 1.0 hingga 1.2.2, sinyal dapat dikirim jika ID pengguna yang efektif dari pengirim cocok dengan ID penerima, atau ID pengguna sebenarnya dari pengirim cocok dengan ID penerima. Dari kernel 1.2.3 hingga 1.3.77, sebuah sinyal dapat dikirim jika ID pengguna yang efektif dari pengirim cocok dengan ID pengguna yang nyata atau efektif dari penerima. Aturan saat ini, yang sesuai dengan POSIX.1-2001, diadopsi di kernel 1.3.78.

jai_s
sumber
1.3.78 adalah sejarah yang sangat kuno, seperti 1.3. tanggal dari tahun 1995 atau sekitar itu. 1.3 adalah seri pengembangan yang mengarah ke 2.0 (pada tahun 1996)
vonbrand
-1

sinyal akan dibawa tetapi pemilik proses milik root. jadi, pengguna lain tidak memiliki hak untuk menghentikan proses sehingga Anda akan menerima masalah kesalahan izin.

proses terminasi hanya dimungkinkan ketika Anda memiliki kepemilikan (hak yang tepat) dari proses tersebut.

Naveen Dharman
sumber
Tidak, sys_kill mengembalikan -1 dan errno akan -EPERM.
peterh mengatakan mengembalikan Monica