# `:(){ :|: & };:` #### 2022/03/02 #### アシスタント Takashi MIMA --- # `:(){ :|: & };:` --- ## これがFork Bomb # `:(){ :|: & };:` --- ## Fork Bombとは > **コンピュータシステムへのDoS攻撃の一種**で、新たなプロセスを生成するfork機能を使ったものである ref: [Wikipedia](https://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE) --- ## 簡単に言うと プロセスを無限に生成することでコンピュータのリソースを奪い、操作をできなくするコマンド列 --- ### `:(){ :|: & };:`の仕組み |コマンド|説明| |:-:|:-:| |:()|:という名前の空引数の関数を宣言| |{ :\\|: & }|関数のボディ| |;|Bashの終端記号| |:|:という名前の関数を実行| --- ### `:(){ :|: & };:`の仕組み |コマンド|説明| |:-:|:-:| |:()|:という名前の空引数の関数を宣言| |{ :\\|: & }|2つの関数:をパイプで繋ぎ、2つ目の:をバックグラウンドで実行する| |;|Bashの終端記号| |:|:という名前の関数を実行| --- ### `:(){ :|: & };:`の仕組み - パイプは繋がれたコマンドの数だけ fork(2) を実行 - 関数:は自身を再起的に呼び出すので、プロセステーブルが埋め尽くされるまで fork(2) を実行 ---- ### 結果 - プロセスを kill するためのプロセスが作成できない - 仮に kill できてもそれは子プロセスなので、あまり意味はない --- ### C/C++で書くとこんな感じ ```cpp #include <unistd.h> int :() { // 全角の:は関数名として利用可能 fork(); :(); } int main() { :(); } ``` --- ## 対策 - PCのreboot - 一番手軽 --- ### `while (sleep 100 &) do; done` の実行 - fork bombは性質上すぐに実行が終了する - 何もしないプロセスを大量に作ることで増殖を止める - その後、sleepしたプロセスをまとめてkillする --- ### 各ユーザのプロセス作成率を制限する - fork bombの性質上、同じ親プロセスから生成される - 静的な閾値に収まっていない fork(2) を実行できないように制限 - この監視プログラムをカーネル空間で起動しておくことで、fork bombの影響から逃れる - ref: Hareesh et al., (2017) "Accurate fork bomb detection by process name", 2017 ICICICT. --- ### これを拡張したら面白そう - eBPFで動かす - カーネル空間で動くので嬉しい - アタッチが容易で、他のプロセスの動作を邪魔しない - 閾値を動的に制限してくれると嬉しい - 利用されているリソースもeBPFから取得可能 - 空きリソースのうちN%を超えた時点で動的に制限すると良さそう --- ## EOF
{"metaMigratedAt":"2023-06-16T20:33:01.020Z","metaMigratedFrom":"Content","title":"`:(){ :|: & };:`","breaks":true,"contributors":"[{\"id\":\"c64e0a35-742f-4f1b-b4ed-b434589ec551\",\"add\":1855,\"del\":335}]"}
    490 views