# `:(){ :|: & };:`
#### 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}]"}