จะทำให้ kernel ตกใจด้วยคำสั่งเดียวได้อย่างไร


61

เป็นไปได้หรือไม่ที่จะทำให้เคอร์เนลตกใจด้วยคำสั่งบรรทัดเดียว?

อะไรจะเป็นคำสั่งที่ตรงไปตรงมาที่สุดสำหรับผู้ใช้ sudoing และสิ่งที่จะเป็นสำหรับผู้ใช้ปกติถ้ามี?

สถานการณ์ที่แนะนำให้ดาวน์โหลดบางสิ่งบางอย่างเป็นส่วนหนึ่งของคำสั่งจะไม่ถูกนับ


11
:(){ :|:& };:อาจจะ?
คาร์ล

@carleeto ตกลงคุณช่วยอธิบายให้พวกเราที่เหลือฟังหน่อยได้ไหม?
ชาดแฮร์ริสัน

14
@hydroparadise มันเรียกว่า "forkbomb" :()กำหนดฟังก์ชั่นที่เรียก:ด้วยเนื้อความของ:|:&หมายถึง "run: and run: in background" ;สิ้นสุดนิยามฟังก์ชันและ:เรียกใช้ฟังก์ชันใหม่ของคุณซึ่งจะวางไข่เวอร์ชันใหม่ของตัวเองอย่างไม่มีที่สิ้นสุดจนกว่าคุณจะกดขีด จำกัด กระบวนการหรือระบบหยุดทำงาน มันเป็นคำสั่งที่หยุดการทำงานของระบบใด ๆ ได้อย่างมีประสิทธิภาพ อย่าลองทำที่บ้าน
Phoshi

1
@Kevin คุณหมายถึงการเขียนโปรแกรม C รวบรวมและติดตั้งเป็นไดรเวอร์ทั้งหมดในบรรทัดคำสั่งเดียวหรือไม่ ตัวอย่างการทำงานจะยอดเยี่ยม
Desmond Hume

1
forkbomb ไม่จำเป็นต้องทำให้เคอร์เนลตกใจ OTOH สิ่งหนึ่งที่อาจทำคือการเขียน (ตามรูท) คือการพูดdd if=/dev/urandom of=/dev/mem(ขึ้นอยู่กับรุ่นเคอร์เนลของคุณคุณอาจไม่มี/dev/kmem) แต่ฉันจะไม่ใช้ระบบหลังจากนั้น :)
rbrito

คำตอบ:


80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (ข้อมูลเพิ่มเติมที่นี่ ):

echo c > /proc/sysrq-trigger

8
echo c > /proc/sysrq-triggerแน่ใจว่าทำงานได้ดีในการแช่แข็งระบบ Linux แต่โดยส่วนตัวแล้วหน้าจอสีดำที่ดีของความตายที่บรรยายเกี่ยวกับการพัฒนาอย่างมากของ call stack จะรู้สึกเหมือนตื่นตระหนกเคอร์เนล "บัญญัติ" มากกว่า
Desmond Hume

4
บน Linux คุณอาจจะต้องก่อนที่คุณจะสามารถที่จะecho 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger
คริสเตียน

OpenBSD เป็นอย่างไร
mykhal

เมื่อหนึ่งต้องการพิสูจน์ว่าชิ้นส่วนของ hw ที่ไร้ข้อบกพร่องนั้นมีประโยชน์อย่างไรมันอาจจะมีประโยชน์ ...
nemesisfixx

@mykhal ดูman.openbsd.org/ddbซึ่งจะอธิบายถึงวิธีการป้อนเคอร์เนลดีบักเกอร์บน 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

รวบรวมโมดูลที่ขัดข้องเคอร์เนลโดยเรียกใช้panicฟังก์ชันต้องการรูทต้องการmakeและgcc

แทนที่ "บัฟเฟอร์โอเวอร์รันที่ 0x4ba4c73e73ac7354" ในคำสั่งด้วยสิ่งที่น่าสนใจสำหรับละครเรื่องอื่น ๆ


4
ซอร์สโค้ดนี้ดูไม่เป็นอันตรายเพียงพอ
Mark Lakata

สิ่งนี้ทำให้เคอร์เนลเสียหาย แต่คุณจะบอกเคอร์เนลให้ถ่ายโอนข้อมูลหน่วยความจำและรีสตาร์ทได้อย่างไร Raspbian เพิ่งจะแขวนให้ฉันใช้สิ่งนี้
HeatfanJohn

อัปเดต: ดูเหมือนว่าฉันต้องทำapt-get install kdump-toolsใน Raspbian / Debian
HeatfanJohn

8

เคอร์เนลนั้นตั้งใจให้ทำงานต่อไปไม่ว่าอะไรจะเกิดขึ้น ดังนั้นวิธีใดก็ตามที่ทำให้เกิดความตื่นตระหนกของเคอร์เนลโดยการโต้ตอบกับผู้ใช้ (นอกเหนือจากการก่อกวนโดยรูททั้งหมดที่ทรงพลังเช่นบรูซ Ediger เสนอแนะ jokinkly และเมล็ดส่วนใหญ่ในวันนี้ถูกสร้างขึ้นเพื่อไม่ให้เล่นแผลง ๆบั๊กที่ร้ายแรงมากที่จะได้รับการแก้ไขอย่างรวดเร็ว


ดีที่ไม่มีการใช้งานมากเคอร์เนลเมื่อระบบได้รับการแช่แข็งอย่างสมบูรณ์โดยผู้ใช้ที่ไม่ใช่ sudoing :(){ :|:& };:ที่ออกคำสั่งในภาพของ
Desmond Hume

4
@DesmondHume การตั้งค่าที่ดีไม่ผิดพลาดเนื่องจากมีกระบวนการมากเกินไป มองหา/etc/security/limits.confไฟล์
Vreality

4

ฉันไม่รู้ว่าทำไมเรื่องนี้ถึงไม่เคยพูดถึงมาก่อน ...

sudo kill -9 1

ความตื่นตระหนกด้วยข้อความ "พยายามฆ่า init"


ไม่ได้ทำอะไรเลยในระบบทดสอบของฉัน ...
kgutwin

@kgutwin คุณใช้เคอร์เนลอะไรในระบบทดสอบของคุณ
NieDzejkob

2

ลองสิ่งนี้:

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


สิ่งนี้ทำให้ฉันตื่นตระหนกอย่างรวดเร็ว แต่ฉันไม่แน่ใจว่ากระบวนการนี้ปลอดภัยเพียงไรเพราะฉันทำมันในการติดตั้ง Ubuntu สด แต่เคอร์เนลทำข้อความผิดพลาดที่ฉันเมื่อฉันทำในสภาพแวดล้อมที่บริสุทธิ์


2
ลงคะแนนทำไม? มันตอบคำถามที่ถาม
Josua Robson

1
ปัญหากับอันนี้คือมันสามารถเรียกใช้คำสั่งเพื่อยุติกระบวนการผู้ใช้ทั้งหมดก่อนที่จะเขียน 'c' ลงในไฟล์
ผู้ใช้

1

รวบรวมรหัสต่อไปนี้เป็นโมดูลและ insmod แน่ใจว่าคุณควรได้รับความหวาดกลัว:

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
สิ่งนี้จะทำให้เกิดoopsแต่ไม่ใช่ความตื่นตระหนก
SkyDan

1

สิ่งที่ง่ายที่สุดคือกดหน้าจอ alt + print (sysrq) ค้างไว้และกด c ในขณะที่กดค้างไว้มันทำเหมือนกับecho c > /proc/sysrq-trigger คำอธิบายเล็กน้อย: ใช้คีย์ sysrq เพื่อส่งคำสั่งระดับต่ำไปยังเคอร์เนลเป็นทางเลือกสุดท้าย เพื่อพยายามบันทึกระบบ หากคุณกดหน้าจอ alt + print (sysrq) ค้างไว้แล้วกดปุ่มอื่นที่อยู่ติดกับหน้าจอมันจะเหมือนกับว่าคุณกำลังกดปุ่มในไฟล์ sysrq-trigger พวกเขาเรียกมันว่าเรียกใช้ด้วยเหตุผล 3 ตัว 'c' บอกเคอร์เนลให้เกิดความผิดพลาด

อย่างไรก็ตามคุณอาจต้องการดูเนื้อหาของ 'proc / sys / kernel / sysrq' หากเป็น 178 หรืออะไรอย่างอื่นคุณควรเปลี่ยนเป็น 1 0 ถูกปิดใช้งานทั้งหมด 1 คือเปิดใช้งานทั้งหมดและสิ่งที่ใหญ่กว่า 1 คือบิตแมปสำหรับสิ่งเฉพาะที่เคอร์เนลอนุญาตให้ทำกับ sysrq


1
นอกจากนี้คุณยังสามารถพิมพ์ "REISUB" ในขณะที่กดปุ่มวิเศษเหล่านั้นค้างไว้เพื่อรีสตาร์ตคอมพิวเตอร์ของคุณเมื่อมันแข็งตัวภายใต้ลินุกซ์ เปลี่ยนโหมดคีย์บอร์ดเป็น Xlate || E-send SigTerm ไปยังกระบวนการทั้งหมด || I- ส่ง SigKill ไปยังกระบวนการทั้งหมด (ยกเว้นการเริ่มต้นแน่นอน) || S- ซิงค์ไดรฟ์ที่ติดตั้งทั้งหมด || U-Remount อุปกรณ์ทั้งหมดในการอ่านอย่างเดียว || B- รีสตาร์ททันทีโดยไม่ต้องทำการฆ่าหรือยกเลิกการติดตั้ง ก่อนหน้านี้) นอกจากนี้คุณยังสามารถใช้ O แทน B จะปิดตัวลงแทนการเริ่ม; D มีช่วงเวลาที่ดีที่ระบบขัดข้อง
Yakusho
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.