如何通过单个命令导致内核崩溃?


61

是否可以通过单个命令行引起内核崩溃?

对于sudoing用户,最简单的命令是什么?对于普通用户,这将是什么?

建议将某些内容作为命令的一部分下载的方案不计在内。


11
:(){ :|:& };:也许?
卡尔,

@carleeto好的,您能向我们其他人解释吗?
乍得哈里森

14
@hydroparadise它被称为“ forkbomb”。:()定义了一个函数:,该函数的主体为:|:&,其含义是“在后台运行:同时还运行”。;结束函数定义,并:调用您的新函数,这将无休止地生成其自身的新版本,直到您达到进程限制或系统停止运行为止。该命令可有效冻结任何没有设置良好流程限制的系统。不要在家尝试这个。
Phoshi

1
@Kevin您的意思是编写C程序,对其进行编译并将其作为驱动程序进行安装,而这些操作均在单个命令行中完成?一个有效的例子将是很好的。
Desmond Hume

1
前炸弹不一定会导致内核崩溃。OTOH,可能要做的一件事就是(作为root)写(例如,dd if=/dev/urandom of=/dev/mem取决于您的内核版本,您可能没有/dev/kmem)。但是在那之后我将不再使用该系统。:)
rbrito

Answers:


80

FreeBSD:

sysctl debug.kdb.panic=1

Linux(此处有更多信息):

echo c > /proc/sysrq-trigger

8
echo c > /proc/sysrq-trigger在冻结Linux系统方面确实做得很好。但是就个人而言,一个关于死亡的好黑屏,讲述了呼叫堆栈的急剧发展,这感觉就像是一种更为“规范的”内核恐慌。
Desmond Hume 2013年

4
在Linux上,您可能必须echo 1 > /proc/sys/kernel/sysrq先这样做echo c > /proc/sysrq-trigger
基督教徒

在OpenBSD中如何?
mykhal 2014年

当需要证明无辜的硬件
有多严重时

@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,需要makegcc

替换“在0x4ba4c73e73acce54缓冲区溢出”的命令与一些有趣的事情更多的戏剧。


4
此源代码看起来足够无害。
Mark Lakata '16

这导致内核崩溃,但是如何告诉内核转储内存并重新启动呢?Raspbian只是用这个挂了我。
HeatfanJohn

更新:看起来我需要apt-get install kdump-tools在Raspbian / Debian上进行。
HeatfanJohn

8

内核意味着无论如何都可以继续运行。因此,通过用户交互引起内核恐慌的任何方式(除了功能强大的根源故意破坏他人的行为外,就像Bruce Ediger jokinkly提出的那样,当今大多数内核都是经过构建的,因此大多数这些恶作剧首先都不会起作用)非常严重的错误,很快就会得到解决。


好吧,当系统被一个非伪造的用户完全冻结后,内核就没有多大用处了,后者发出类似于的命令:(){ :|:& };:
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 +打印屏幕(sysrq)并按住c的同时按c键,其作用与echo c > /proc/sysrq-trigger 小解释:sysrq键用于将低级命令发送到内核本身,作为最后的选择尝试保存系统。如果按住alt + print screen(sysrq)并按它们旁边的另一个键,则与在该sysrq-trigger文件中回显该键一样。他们称其为触发器是有原因的; 3'c'告诉内核崩溃(导致内核崩溃)

但是,您可能希望查看“ proc / sys / kernel / sysrq”的内容。如果它是178或其他任何值,则应将其更改为1。0表示全部禁用,1表示全部启用,大于1的值是位图,用于表示内核允许使用sysrq进行的特定操作。


1
您还可以在按住Linux完全冻结时按住这些魔术键的同时缓慢键入“ REISUB”以重新启动计算机。R将键盘模式更改为Xlate || E将SigTerm发送到所有进程|| I-将SigKill发送到所有进程(当然,除了init之外)|| S-同步所有已安装的驱动器|| U-以只读方式重新安装所有设备|| B-立即重新启动,而不会终止或卸载任何进程(我们小心了大约之前)。您还可以使用O而不是B来关闭而不是重新启动; D可以使系统崩溃很愉快
Yakusho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.