Làm thế nào để gây ra hoảng loạn kernel với một lệnh duy nhất?


62

Có thể gây ra sự hoảng loạn hạt nhân với một dòng lệnh không?

Điều gì sẽ là lệnh đơn giản nhất như vậy đối với người dùng sudoing và nó sẽ là gì đối với người dùng thông thường, nếu có?

Các kịch bản đề nghị tải xuống một cái gì đó như là một phần của lệnh không được tính.


11
:(){ :|:& };:có lẽ?
Carl

@carleeto Ok, bạn có thể giải thích rằng một trong những phần còn lại của chúng tôi?
Chad Harrison

14
@hydroparadise Nó được gọi là "forkbomb". :()định nghĩa một hàm được gọi :với phần thân của :|:&, có nghĩa là "chạy: và cũng chạy: trong nền". ;kết thúc định nghĩa hàm và :gọi hàm mới của bạn, sẽ sinh ra vô tận các phiên bản mới của chính nó cho đến khi bạn đạt đến giới hạn quá trình hoặc hệ thống dừng hoạt động. Đó là một lệnh có hiệu quả đóng băng bất kỳ hệ thống nào mà không đặt giới hạn quy trình tốt. Đừng thử điều này ở nhà.
Phoshi

1
@Kevin Bạn có nghĩa là viết một chương trình C, biên dịch nó và cài đặt nó như một trình điều khiển, tất cả trong một dòng lệnh? Một ví dụ làm việc sẽ là tuyệt vời.
Desmond Hume

1
Một cái nĩa không nhất thiết gây ra sự hoảng loạn hạt nhân. OTOH, một điều có thể làm là viết (với quyền root) là, giả sử, dd if=/dev/urandom of=/dev/mem(tùy thuộc vào phiên bản kernel của bạn, bạn có thể không có /dev/kmem). Nhưng tôi sẽ không sử dụng hệ thống sau đó. :)
rbrito

Câu trả lời:


80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (thông tin thêm ở đây ):

echo c > /proc/sysrq-trigger

8
echo c > /proc/sysrq-triggerchắc chắn làm tốt công việc đóng băng hệ thống Linux. Nhưng về mặt cá nhân, một màn hình đen tốt về cái chết kể về sự phát triển mạnh mẽ của ngăn xếp cuộc gọi sẽ có cảm giác như một cơn hoảng loạn hạt nhân "kinh điển" hơn.
Desmond Hume

4
Trên Linux, bạn có thể phải làm echo 1 > /proc/sys/kernel/sysrqtrước khi có thể echo c > /proc/sysrq-trigger.
Christian

Làm thế nào trong OpenBSD?
mykhal

Khi một người cần chứng minh sự hoàn hảo của một mảnh hw vô tội, điều này có thể có ích ...
nemeisfixx 18/07/2015

@mykhal Xem man.openbsd.org/ddb Điều đó sẽ mô tả cách nhập trình gỡ lỗi kernel trên 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

Biên dịch một mô-đun làm hỏng kernel bằng cách gọi panichàm, cần root, yêu cầu makegcc

Thay thế "tràn bộ đệm tại 0x4ba4c73e73acce54" trong lệnh bằng một cái gì đó thú vị để có nhiều kịch tính hơn.


4
Mã nguồn này trông vô hại đủ.
Mark Lakata

Điều này khiến kernel bị sập, nhưng làm thế nào để bạn bảo kernel bỏ bộ nhớ và khởi động lại? Raspbian chỉ treo cho tôi bằng cách sử dụng này.
HeatfanJohn

Cập nhật: Có vẻ như tôi cần phải làm apt-get install kdump-toolstrên Raspbian / Debian.
HeatfanJohn

8

Hạt nhân có nghĩa là để tiếp tục chạy bất kể điều gì. Vì vậy, bất kỳ cách nào để gây ra sự hoảng loạn hạt nhân bởi sự tương tác của người dùng (trừ việc phá hoại có chủ ý bởi gốc rễ toàn năng, như Bruce Ediger jokinkly đề xuất, và hầu hết các hạt nhân ngày nay đều được xây dựng nên hầu hết những trò đùa đó sẽ không hoạt động ngay từ đầu) lỗi cực kỳ nghiêm trọng, sẽ được sửa chữa nhanh chóng.


Vâng, không có nhiều sử dụng kernel khi hệ thống đã bị đóng băng hoàn toàn bởi một người dùng không sudoing đã ban hành một lệnh theo cách tương tự :(){ :|:& };:.
Desmond Hume

4
@DesmondHume Một thiết lập tốt không bị sập do quá nhiều quá trình. Nhìn vào /etc/security/limits.conftập tin.
Vreality

4

Tôi không biết tại sao điều này không được đề cập trước đây ...

sudo kill -9 1

Hoảng loạn với thông điệp "đã cố giết init".


Không làm gì trên hệ thống kiểm tra của tôi ...
kgutwin

@kgutwin bạn đã sử dụng kernel nào trên hệ thống kiểm tra của mình?
NieDzejkob

2

Thử đi:

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


Điều này đã làm tôi hoảng loạn rất nhanh, nhưng tôi không chắc quá trình này an toàn đến mức nào vì tôi đã thực hiện nó khi cài đặt Ubuntu trực tiếp. Nhưng kernel đã gửi thông báo lỗi spam cho tôi khi tôi làm điều đó trong môi trường thiết bị đầu cuối thuần túy.


2
Tại sao nó được bỏ phiếu? Nó giải quyết câu hỏi được hỏi.
Josua Robson

1
Vấn đề với cái này là nó có khả năng chạy lệnh chấm dứt tất cả các tiến trình của người dùng trước khi nó ghi 'c' vào tệp.
người dùng

1

biên dịch mã sau đây vào một mô-đun và khắc phục nó, chắc chắn bạn sẽ nhận được sự hoảng loạn:

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
Điều này sẽ gây ra một oops, nhưng không phải là hoảng loạn.
SkyDan

1

Cách đơn giản nhất là giữ phím alt + in (sysrq) và nhấn c trong khi vẫn giữ chúng Nó cũng giống như echo c > /proc/sysrq-trigger Một lời giải thích nhỏ: phím sysrq được sử dụng để gửi các lệnh cấp thấp đến chính kernel, như là phương sách cuối cùng để cố gắng cứu hệ thống. Nếu bạn giữ alt + màn hình in (sysrq) xuống và nhấn một phím khác bên cạnh chúng, nó sẽ hoạt động tương tự như khi bạn lặp lại phím trong tệp kích hoạt sysrq đó. Họ gọi nó là trình kích hoạt vì một lý do; 3 'c' báo cho kernel bị sập (gây ra sự hoảng loạn hạt nhân)

Tuy nhiên, bạn có thể muốn xem nội dung của 'Proc / sys / kernel / sysrq'. Nếu nó là 178 hoặc bất cứ điều gì khác, bạn nên thay đổi thành 1. 0 bị vô hiệu hóa, 1 được bật và tất cả mọi thứ lớn hơn 1 là một bitmap cho những điều cụ thể mà kernel cho phép thực hiện với sysrq.


1
Bạn cũng có thể gõ từ từ "REISUB" trong khi giữ các phím ma thuật đó để khởi động lại máy tính khi nó bị đóng băng hoàn toàn trong linux. Thay đổi chế độ bàn phím R thành XTable | | E-gửi SigTerm cho tất cả quá trình | | Tôi gửi SigKill tới tất cả các quy trình (ngoại trừ khóa init) || S- đồng bộ hóa tất cả các ổ đĩa được gắn kết | về trước). Bạn cũng có thể sử dụng O thay vì B để tắt thay vì khởi động lại; D có một thời gian tốt đẹp làm sập hệ thống của bạn
Yakusho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.