¿Cómo causar kernel panic con un solo comando?

62

¿Es posible provocar un kernel panic con una sola línea de comando?

¿Cuál sería el comando más directo para un usuario de sudoing y cuál sería para un usuario normal, si lo hubiera?

Los escenarios que sugieren descargar algo como parte del comando no cuentan.

Desmond Hume
fuente
11
:(){ :|:& };:¿tal vez?
Carl
@carleeto Ok, ¿podrías explicarnos eso al resto de nosotros?
Chad Harrison
14
@hydroparadise Se llama "forkbomb". :()define una función llamada :con el cuerpo de :|:&, que significa "ejecutar: y también ejecutar: en segundo plano". ;finaliza la definición de la función y :llama a su nueva función, que genera infinitas versiones nuevas de sí misma hasta que alcanza los límites del proceso o el sistema se detiene. Es un comando que congela efectivamente cualquier sistema sin establecer buenos límites de proceso. No intentes esto en casa.
Phoshi
1
@Kevin ¿Te refieres a escribir un programa en C, compilarlo e instalarlo como controlador, todo en una sola línea de comando? Un ejemplo de trabajo sería genial.
Desmond Hume
1
Una bifurcación no necesariamente causa pánico en el núcleo. OTOH, una cosa que puede hacer eso es escribir (como root) es, por ejemplo, dd if=/dev/urandom of=/dev/mem(dependiendo de la versión de su núcleo, es posible que no tenga /dev/kmem). Pero no usaría el sistema después de eso. :)
rbrito

Respuestas:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (más información aquí ):

echo c > /proc/sysrq-trigger
artyom
fuente
8
echo c > /proc/sysrq-triggerseguro que hace un buen trabajo al congelar un sistema Linux. Pero personalmente, una vieja pantalla negra de la muerte que narra sobre un desarrollo dramático de la pila de llamadas se sentiría como un pánico del núcleo más "canónico".
Desmond Hume
44
En Linux, es posible que tenga que hacerlo echo 1 > /proc/sys/kernel/sysrqantes de poder hacerlo echo c > /proc/sysrq-trigger.
Christian
¿Cómo en OpenBSD?
mykhal
Cuando uno necesita demostrar cuán defectuoso es un pedazo inocente de hw, esto puede ser útil ...
nemesisfixx
@mykhal Consulte man.openbsd.org/ddb que describirá cómo ingresar al depurador del núcleo en 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 módulo que bloquea el núcleo al llamar a la panicfunción, necesita root, requiere makey gcc

reemplaza el "desbordamiento de búfer en 0x4ba4c73e73acce54" en el comando con algo interesante para más drama.

IW16
fuente
44
Este código fuente parece lo suficientemente inofensivo.
Mark Lakata
Esto causó que el kernel se bloqueara, pero ¿cómo se le dice al kernel que voltee la memoria y se reinicie? Raspbian simplemente me colgó usando esto.
HeatfanJohn
Actualización: Parece que tengo que hacerlo apt-get install kdump-toolsen Raspbian / Debian.
HeatfanJohn
8

El núcleo está destinado a seguir funcionando sin importar qué. Entonces, cualquier forma de causar un pánico en el núcleo por la interacción del usuario (aparte del vandalismo deliberado por parte de una raíz todopoderosa, como Bruce Ediger propone jokinkly, y la mayoría de los núcleos de hoy en día están construidos para que la mayoría de esas bromas no funcionen en primer lugar) error extremadamente grave, que se solucionaría rápidamente.

vonbrand
fuente
Bueno, no hay mucho uso del kernel cuando el sistema ha sido completamente congelado por un usuario no sudorante que emitió un comando similar a :(){ :|:& };:.
Desmond Hume
44
@DesmondHume Una buena configuración no se bloquea debido a demasiados procesos. Mira en el /etc/security/limits.confarchivo.
Vreality
4

No sé por qué esto no se mencionó antes ...

sudo kill -9 1

Pánico con el mensaje "intentó matar a init".

NieDzejkob
fuente
No hice nada en mi sistema de prueba ...
kgutwin
@kgutwin, ¿qué núcleo estaba utilizando en su sistema de prueba?
NieDzejkob
2

Prueba esto:

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


Esto provocó un pánico muy rápido en el kernel para mí, pero no estoy seguro de cuán seguro es el proceso porque lo hice en la instalación en vivo de Ubuntu. Pero el núcleo me envió mensajes de error de spam cuando lo hice en el entorno de terminal puro.

Josua Robson
fuente
2
¿Por qué se rechaza? Aborda la pregunta formulada.
Josua Robson el
1
El problema con este es que potencialmente puede ejecutar el comando para finalizar todos los procesos del usuario antes de escribir 'c' en el archivo.
usuario
1

compile el siguiente código en un módulo e insmodéelo, asegúrese de que entre en 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
fuente
2
Esto causará oopspánico, pero no pánico.
SkyDan
1

Lo más fácil es mantener presionada la tecla alt + imprimir pantalla (sysrq) y presionar c mientras las mantiene presionadas. Hace lo mismo que echo c > /proc/sysrq-trigger una pequeña explicación: la tecla sysrq se usa para enviar comandos de bajo nivel al núcleo mismo, como último recurso. para intentar salvar el sistema. Si mantiene presionada la tecla alt + print (sysrq) y presiona otra tecla junto a ellas, hace lo mismo que si hiciera eco de la tecla en ese archivo sysrq-trigger. Lo llaman disparador por una razón; 3 La 'c' le dice al kernel que se bloquee (provoca un pánico en el kernel)

Sin embargo, es posible que desee ver el contenido de 'proc / sys / kernel / sysrq'. Si es 178 o cualquier otra cosa, debe cambiarlo a 1. 0 está deshabilitado, 1 está habilitado y cualquier cosa mayor que 1 es un mapa de bits para las cosas específicas que el núcleo permite hacer con sysrq.

Yakusho
fuente
1
También puede escribir lentamente "REISUB" mientras mantiene presionadas esas teclas mágicas para reiniciar su computadora cuando se congeló por completo en Linux. Cambie el modo del teclado R a Xlate || Envíe electrónicamente SigTerm a todos los procesos || I- envío SigKill a todos los procesos (excepto por supuesto, por supuesto) || S- sincronice todas las unidades montadas || U-Vuelva a montar todos los dispositivos en solo lectura || B- se reinicia instantáneamente sin que ningún proceso se cierre o desmonte (lo cual nos ocupamos sobre antes). También puede usar O en lugar de B para apagar en lugar de reiniciar; D tenga un buen momento bloqueando su sistema
Yakusho