Bagaimana menyebabkan panik kernel dengan satu perintah?

62

Apakah mungkin menyebabkan panik kernel dengan satu baris perintah?

Apa yang akan menjadi perintah yang paling mudah untuk pengguna yang sudoing dan apa yang akan untuk pengguna biasa, jika ada?

Skenario yang menyarankan mengunduh sesuatu sebagai bagian dari perintah tidak masuk hitungan.

Desmond Hume
sumber
11
:(){ :|:& };:mungkin?
Carl
@carleeto Ok, bisakah Anda menjelaskannya kepada kami semua?
Chad Harrison
14
@hydroparadise Ini disebut "forkbomb". :()mendefinisikan fungsi yang disebut :dengan tubuh :|:&, yang berarti "menjalankan: dan juga menjalankan: di latar belakang". ;mengakhiri definisi fungsi, dan :memanggil fungsi baru Anda, yang tanpa henti memunculkan versi baru dari dirinya sendiri sampai Anda menekan batas proses atau sistem terhenti. Ini adalah perintah yang secara efektif membekukan sistem apa pun tanpa batas proses yang ditentukan. Jangan coba ini di rumah.
Phoshi
1
@Kevin Maksud Anda menulis program C, mengkompilasinya, dan menginstalnya sebagai driver, semuanya dalam satu baris perintah? Contoh yang baik akan sangat bagus.
Desmond Hume
1
Forkbomb tidak selalu menyebabkan kepanikan kernel. OTOH, satu hal yang dapat dilakukan adalah menulis (sebagai root) adalah, katakanlah, dd if=/dev/urandom of=/dev/mem(tergantung pada versi kernel Anda, Anda mungkin tidak memilikinya /dev/kmem). Tapi saya tidak akan menggunakan sistem setelah itu. :)
rbrito

Jawaban:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (info lebih lanjut di sini ):

echo c > /proc/sysrq-trigger
artyom
sumber
8
echo c > /proc/sysrq-triggertentu melakukan pekerjaan yang baik dalam membekukan sistem Linux. Tetapi secara pribadi, layar hitam kematian yang bagus menceritakan tentang perkembangan dramatis dari tumpukan panggilan akan terasa seperti panik kernel yang lebih "kanonik".
Desmond Hume
4
Di Linux, Anda mungkin harus melakukannya echo 1 > /proc/sys/kernel/sysrqsebelum bisa echo c > /proc/sysrq-trigger.
Christian
bagaimana dengan OpenBSD?
mykhal
Ketika seseorang perlu membuktikan betapa cacatnya hw itu, ini mungkin berguna ...
nemesisfixx
@mykhal Lihat man.openbsd.org/ddb Itu akan menjelaskan cara memasukkan debugger kernel pada 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

Mengkompilasi sebuah modul yang crash kernel dengan memanggil panicfungsi, membutuhkan root, membutuhkan makedan gcc

Ganti "buffer overrun di 0x4ba4c73e73acce54" pada perintah dengan sesuatu yang menarik untuk drama lebih lanjut.

IW16
sumber
4
Kode sumber ini terlihat tidak berbahaya.
Mark Lakata
Ini menyebabkan kernel macet, tetapi bagaimana Anda memberi tahu kernel untuk membuang memori dan memulai kembali? Raspbian baru saja menggantung saya menggunakan ini.
HeatfanJohn
Pembaruan: Sepertinya saya perlu lakukan apt-get install kdump-toolsdi Raspbian / Debian.
HeatfanJohn
8

Kernel dimaksudkan untuk tetap berjalan apa pun yang terjadi. Jadi cara apa pun untuk menyebabkan kepanikan kernel oleh interaksi pengguna (selain vandalisme yang disengaja oleh root yang sangat kuat, seperti yang diusulkan Bruce Ediger dengan jokinkly, dan sebagian besar kernel saat ini dibangun sehingga sebagian besar lelucon itu tidak bekerja di tempat pertama) bug yang sangat serius, itu akan diperbaiki dengan cepat.

vonbrand
sumber
Yah, tidak ada banyak penggunaan kernel ketika sistem telah benar-benar dibekukan oleh pengguna non-sudoing yang mengeluarkan perintah dalam rupa :(){ :|:& };:.
Desmond Hume
4
@DesmondHume Pengaturan yang baik tidak macet karena terlalu banyak proses. Lihat ke dalam /etc/security/limits.conffile.
Vreality
4

Saya tidak tahu mengapa ini tidak disebutkan sebelumnya ...

sudo kill -9 1

Panik dengan pesan "mencoba membunuh init".

NieDzejkob
sumber
Tidak melakukan apa pun pada sistem pengujian saya ...
kgutwin
@ kgutwin kernel apa yang Anda gunakan pada sistem pengujian Anda?
NieDzejkob
2

Coba ini:

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


Ini melakukan panik kernel yang sangat cepat untuk saya, tetapi saya tidak yakin seberapa aman prosesnya karena saya melakukannya pada instalasi Ubuntu live. Tetapi kernel melakukan pesan kesalahan spam pada saya ketika saya melakukannya di lingkungan terminal murni.

Josua Robson
sumber
2
Mengapa itu memilih? Ini menjawab pertanyaan yang diajukan.
Josua Robson
1
Masalah dengan ini adalah berpotensi menjalankan perintah untuk menghentikan semua proses pengguna sebelum menulis 'c' ke file.
pengguna
1

kompilasi kode berikut ke dalam modul dan masukkan, pastikan Anda harus panik:

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
sumber
2
Ini akan menyebabkan oops, tetapi tidak panik.
SkyDan
1

Cara termudah adalah dengan menekan alt + layar cetak (sysrq) dan tekan c sambil tetap menahannya. Ini melakukan hal yang sama dengan echo c > /proc/sysrq-trigger : Penjelasan kecil: kunci sysrq digunakan untuk mengirim perintah tingkat rendah ke kernel itu sendiri, sebagai pilihan terakhir untuk mencoba menyelamatkan sistem. Jika Anda menahan alt + layar cetak (sysrq) ke bawah dan tekan tombol lain di sebelahnya, ia melakukan hal yang sama seperti jika Anda menggema kunci dalam file pemicu sysrq itu. Mereka menyebutnya pemicu karena suatu alasan; 3 'C' memberitahu kernel untuk crash (menyebabkan panik kernel)

Namun, Anda mungkin ingin melihat konten 'proc / sys / kernel / sysrq'. Jika itu 178 atau apa pun, Anda harus mengubahnya ke 1. 0 semua dinonaktifkan, 1 semua diaktifkan, dan apa pun yang lebih besar dari 1 adalah bitmap untuk hal-hal spesifik yang memungkinkan kernel lakukan dengan sysrq.

Yakusho
sumber
1
Anda juga dapat mengetik "REISUB" secara perlahan sambil menahan tombol ajaib itu untuk memulai ulang komputer Anda ketika benar-benar membeku di bawah linux. R-ubah mode keyboard ke Xlate || E-kirim SigTerm ke semua proses || Saya- kirim SigKill ke semua proses (kecuali tentu saja init) || S- sinkronkan semua drive yang terpasang || U-Remount semua perangkat di read-only || B- restart secara instan tanpa proses pembunuhan atau unmount (yang kami urus dengan hati-hati) tentang sebelumnya). Anda juga dapat menggunakan O alih-alih B untuk mematikan dan tidak memulai kembali; D bersenang-senang menabrak sistem Anda
Yakusho