
私はfork.shというスクリプトを得ました。
#!/bin/sh
forkbomb() { forkbomb | forkbomb & } ; forkbomb
suexecを介して呼び出すと、システム全体がCPUの99%を消費します。通常のbashフォーク爆撃を防ぐためにLimit.confを使用し、nprocを50に設定しました。これは期待どおりに機能します。
ただし、httpdでsuexecを介して上記のスクリプトを呼び出すと、6000以上のジョブとシステムCPU使用率が> 97%で表示されます。 user3 fork.shに関する複数の項目が表示され、CPU使用率は約0.6%です。 systemd-cgtopを呼び出すと、system.sliceのCPU使用率は100%、system.slice / httpd.serviceのCPU使用率は75%です。
httpdを制限するためにcgroupを使用しました。
systemctl set-property --runtime httpd.service CPUShares=600 MemoryLimit=500M
ulimitsとcgroupsがなぜこれを処理できないのか理解できません。
答え1
これらのlimits
ファイルは、まだPAM
.apache提供のインベントリでsuexec
認識または使用されていませんPAM
。パッチが存在します。呼び出すソースコードを直接変更できますがsetrlimit
(簡単に見えます。setlimit(2)
マニュアルページを参照してください)、現時点suexec
ではlimits
。
Apacheではまだulimitを設定できますが、特にプリフォークモデルではこれは望ましくないと思います。なぜなら、それはhttpサーバーが処理できる負荷を制限するからです。また、制限がどのように機能するかsuexec
わからないので、制限が環境に適用されるかどうかはわかりません。suexec
CPUShares
フォークボムはリソースを大量に消費しますが、リソースは実際にはユーザーエリアのCPUサイクルにはないので、ここではその理由は役に立ちません。 CPU統計に関しては遅すぎます。システムにプログラムの実行に使用できる空きメモリーまたはプロセススロットはありません。
prlimit
そのうちのいくつかを試してみることができるので、util-linux
インストール標準を満たす必要があります。これにより:
$ prlimit --nproc=1 bash -c bash -c id
bash: fork: retry: No child processes
そのため、この小さな2フォークプロセスは失敗しました。
残念ながら、私はprlimitに実行チェーンに参加させるための合理的な方法を見つけることができませんでした。 Apacheは、suexec
基本的な要件を満たすのに十分な柔軟性がなく、あまりにも制限されているため、セキュリティを破る必要がある廃止されたモジュールを提供することで、自分と私たちの両方を台無しにしました。