Systemcrash suexec forkbomb.sh ulimits

Systemcrash suexec forkbomb.sh ulimits

私は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基本的な要件を満たすのに十分な柔軟性がなく、あまりにも制限されているため、セキュリティを破る必要がある廃止されたモジュールを提供することで、自分と私たちの両方を台無しにしました。

おすすめ記事