単一のコマンドでカーネルパニックを引き起こす方法


62

単一のコマンドラインでカーネルパニックを引き起こすことは可能ですか?

sudoingユーザーにとって最も簡単なこのようなコマンドは何でしょうか?また、もしあれば、通常のユーザーにとっては何でしょうか?

コマンドの一部として何かをダウンロードすることを提案するシナリオは考慮されません。


11
:(){ :|:& };:多分?
カール

@carleeto OK、それを私たちの残りの人に説明してもらえますか?
チャドハリソン

14
@hydroparadise「forkbomb」と呼ばれます。の本体で:()呼び出される関数を定義します。つまり、「run:およびrun:バックグラウンド」を意味します。関数定義を終了し、新しい関数を呼び出します。これにより、プロセス制限に達するか、システムが停止するまで、新しいバージョンが無限に生成されます。これは、適切なプロセス制限が設定されていないシステムを効果的にフリーズするコマンドです。自宅でこれを試さないでください。::|:&;:
-Phoshi

1
@Kevin Cプログラムを作成し、それをコンパイルし、ドライバーとしてインストールすることをすべて1つのコマンドラインで行うということですか?実用的な例は素晴らしいでしょう。
デズモンドヒューム

1
フォークボムが必ずしもカーネルパニックを引き起こすわけではありません。OTOH、できることの 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-triggerLinuxシステムをフリーズするのに確かに良い仕事をしています。しかし、個人的には、コールスタックの劇的な発展について語る昔の死の黒い画面は、より「標準的な」カーネルパニックのように感じるでしょう。
デズモンドヒューム

4
Linuxでは、echo 1 > /proc/sys/kernel/sysrqできるようになる前に必要になる場合がありますecho c > /proc/sysrq-trigger
クリスチャン14年

OpenBSDではどうですか?
mykhal 14

無実の
ハードウェアが

参照してください@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

し、コマンド内の「buffer overrun at 0x4ba4c73e73acce54」をより興味深いドラマに置き換えます。


4
このソースコードは無害に見えます。
マーク・Lakata

これによりカーネルがクラッシュしましたが、メモリをダンプして再起動するようカーネルに指示するにはどうすればよいですか?これを使って、Raspbianがハングアップしました。
HeatfanJohn

更新:apt-get install kdump-toolsRaspbian / Debianで行う必要があるようです。
HeatfanJohn

8

カーネルは何があっても実行し続けることを意図しています。したがって、ユーザーの相互作用によってカーネルパニックを引き起こす方法(ブルースエディガーが冗談めかして提案するような強力なルートによる意図的な破壊行為を除き、今日のほとんどのカーネルは構築されているため、これらのいたずらのほとんどは最初は機能しません)非常に深刻なバグ、それはすぐに修正されます。


さて、似たようなコマンドを発行した非発呼ユーザーによってシステムが完全にフリーズされた場合、カーネルはあまり使用されません:(){ :|:& };:
デズモンドヒューム

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
なぜ反対票を投じられたのですか?質問に対処します。
ロブソン

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を押したままにすることです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-send SigTerm to all process || S前について)。また、代わりに、再起動をシャットダウンするには、BのOの代わりに使用することができ; Dは、素敵な時間にシステムをクラッシュを持っている
役所
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.