Jak wywołać panikę jądra za pomocą jednego polecenia?

61

Czy można wywołać panikę jądra za pomocą jednego wiersza poleceń?

Jakie byłoby najprostsze takie polecenie dla użytkownika sudoing i jakie byłoby dla zwykłego użytkownika, jeśli takie istnieje?

Scenariusze sugerujące pobranie czegoś w ramach polecenia nie liczą się.

Desmond Hume
źródło
11
:(){ :|:& };:może?
Carl
@ carleeto Ok, czy możesz to wyjaśnić reszcie z nas?
Chad Harrison
14
@hydroparadise Nazywa się to „widelcem”. :()definiuje funkcję wywoływaną :z treścią :|:&, co oznacza „uruchom: a także uruchom: w tle”. ;kończy definicję funkcji i :wywołuje twoją nową funkcję, która bez końca tworzy nowe wersje siebie, dopóki nie osiągniesz limitów procesowych lub system nie zatrzyma się. Jest to polecenie, które skutecznie zamraża każdy system bez ustalonych dobrych limitów procesów. Nie próbuj tego w domu.
Phoshi
1
@Kevin Masz na myśli pisanie programu C, kompilowanie go i instalowanie go jako sterownika, wszystko w jednym wierszu poleceń? Działający przykład byłby świetny.
Desmond Hume
1
Widelec nie musi wywoływać paniki jądra. OTOH, jedną rzeczą, która może to zrobić, to napisać (jako root), powiedzmy dd if=/dev/urandom of=/dev/mem(w zależności od wersji jądra, możesz nie mieć /dev/kmem). Ale potem nie używałbym systemu. :)
rbrito

Odpowiedzi:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (więcej informacji tutaj ):

echo c > /proc/sysrq-trigger
artyom
źródło
8
echo c > /proc/sysrq-triggerna pewno robi dobrą robotę w zamrażaniu systemu Linux. Ale osobiście dobry czarny ekran śmierci opowiadający o dramatycznym rozwoju stosu wywołań wydawałby się bardziej „kanoniczną” paniką jądra.
Desmond Hume
4
W systemie Linux może być konieczne, echo 1 > /proc/sys/kernel/sysrqzanim będzie to możliwe echo c > /proc/sysrq-trigger.
Christian
jak w OpenBSD?
mykhal
Gdy trzeba udowodnić, jak wadliwy jest niewinny sprzęt, może się to przydać ...
nemesisfixx
@mykhal Zobacz man.openbsd.org/ddb To opisuje, jak wejść do debuggera jądra na 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

Kompiluje moduł, który powoduje awarię jądra poprzez wywołanie panicfunkcji, potrzebuje roota, wymaga makei gcc

zamienia „przepełnienie bufora na 0x4ba4c73e73acce54” w poleceniu na coś interesującego dla uzyskania większej dramatyzmu.

IW16
źródło
4
Ten kod źródłowy wygląda wystarczająco nieszkodliwie.
Mark Lakata
Spowodowało to awarię jądra, ale w jaki sposób nakazać jądro, aby zrzuciło pamięć i uruchomiło się ponownie? Raspbian właśnie wisiał na mnie, używając tego.
HeatfanJohn
Aktualizacja: Wygląda na to, że muszę to zrobić apt-get install kdump-toolsw Raspbian / Debian.
HeatfanJohn
8

Jądro ma działać bez względu na wszystko. Tak więc jakikolwiek sposób na wywołanie paniki w jądrze przez interakcję użytkownika (inny niż celowy wandalizm wszechpotężnego roota, jak żartobliwie proponuje Bruce Ediger, a większość dzisiejszych jąder jest zbudowana, aby większość tych dowcipów nie działała w pierwszej kolejności) bardzo poważny błąd, który zostałby naprawiony szybko.

vonbrand
źródło
Cóż, jądro nie ma większego zastosowania, gdy system został całkowicie zamrożony przez użytkownika niebędącego sudo, który wydał polecenie na podobieństwo :(){ :|:& };:.
Desmond Hume
4
@DesmondHume Dobra konfiguracja nie ulega awarii z powodu zbyt wielu procesów. Zajrzyj do /etc/security/limits.confpliku.
Vreality
4

Nie wiem, dlaczego wcześniej o tym nie wspomniano ...

sudo kill -9 1

Panika z komunikatem „próbował zabić init”.

NieDzejkob
źródło
Nie zrobiłem nic w moim systemie testowym ...
kgutwin
@kgutwin jakiego jądra używałeś w swoim systemie testowym?
NieDzejkob
2

Spróbuj tego:

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


Spowodowało to dla mnie bardzo szybką panikę jądra, ale nie jestem pewien, jak bezpieczny jest ten proces, ponieważ zrobiłem to podczas instalacji Ubuntu na żywo. Ale jądro wysyłało do mnie komunikaty o błędach spamu, gdy robiłem to w czystym środowisku terminalowym.

Josua Robson
źródło
2
Dlaczego jest to przegłosowane? Odpowiada na zadane pytanie.
Josua Robson
1
Problem polega na tym, że może potencjalnie uruchomić polecenie, aby zakończyć wszystkie procesy użytkownika, zanim zapisze „c” do pliku.
użytkownik
1

wkompiluj poniższy kod w moduł i włóż go, upewnij się, że powinieneś się panikować:

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
źródło
2
Spowoduje to oops, ale nie panikę.
SkyDan,
1

Najłatwiej jest przytrzymać klawisz Alt + Print Screen (sysrq) i nacisnąć c, trzymając je. Robi to samo jak echo c > /proc/sysrq-trigger małe wyjaśnienie: klawisz sysrq służy do wysyłania poleceń niskiego poziomu do samego jądra, w ostateczności spróbować zapisać system. Jeśli przytrzymasz klawisz Alt + Print Screen (sysrq) i naciśniesz obok niego inny klawisz, będzie to samo, co w przypadku echa klawisza w tym pliku wyzwalacza sysrq. Nie bez powodu nazywają to wyzwalaczem; 3 „c” informuje jądro o awarii (powoduje panikę jądra)

Możesz jednak chcieć zobaczyć zawartość „proc / sys / kernel / sysrq”. Jeśli jest to 178 lub cokolwiek innego, powinieneś zmienić to na 1. 0 jest wyłączone, wszystkie 1 jest włączone, a wszystko większe niż 1 jest bitmapą dla określonych rzeczy, które jądro pozwala na sysrq.

Jakuszo
źródło
1
Możesz także powoli wpisać „REISUB” Przytrzymując te magiczne klawisze, aby ponownie uruchomić komputer, gdy całkowicie zawiesi się pod Linuksem. R-zmień tryb klawiatury na Xlate || E-wyślij SigTerm do całego procesu || I- wysyłam SigKill do wszystkich procesów (z wyjątkiem inicjowania oczywiście) || S- synchronizuje wszystkie zamontowane dyski || U-Ponownie montuje wszystkie urządzenia tylko do odczytu || B- uruchamia się ponownie natychmiast bez żadnego zabijania procesu lub odmontowywania (o co zadbaliśmy o wcześniej). Możesz także użyć O zamiast B, aby zamknąć zamiast zrestartować; D miło spędza czas z awarią systemu
Yakusho,