はじめに
もし実際の爆弾に飽きたなら、Linuxの端末で以下を実行してコンピュータをクラッシュさせる方法もあります:():|:& ;: この操作にはrootユーザーである必要はありません。この文字列がフォークボムと呼ばれる所以です。動作を理解する前に、bashフォークボムとは何か、シェルフォークボムの仕組みについて把握することが大切です。
UnixやLinuxでは、フォークボム攻撃とは、システムコールを利用して、現在のプロセス(親プロセスと呼ばれる)から新たなプロセス(子プロセスと呼ばれる)を生成する攻撃です。結果として、2つのプロセスが同時に別々の作業を行います。
フォークボム(「ラビットウイルス」とも呼ばれる)は、サービス拒否(DoS)攻撃の一種です。forkシステムコールを繰り返し実行し、システムリソースがすべて使い果たされるまでプロセスを生成し続けます。やがてシステムは過負荷になり、情報に応答できなくなります。
フォークボムコマンド
以下は、フォークボムのコマンド例です:
基本的には、関数が自らを一回の呼び出しごとに二度呼び出すため、終了することなくプロセスが増え続け、システムリソースが尽きるまで増殖します。
自己再帰する子プロセスがシステムリソースを消費するため、本来のプロセスの実行や新規プロセスの生成が妨げられます。攻撃中は、コンソールへの入力(例:ログアウトの試み)も無視され、システムが事実上ロック状態となります。
フォークサイクルはCPUとメモリを大量に消費するため、システムリソースは通常、最大プロセス数に達する前に枯渇します。その結果、システムのコア部分が過負荷となり、クラッシュしてしまいます。これを「カーネルパニック」と呼ぶ場合もあります。
システムのフリーズ状態は、機械が再起動されるまで続き、制御の回復にはハードリブートが必要となることが多いです。このため、データが失われる可能性もあります。また、一部のプロセスはあらかじめ設定されたルールにより、最終的にシステムへのアクセス権を与える場合もあります。
フォークボムを防ぐため、利用者が生成できるプロセス数に上限を設けます。これは以下の方法で実現されます:
Unix/Linuxでは、ulimitコマンドを使って利用者が生成できるプロセス数を制限します。例えば、ulimit=30とすることで、利用者が持てるプロセス数を30に制限します。この制限はセッション終了時にリセットされます。
また、/etc/security/limits.confファイルを用いて、システム全体のプロセス数制限を設定する方法もあります。こちらは各利用者の設定を個別に調整する手間を省くため、一般的に推奨されています。
スーパーユーザーや管理者権限を持つプロセスは、limits.confによる適切な設定がなされていても、フォークボム攻撃を防げない場合があります。
現代のシステムを用いた場合でも、フォークボム対策の完全な方法は存在しません。一般的なセキュリティのベストプラクティスを維持し、不審なコードがroot権限で実行されないようにすることで、多くのフォークボム攻撃のケースは防げます。
最新情報を購読