No Linux, depende das capacidades do arquivo.
Pegue a seguinte fonte simples de 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;
}
construa:
gcc -Wall mykill.c -o /tmp/mykill
Agora, como usuário root, inicie um processo de suspensão em segundo plano:
root@horny:/root# /bin/sleep 3600 &
[1] 16098
Agora, como o usuário normal tenta matá-lo:
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
Agora, como usuário root, altere o /tmp/mykill
caps:
root@horny:/root# setcap cap_kill+ep /tmp/mykill
E tente novamente como usuário normal:
demouser@horny:/home/demouser$ /tmp/mykill -9 16098
successfully sent signal 9 to process 16098
Por fim, exclua /tmp/mykill
por motivos óbvios;)