Como causar pânico no kernel com um único comando?

62

É possível causar pânico no kernel com uma única linha de comando?

Qual seria o comando mais simples para um usuário sudoing e qual seria para um usuário comum, se houver?

Os cenários que sugerem o download de algo como parte do comando não contam.

Desmond Hume
fonte
11
:(){ :|:& };:talvez?
26263 Carl
@carleeto Ok, você poderia explicar isso para o resto de nós?
Chad Harrison
14
@hydroparadise É chamado de "forkbomb". :()define uma função chamada :com o corpo de :|:&, significando "executar: e também executar: em segundo plano". ;finaliza a definição da função e :chama sua nova função, que gera inúmeras versões de si mesmo até você atingir os limites do processo ou o sistema parar. É um comando que congela efetivamente qualquer sistema sem estabelecer bons limites de processo. Não tente isto em casa.
Phoshi
1
@ Kevin Você quer dizer escrever um programa em C, compilá-lo e instalá-lo como um driver, tudo em uma única linha de comando? Um exemplo de trabalho seria ótimo.
Desmond Hume
1
Um forkbomb não causa necessariamente um pânico no kernel. OTOH, uma coisa que você pode fazer é escrever (como root) é, digamos, dd if=/dev/urandom of=/dev/mem(dependendo da sua versão do kernel, você pode não ter /dev/kmem). Mas eu não usaria o sistema depois disso. :)
rbrito

Respostas:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (mais informações aqui ):

echo c > /proc/sysrq-trigger
artyom
fonte
8
echo c > /proc/sysrq-triggercertamente faz um bom trabalho no congelamento de um sistema Linux. Mas, pessoalmente, uma boa tela preta da morte narrando um desenvolvimento dramático da pilha de chamadas pareceria um pânico mais "canônico" no kernel.
Desmond Hume
4
No Linux, você pode precisar fazer isso echo 1 > /proc/sys/kernel/sysrqantes de poder echo c > /proc/sysrq-trigger.
Christian
como no OpenBSD?
mykhal
Quando é preciso provar quão falho um pedaço inocente de hw é, isso pode vir a calhar ...
nemesisfixx
@mykhal Veja man.openbsd.org/ddb Isso descreverá como entrar no depurador do kernel no OpenBSD.
Kusalananda
24
mkdir /tmp/kpanic && cd /tmp/kpanic && printf '#include <linux/kernel.h>\n#include <linux/module.h>\nMODULE_LICENSE("GPL");static int8_t* message = "buffer overrun at 0x4ba4c73e73acce54";int init_module(void){panic(message);return 0;}' > kpanic.c && printf 'obj-m += kpanic.o\nall:\n\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules' > Makefile && make && insmod kpanic.ko

Compila um módulo que trava o kernel chamando a panicfunção, precisa de root, requer makee gcc

Substitua "buffer overrun at 0x4ba4c73e73acce54" no comando por algo interessante para mais drama.

IW16
fonte
4
Esse código fonte parece inofensivo o suficiente.
Mark Lakata
Isso causou uma falha no kernel, mas como você diz ao kernel para despejar memória e reiniciar? Raspbian só me pegou usando isso.
HeatfanJohn
Atualização: Parece que eu preciso fazer apt-get install kdump-toolsno Raspbian / Debian.
HeatfanJohn
8

O kernel deve continuar funcionando, não importa o quê. Portanto, qualquer maneira de causar pânico no kernel pela interação do usuário (que não seja vandalismo deliberado por raiz onipotente, como Bruce Ediger propõe jokinkly, e a maioria dos kernels atualmente são construídos para que a maioria dessas brincadeiras não funcione) é um erro extremamente sério, que seria corrigido rapidamente.

vonbrand
fonte
Bem, não há muito uso do kernel quando o sistema foi completamente congelado por um usuário não sudo que emitiu um comando à semelhança de :(){ :|:& };:.
Desmond Hume
4
@DesmondHume Uma boa configuração não falha devido a muitos processos. Olhe para o /etc/security/limits.confarquivo.
Vreality
4

Não sei por que isso não foi mencionado antes ...

sudo kill -9 1

Pânico com a mensagem "tentou matar o init".

NieDzejkob
fonte
Não fiz nada no meu sistema de teste ...
kgutwin 14/06
@kgutwin que kernel você estava usando no seu sistema de teste?
NieDzejkob 15/06
2

Tente o seguinte:

dd if=/dev/urandom of=/proc/sysrq-trigger 


Isso causou um pânico muito rápido no kernel para mim, mas não tenho certeza de quão seguro é o processo, porque o fiz na instalação ao vivo do Ubuntu. Mas o kernel enviou mensagens de erro de spam para mim quando o fiz no ambiente terminal puro.

Josua Robson
fonte
2
Por que é votado para baixo? Aborda a pergunta feita.
Josua Robson
1
O problema desse problema é que ele pode executar o comando para finalizar todos os processos do usuário antes de gravar 'c' no arquivo.
usuário
1

compile o código a seguir em um módulo e insmod ele, certifique-se de entrar em pânico:

static int crash_module_init(void)

{
     printf("crash module starting\n");
     int *p = 0;

     printk("%d\n", *p);

     return 0;
}

static void crash_module_exit(void)
{
    printf("crash module exiting\n");
}

module_init(crash_module_init);
module_exit(crash_module_exit);
Devendra Naga
fonte
2
Isso causará oopsum pânico, mas não um pânico.
SkyDan
1

O mais fácil é manter pressionada a tecla alt + print screen (sysrq) e pressionar c enquanto ainda as mantém. Faz o mesmo que echo c > /proc/sysrq-trigger Uma pequena explicação: a tecla sysrq é usada para enviar comandos de baixo nível ao próprio kernel, como último recurso para tentar salvar o sistema. Se você mantiver a tecla alt + print screen (sysrq) pressionada e pressionar outra tecla ao lado deles, fará o mesmo como se você repetisse a tecla nesse arquivo de acionador sysrq. Eles chamam de gatilho por uma razão; 3 O 'c' diz ao kernel para travar (causa pânico no kernel)

No entanto, você pode querer ver o conteúdo de 'proc / sys / kernel / sysrq'. Se for 178 ou qualquer outra coisa, você deve alterá-lo para 1. 0 está desativado, 1 está ativado e qualquer coisa maior que 1 é um bitmap para as coisas específicas que o kernel permite fazer com o sysrq.

Yakusho
fonte
1
Você também pode digitar lentamente "REISUB" Enquanto mantém pressionadas as teclas mágicas para reiniciar o computador, quando ele congelou completamente no Linux. R-mude o modo do teclado para Xlate || Envie o SigTerm para todo o processo || Enviar o SigKill para todos os processos (exceto o init, é claro) || S- sincronizar todas as unidades montadas || U-Remontar todos os dispositivos em somente leitura || B- reiniciará instantaneamente sem nenhum processo matar ou desmontar (o que tomamos cuidado antes). Você também pode usar O vez de B para desligar em vez de reiniciar; D ter um bom tempo batendo seu sistema
Yakusho