Как вызвать панику ядра одной командой?

62

Можно ли вызвать панику ядра одной командной строкой?

Что будет самой простой такой командой для пользователя sudoing и какой она будет для обычного пользователя, если таковая имеется?

Сценарии, которые предлагают загрузить что-либо как часть команды, не учитываются.

Десмонд Хьюм
источник
11
:(){ :|:& };:может быть?
Карл
@carleeto Хорошо, не могли бы вы объяснить это одному из нас?
Чад Харрисон
14
@hydroparadise Это называется «вилочная бомба». :()определяет функцию, вызываемую :телом :|:&, что означает «запустить: а также запустить: в фоновом режиме». ;завершает определение функции и :вызывает вашу новую функцию, которая бесконечно порождает новые версии самой себя, пока вы либо не достигнете пределов процесса, либо система не остановится. Это команда, которая эффективно замораживает любую систему без установленных хороших технологических ограничений. Не пытайтесь делать это дома.
Фоши
1
@Kevin Вы имеете в виду написание программы на C, ее компиляцию и установку в качестве драйвера, все в одной командной строке? Рабочий пример был бы великолепен.
Десмонд Хьюм
1
Вилочная бомба не обязательно вызывает панику ядра. OTOH, одна вещь, которая может сделать, это написать (как root), скажем, dd if=/dev/urandom of=/dev/mem(в зависимости от версии вашего ядра, вы можете не иметь /dev/kmem). Но я бы не стал пользоваться системой после этого. :)
rbrito

Ответы:

80

FreeBSD:

sysctl debug.kdb.panic=1

Linux (подробнее здесь ):

echo c > /proc/sysrq-trigger
Artyom
источник
8
echo c > /proc/sysrq-triggerконечно, хорошо справляется с заморозкой системы Linux. Но лично, хороший черный экран смерти, повествующий о драматическом развитии стека вызовов, будет ощущаться как «каноническая» паника ядра.
Десмонд Хьюм
4
В Linux вам может потребоваться, echo 1 > /proc/sys/kernel/sysrqпрежде чем вы сможете echo c > /proc/sysrq-trigger.
Кристиан,
как в OpenBSD?
Михал
Когда нужно доказать, насколько порочен невинный кусок 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функцию, требует root, требует makeи gcc

заменил «переполнение буфера в 0x4ba4c73e73acce54» в команде чем-то интересным для большей драматургии.

IW16
источник
4
Этот исходный код выглядит достаточно безобидным.
Марк Лаката
Это вызвало сбой ядра, но как вы говорите ядру, чтобы выгрузить память и перезапустить? Распбиан просто повесил за меня, используя это.
HeatfanJohn
Обновление: Похоже, мне нужно сделать apt-get install kdump-toolsна Raspbian / Debian.
HeatfanJohn
8

Ядро должно работать независимо от того, что. Таким образом, любой способ вызвать панику ядра из-за взаимодействия с пользователем (кроме преднамеренного вандализма со стороны всемогущего root, как предлагает Брюс Эдигер, как шутливо предлагает Брюс, и большинство ядер сегодня построены так, что большинство этих шуток не будет работать в первую очередь), является чрезвычайно серьезная ошибка, которая будет быстро исправлена.

vonbrand
источник
Ну, ядро ​​практически не используется, когда система полностью зависла от пользователя, не являющегося пользователем, который выполнил команду в подобии :(){ :|:& };:.
Десмонд Хьюм
4
@DesmondHume Хорошая установка не падает из-за слишком большого количества процессов. Посмотрите в /etc/security/limits.confфайл.
Виртуальность
4

Я не знаю, почему это не упоминалось раньше ...

sudo kill -9 1

Паника с сообщением "попытался убить init".

NieDzejkob
источник
Ничего не сделал в моей тестовой системе ...
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 screen (sysrq) и нажимать c, удерживая их. Это делает то же самое, что и echo c > /proc/sysrq-trigger Небольшое объяснение: клавиша sysrq используется для отправки низкоуровневых команд самому ядру, в качестве крайней меры попытаться сохранить систему. Если вы удерживаете нажатой клавишу alt + print screen (sysrq) и нажимаете другую клавишу рядом с ними, это происходит так же, как если бы вы отображали клавишу в этом файле триггера sysrq. Они называют это триггером по причине; 3 'c' говорит ядру о сбое (вызывает панику ядра)

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

Якушо
источник
1
Вы также можете медленно набирать «REISUB», удерживая эти волшебные клавиши, чтобы перезагрузить компьютер, когда он полностью завис под Linux. R-изменить режим клавиатуры на Xlate || E-send SigTerm для всего процесса || Я отправляю SigKill во все процессы (кроме, конечно, init) || S-синхронизирую все подключенные диски || U-перемонтирую все устройства в режиме «только для чтения» || B- перезагружается мгновенно без прерывания или отключения процесса (о чем мы позаботились) о раньше). Вы также можете использовать O вместо B, чтобы выключить вместо перезагрузки; D приятно провести время, разбивая вашу систему
Yakusho