Як викликати паніку ядра однією командою?


61

Чи можна викликати паніку ядра одним командним рядком?

Що було б найпростішою такою командою для користувача, що надихався, і якою вона була б для звичайного користувача, якщо така є?

Сценарії, які пропонують завантажити щось у складі команди, не враховуються.


11
:(){ :|:& };:може бути?
Карл

@carleeto Добре, чи можете ви пояснити, що нам відпочивати?
Чад Гаррісон

14
@hydroparadise Це називається "forkbomb". :()визначає функцію, яку називають :тілом :|:&, що означає "run: а також run: у фоновому режимі". ;закінчує визначення функції та :називає вашу нову функцію, яка нескінченно породжує нові версії себе, поки ви не досягнете меж процесу або не перемелить систему. Це команда, яка ефективно заморожує будь-яку систему без встановлених належних обмежень для процесу. Не спробуйте цього вдома.
Фоши

1
@Kevin Ви маєте на увазі написати програму C, скласти її та встановити як драйвер, все в одному командному рядку? Робочий приклад був би чудовим.
Десмонд Юм

1
Форкбомба не обов'язково викликає паніку ядра. ОТО, одна річ, яка може зробити це - написати (як root), це, скажімо, 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. Але особисто, хороший чорний екран смерті, який розповідає про драматичний розвиток стека викликів, відчував би більш "канонічну" паніку ядра.
Десмонд Юм

4
В Linux, можливо, доведеться, echo 1 > /proc/sys/kernel/sysrqперш ніж ви зможете echo c > /proc/sysrq-trigger.
Крістіан

як у OpenBSD?
mykhal

Коли потрібно довести, наскільки хибний невинний шматок hw, це може стати в нагоді ...
nemesisfixx

@mykhal Дивіться man.openbsd.org/ddb Тут буде описано, як ввести налагоджувач ядра на OpenBSD.
Кусалаланда

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

заміняє команду "перевищення буфера на 0x4ba4c73e73acce54" в команді чимось цікавим для більшої драматичності.


4
Цей вихідний код виглядає досить нешкідливим.
Марк Лаката

Це призвело до збою ядра, але як сказати ядру скинути пам'ять і перезапустити? Raspbian просто повісив мене, використовуючи це.
HeatfanJohn

Оновлення: Схоже, що мені потрібно зробити apt-get install kdump-toolsна Raspbian / Debian.
HeatfanJohn

8

Ядро призначене для продовження роботи незалежно від того. Тож будь-який спосіб викликати паніку ядра шляхом взаємодії з користувачем (крім навмисного вандалізму всесильним коренем, як жартливо пропонує Брюс Едігер, і більшість ядер сьогодні побудовані так, що більшість цих пустощів не працюватимуть в першу чергу) надзвичайно серйозна помилка, яку можна швидко виправити.


Ну, ядро ​​не має великого використання, коли система була повністю заморожена користувачем, який не користується судом, який видав команду за подобою :(){ :|:& };:.
Десмонд Юм

4
@DesmondHume Хороша настройка не виходить із-за занадто багатьох процесів. Загляньте у /etc/security/limits.confфайл.
Vreality

4

Я не знаю, чому про це не згадували раніше ...

sudo kill -9 1

Паніка з повідомленням "намагалася вбити ініта".


На моїй тест-системі нічого не зробили ...
kgutwin

@kgutwin, яке ядро ​​ви використовували у своїй тестовій системі?
NieDzejkob

2

Спробуйте це:

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


Це зробило дуже швидку паніку для ядра, але я не впевнений, наскільки безпечний процес, оскільки я це зробив під час прямої установки Ubuntu. Але ядро ​​робило на мене повідомлення про помилки, коли я робив це в чистому термінальному середовищі.


2
Чому за це проголосували? Він стосується заданого питання.
Джосуа Робсон

1
Проблема з цим полягає в тому, що він потенційно може запустити команду для припинення всіх користувацьких процесів, перш ніж вона напише "c" у файл.
користувач

1

складіть наступний код у модуль та вкажіть його, переконайтесь, що у вас паніка:

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. Вони називають його тригером з причини; 3 'c' повідомляє ядро ​​про збої (викликає паніку ядра)

Однак ви можете побачити вміст 'proc / sys / kernel / sysrq'. Якщо це 178 або що-небудь інше, слід змінити його на 1. 0 все вимкнено, 1 увімкнено, а все, що більше 1, - це растрова карта для конкретних речей, які ядро ​​дозволяє робити з sysrq.


1
Ви також можете повільно набрати "REISUB", утримуючи ці магічні клавіші для перезавантаження комп'ютера, коли він повністю застиг під Linux. R - змінити режим клавіатури на Xlate || E-відправити SigTerm на весь процес || Я- надсилаю SigKill всім процесам (крім init, звичайно) || Синхронізуйте всі встановлені накопичувачі || U - перезавантажте всі пристрої, доступні лише для читання || B-, миттєво перезапускається, не вбиваючи чи відключаючи процес (про що ми подбали) про раніше). Ви також можете використовувати O замість B, щоб вимкнутись замість перезавантаження; D приємно зірвати вашу систему
Якушо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.