Come provocare il panico nel kernel con un singolo comando?


62

È possibile causare un panico nel kernel con una singola riga di comando?

Quale sarebbe il comando più semplice per un utente che sudoing e quale sarebbe per un utente normale, se presente?

Gli scenari che suggeriscono di scaricare qualcosa come parte del comando non contano.


11
:(){ :|:& };:può essere?
Carl,

@carleeto Ok, potresti spiegarlo a tutti noi?
Chad Harrison,

14
@hydroparadise Si chiama "forkbomb". :()definisce una funzione chiamata :con il corpo di :|:&, che significa "run: and run: in background". ;termina la definizione della funzione e :chiama la tua nuova funzione, che genera continuamente nuove versioni di se stessa fino a quando non raggiungi i limiti del processo o il sistema si ferma. È un comando che congela efficacemente qualsiasi sistema senza che siano impostati buoni limiti di processo. Non provarlo a casa.
Phoshi,

1
@Kevin Intendi scrivere un programma C, compilarlo e installarlo come driver, tutto in un'unica riga di comando? Un esempio funzionante sarebbe fantastico.
Desmond Hume,

1
Un forkbomb non causa necessariamente un panico nel kernel. OTOH, una cosa che può fare è scrivere (come root) è, per esempio, dd if=/dev/urandom of=/dev/mem(a seconda della versione del kernel, potresti non avere /dev/kmem). Ma dopo non userei il sistema. :)
rbrito,

Risposte:


80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (maggiori informazioni qui ):

echo c > /proc/sysrq-trigger

8
echo c > /proc/sysrq-triggerfa sicuramente un buon lavoro nel congelare un sistema Linux. Ma personalmente, un buon vecchio schermo nero della morte che narra di uno sviluppo drammatico della pila di chiamate sembrerebbe un panico del kernel più "canonico".
Desmond Hume,

4
Su Linux, potresti doverlo fare echo 1 > /proc/sys/kernel/sysrqprima di poterlo fare echo c > /proc/sysrq-trigger.
Christian,

come in OpenBSD?
mykhal,

Quando uno ha bisogno di dimostrare quanto sia difettoso un pezzo innocente di hw, questo potrebbe tornare utile ...
nemesisfixx

@mykhal Vedi man.openbsd.org/ddb Questo descriverà come inserire il debugger del kernel su 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 un modulo che arresta in modo anomalo il kernel chiamando la panicfunzione, necessita di root, richiede makee gcc

sostituisce il "buffer overrun at 0x4ba4c73e73acce54" nel comando con qualcosa di interessante per più dramma.


4
Questo codice sorgente sembra abbastanza innocuo.
Mark Lakata,

Ciò ha causato l'arresto anomalo del kernel, ma come si fa a dire al kernel di scaricare la memoria e riavviare? Raspbian mi ha appena appeso usando questo.
HeatfanJohn

Aggiornamento: sembra che devo fare apt-get install kdump-toolssu Raspbian / Debian.
HeatfanJohn

8

Il kernel dovrebbe continuare a funzionare, qualunque cosa accada. Quindi, qualsiasi modo di provocare il panico nel kernel attraverso l'interazione dell'utente (a parte il vandalismo deliberato da parte di una radice onnipotente, come propone scherzosamente Bruce Ediger, e la maggior parte dei kernel oggi è costruita in modo che la maggior parte di questi scherzi non funzionino in primo luogo) è un bug estremamente grave, che si sarebbe risolto rapidamente.


Bene, non c'è molto uso del kernel quando il sistema è stato completamente bloccato da un utente non-sudoing che ha emesso un comando a somiglianza di :(){ :|:& };:.
Desmond Hume,

4
@DesmondHume Una buona installazione non si arresta in modo anomalo a causa di troppi processi. Cerca nel /etc/security/limits.conffile.
Vreality

4

Non so perché questo non sia stato menzionato prima ...

sudo kill -9 1

Panico con il messaggio "provato a uccidere init".


Non ha fatto nulla sul mio sistema di test ...
kgutwin il

@kgutwin quale kernel stavi usando sul tuo sistema di test?
NieDzejkob,

2

Prova questo:

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


Questo ha provocato un panico nel kernel molto veloce per me, ma non sono sicuro di quanto sia sicuro il processo perché l'ho fatto durante l'installazione di Ubuntu live. Ma il kernel mi ha inviato messaggi di errore spam quando l'ho fatto nel puro ambiente terminale.


2
Perché è votato? Affronta la domanda posta.
Josua Robson,

1
Il problema con questo è che può potenzialmente eseguire il comando per terminare tutti i processi utente prima che scriva 'c' nel file.
utente

1

compila il seguente codice in un modulo e inseriscilo, assicurati di prendere il panico:

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);

2
Ciò causerà un oops, ma non un panico.
SkyDan,

1

La cosa più semplice è tenere premuto alt + print screen (sysrq) e premere c tenendoli ancora premuti Fa lo stesso di echo c > /proc/sysrq-trigger Una piccola spiegazione: il tasto sysrq è usato per inviare comandi di basso livello al kernel stesso, come ultima risorsa per provare a salvare il sistema. Se tenete premuto alt + print screen (sysrq) e premete un altro tasto accanto a loro, fa lo stesso come se doveste far eco al tasto in quel file trigger sysrq. Lo chiamano trigger per un motivo; 3 La 'c' dice al kernel di bloccarsi (causando il panico del kernel)

Tuttavia, potresti voler vedere il contenuto di 'proc / sys / kernel / sysrq'. Se è 178 o qualsiasi altra cosa, dovresti cambiarlo in 1. 0 è tutto disabilitato, 1 è tutto abilitato e qualcosa di più grande di 1 è una bitmap per le cose specifiche che il kernel consente di fare con sysrq.


1
Puoi anche digitare lentamente "REISUB" Tenendo premuti quei tasti magici per riavviare il computer quando si blocca completamente sotto Linux. R-cambia la modalità tastiera in Xlate || E-invia SigTerm a tutto il processo || I- invio SigKill a tutti i processi (tranne ovviamente per l'inizio) || S-sincronizza tutte le unità montate || U-Rimonta tutti i dispositivi in ​​sola lettura || B- si riavvia all'istante senza alcun processo di uccisione o smontaggio (di cui ci siamo occupati circa prima). Puoi anche usare O invece di B per spegnere invece di riavviare; D si
Yakusho
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.