Kök olmayan bir kullanıcı kök kullanıcının işlemine sinyal gönderdiğinde ne olur?


33

UNIX sinyallerinin güvenliğini merak ediyorum.

SIGKILLSüreci öldürecek. Peki, kök olmayan bir kullanıcının süreci kök kullanıcının işlemine bir sinyal gönderdiğinde ne olur? İşlem hala sinyal işleyicisini gerçekleştiriyor mu?

Kabul edilen cevabı (gollum'un) takip ediyorum man capabilitesve yazıyorum ve Linux çekirdeği hakkında birçok şey buluyorum. Kimden 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.

5
Bunun dışında SIGKILLözel bir durumudur ve çekirdek tarafından tamamen hangi yönetilen, sinyaller sadece bir istek vardır. Alma işlemi onlarla istedikleri her şeyi yapabilir.
chepner,

3
@chepner dışında SIGKILL ve SIGSTOP ...
jlliagre

1
@chepner Alma işlemi, sinyali ele almak istediğine aktif olarak karar vermelidir. Eğer alıcı işlem yapmadıysa, birçok sinyal varsayılan olarak işlemi tamamen aynı şekilde öldürür SIGKILL. Başlangıçta SIGINT, SIGKILLve SIGTERMaynı etkiye sahip olacak, tek fark alma işlemi bazıları için bu varsayılan ayarı değiştirebilirsiniz olmasıdır.
kasperd,

Yanıtlar:


34

Linux'ta dosya özelliklerine bağlıdır.

Aşağıdaki basit mykill.ckaynağı alın :

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

inşa et:

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

Şimdi kullanıcı kökü olarak arka planda bir uyku süreci başlar:

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

Şimdi normal kullanıcı olarak onu öldürmeye çalışın:

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

Şimdi root kullanıcısı /tmp/mykillkapakları değiştirdiğinde :

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

Ve normal kullanıcı olarak tekrar deneyin:

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

Sonunda /tmp/mykillbariz nedenlerden dolayı siliniz ;)


3
Senin ipucunu takip et, ben "erkek yetenekleri"
yazarım ve

24

Hiçbir şey değil:

strace kill -HUP 1
[...]
kill(1, SIGHUP)    = -1 EPERM (Operation not permitted)
[...]

1
Bu tür bir güvenlik os seviyesi tarafından mı yoksa kullanıcının sinyal işleyicisinde kodlanmış mı?
Ocak'ta

3
@lovespring Çekirdek, sinyali hedef işleme iletmiyor. Sistem bir hatayla döndürülür ve bunun dışında göz ardı edilir.
Hauke,

Bu genel olarak doğru değil. Bu yeteneklere bağlıdır.
gollum

1
@psmears evet, ancak başkalarının da benzer kavramları var (örneğin solaris'te "imtiyazlar"). Yani cevap "Hiçbir şey" kesinlikle yanlıştır.
gollum

1
@gollum: Tamamen yanlış değil (sonuçta, tüm Unix ailesi işletim sistemlerinde varsayılan davranış ve çoğu için mümkün olan tek şey - örneğin daha eski Linux çekirdeği dahil) ama bunun eksik olduğu konusunda haklısınız. onlar suported yerler hakkında daha fazla detaya girmeden "yetenekleri" :) genel Unix ilgili bir soruyu eksik de
psmears

5

kill(2) adam sayfa açıklar:

Linux Notları

Farklı çekirdek sürümleri arasında, Linux ayrıcalıklı olmayan bir işlemin başka bir işleme sinyal göndermesi için gereken izinler için farklı kurallar uygulamıştır. 1.0 ila 1.2.2 arasındaki çekirdeklerde, gönderenin etkin kullanıcı kimliği alıcının kimliğiyle eşleşirse veya gönderenin gerçek kullanıcı kimliği alıcının kimliğiyle eşleşirse bir sinyal gönderilebilir. Çekirdek 1.2.3'ten 1.3.77'ye kadar, gönderenin etkin kullanıcı kimliği alıcının gerçek veya etkili kullanıcı kimliğiyle eşleşirse bir sinyal gönderilebilir. POSIX.1-2001'e uygun mevcut kurallar çekirdek 1.3.78'de kabul edilmiştir.


1.3.78 1.3 gibi son derece eski bir tarihtir. 1995 veya bu yıllardan kalma. 1.3, 2.0'a (1996'da) kadar giden geliştirme serisiydi
vonbrand

-1

sinyal taşıyacak ancak işlem sahibi kökünden kaynaklanıyor. bu nedenle, diğer kullanıcı işlemi sonlandırma hakkına sahip olmadığı için izin hatası sorunu alırsınız.

Süreci sona erdirmek yalnızca, işlemin mülkiyetine (uygun haklara) sahip olduğunuzda mümkündür.


Hayır, sys_kill -1'i geri verir ve errno -EPERM olur.
peterh,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.