Wie kann man mit einem einzigen Befehl eine Kernel-Panik auslösen?

62

Ist es möglich, mit einer einzigen Befehlszeile eine Kernel-Panik auszulösen?

Was wäre der einfachste Befehl für einen Sudo-Benutzer und was für einen normalen Benutzer, falls vorhanden?

Szenarien, in denen vorgeschlagen wird, etwas als Teil des Befehls herunterzuladen, zählen nicht.

Desmond Hume
quelle
11
:(){ :|:& };:vielleicht?
Carl
@carleeto Ok, kannst du uns den Rest erklären?
Chad Harrison
14
@hydroparadise Es heißt eine "Gabelbombe". :()definiert eine Funktion, die :mit dem Body von aufgerufen wird :|:&und "run: und auch run: im Hintergrund" bedeutet. ;Beendet die Funktionsdefinition und :ruft Ihre neue Funktion auf, die endlos neue Versionen von sich selbst erzeugt, bis Sie entweder die Prozessgrenzen erreichen oder das System zum Stillstand kommt. Es ist ein Befehl, der jedes System effektiv einfriert, ohne dass gute Prozessgrenzen festgelegt wurden. Versuchen Sie das nicht zu Hause.
Phoshi
1
@ Kevin Sie wollen ein C-Programm schreiben, kompilieren und als Treiber installieren, alles in einer einzigen Befehlszeile? Ein funktionierendes Beispiel wäre großartig.
Desmond Hume
1
Eine Gabelbombe verursacht nicht unbedingt eine Kernel-Panik. OTOH, eine Sache, die dazu führen kann , ist (als root) zu schreiben ( dd if=/dev/urandom of=/dev/memabhängig von Ihrer Kernel-Version, die Sie möglicherweise nicht haben /dev/kmem). Aber ich würde das System danach nicht mehr benutzen. :)
rbrito

Antworten:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (mehr Infos hier ):

echo c > /proc/sysrq-trigger
artyom
quelle
8
echo c > /proc/sysrq-triggerSicher macht einen guten Job beim Einfrieren eines Linux-Systems. Aber persönlich würde sich ein alter schwarzer Bildschirm des Todes, der über eine dramatische Entwicklung des Call-Stacks berichtet, wie eine eher "kanonische" Kernel-Panik anfühlen.
Desmond Hume
4
Unter Linux müssen Sie dies möglicherweise tun, echo 1 > /proc/sys/kernel/sysrqbevor Sie dazu in der Lage sind echo c > /proc/sysrq-trigger.
Christian
wie in OpenBSD?
Mykhal
Wenn man beweisen muss , wie fehlerhaft ein unschuldiges Stück hw ist, kann dies nützlich sein ...
nemesisfixx
@mykhal Siehe man.openbsd.org/ddb Hier wird beschrieben, wie man den Kernel-Debugger unter OpenBSD startet.
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

Kompiliert ein Modul, das den Kernel zum Absturz bringt, indem es die panicFunktion aufruft , root benötigt, erfordert makeund gcc

den "Pufferüberlauf bei 0x4ba4c73e73acce54" im Befehl durch etwas Interessantes für mehr Drama ersetzt.

IW16
quelle
4
Dieser Quellcode sieht harmlos aus.
Mark Lakata
Dies führte zum Absturz des Kernels. Wie können Sie dem Kernel jedoch mitteilen, dass er den Speicher sichern und neu starten soll? Raspbian hat mich nur damit gehängt.
HeatfanJohn
Update: Sieht so aus, als müsste ich es apt-get install kdump-toolsunter Raspbian / Debian machen.
HeatfanJohn
8

Der Kernel soll weiterlaufen, egal was passiert. Daher ist jede Möglichkeit, durch Benutzerinteraktion eine Kernel-Panik auszulösen (abgesehen von absichtlichem Vandalismus durch den allmächtigen Root, wie Bruce Ediger jokinkly vorschlägt, und die meisten Kernel heutzutage so gebaut, dass die meisten dieser Streiche gar nicht erst funktionieren), eine extrem schwerwiegender Fehler, der schnell behoben werden würde.

vonbrand
quelle
Nun, es gibt keine große Verwendung des Kernels, wenn das System von einem nicht-sudoenden Benutzer, der einen Befehl in der Art von ausgegeben hat, vollständig eingefroren wurde :(){ :|:& };:.
Desmond Hume
4
@DesmondHume Ein gutes Setup stürzt aufgrund zu vieler Prozesse nicht ab. Schauen Sie in die /etc/security/limits.confDatei.
Realität
4

Ich weiß nicht, warum das vorher nicht erwähnt wurde ...

sudo kill -9 1

Panik mit der Meldung "versucht, Init zu töten".

NieDzejkob
quelle
Habe nichts auf meinem Testsystem gemacht ...
kgutwin
@kgutwin welchen Kernel hast du auf deinem Testsystem benutzt?
NieDzejkob
2

Versuche dies:

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


Dies verursachte eine sehr schnelle Kernel-Panik für mich, aber ich bin mir nicht sicher, wie sicher der Prozess ist, da ich es bei der Live-Ubuntu-Installation getan habe. Aber der Kernel hat mir Spam-Fehlermeldungen geschickt, als ich das in der reinen Terminal-Umgebung getan habe.

Josua Robson
quelle
2
Warum ist es abgelehnt? Es befasst sich mit der gestellten Frage.
Josua Robson
1
Das Problem bei diesem ist, dass es möglicherweise den Befehl zum Beenden aller Benutzerprozesse ausführen kann, bevor 'c' in die Datei geschrieben wird.
Benutzer
1

Kompilieren Sie den folgenden Code in ein Modul und modifizieren Sie ihn, damit Sie in Panik geraten:

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
quelle
2
Dies wird eine oops, aber keine Panik auslösen .
SkyDan
1

Am einfachsten ist es, alt + print screen (sysrq) gedrückt zu halten und c zu drücken, während Sie diese echo c > /proc/sysrq-trigger gedrückt halten. Dies ist das Gleiche wie um zu versuchen, das System zu retten. Wenn Sie die Tastenkombination Alt + Bildschirm drucken (sysrq) gedrückt halten und eine andere Taste daneben drücken, geschieht dies genauso, als würden Sie die Taste in dieser sysrq-Trigger-Datei wiederholen. Sie nennen es Trigger aus einem bestimmten Grund: 3 Das 'c' weist den Kernel an, abzustürzen (verursacht eine Kernel-Panik).

Möglicherweise möchten Sie jedoch den Inhalt von 'proc / sys / kernel / sysrq' sehen. Wenn es 178 oder etwas anderes ist, sollten Sie es auf 1 ändern. 0 ist alles deaktiviert, 1 ist alles aktiviert und alles, was größer als 1 ist, ist eine Bitmap für die spezifischen Dinge, die der Kernel mit sysrq machen kann.

Yakusho
quelle
1
Sie können auch langsam "REISUB" eingeben, während Sie diese magischen Tasten gedrückt halten, um den Computer neu zu starten, wenn er unter Linux vollständig eingefroren ist. R-change keyboard mode to Xlate || Sende SigTerm per E-Mail an alle Prozesse || I- Sende SigKill an alle Prozesse (außer natürlich init) || S-Synchronisiere alle gemounteten Laufwerke || U-Mounte alle Geräte in schreibgeschütztem Zustand neu || B-Startet sofort, ohne dass ein Prozess beendet oder gemountet wird (was wir getan haben) etwa vor). Sie können auch O anstelle von B verwenden, um das System herunterzufahren, anstatt es neu zu starten; D haben Sie eine schöne Zeit damit, Ihr System zum Absturz zu bringen
Yakusho