-4

WAS:SUに移行されたSOに関する別の質問を読んでいます:https ://superuser.com/questions/435690/does-linux-have-any-measures-to-protect-against-fork-bombs 、私は考えていましたカーネルレベルでのソリューション。私はLWN(http://lwn.net/Articles/435917/)で1つの提案を読みましたが、この提案はそれを防ぐことができるようにフォーク爆弾の検出に焦点を合わせています。

検出は基本的にシステムが使用できないことを意味するので、私は回復に焦点を合わせます。システムのすべてのユーザーによってまもなく検出されるもの。

コンテキストを非フォーク爆弾のみに広げます。システムが応答せず、適切なコンソールを取得できないが、それでもクリーンに再起動したくない場合はどうなりますか。

だから質問:

いくつかのSysReqコマンドによってカーネルに、障害のあるプロセスを強制終了する目的で1つのプロセスのみを実行する(そしてそれをフォークすることを拒否する)リカバリシェルに入るように指示することは可能ですか?この機能は実装されたことがありますか?いいえの場合、なぜですか?

備考私はすべてのプロセスにSIGKILLを送信するSysReq+iについて話しているのではなく、すべてのプロセスにSIGSTOPのように動作するものであり、最初のカーネルkexecと並んで、それを検査して再開することができます。

4

1 に答える 1

2

root以外のユーザーの場合、 setrlimit(2) syscallを使用してプロセスの最大数をいつでも制限できますRLIMIT_NPROC

ulimit組み込みのbashを使用できます(またはシェルとしてlimit使用する場合)。また、 「システム全体」で制限zshすることもできます (ただし、必要に応じて、ユーザーごとに制限ユーザーを調整するなど)。PAMはそのために非常に強力です。/etc/security/limits.conf/etc/pam.d/

危険なカーネルパッチは必要ないと思います。マシンを注意深く管理したいだけです。

そして、あなたはフォーク爆弾を気にしませんroot:悪意のある(または愚かな)ユーザーがルートアクセスを取得した場合、あなたのLinuxシステムはとにかく運命づけられます(ルートフォーク爆弾がなくても)。定義上、rootは信頼されており、注意深く巧妙に動作する必要があるため、誰もそれらを気にしません。(同様に、ルートはできます/bin/rm -rf /が、それは通常、ルートフォーク爆弾のように愚かです。したがって、両方の間違いに対する保護は存在しません...)

また、カーネルパッチは難しいでしょう。つまり、ルートが1つだけでなく、複数のプロセス(少なくとも、リカバリシェルと子コマンド(場合によってはパイプされる))を実行できるようにする必要があります。!カーネルパッチは脆弱であり、システム全体がクラッシュする可能性があります。

もちろん、カーネルはフリーソフトウェアなので、自由にパッチを当てることができます。ただし、興味深いパッチを作成し、それによってカーネルコミュニティを引き付けることも、社会的な問題です(そして達成するのがはるかに困難です)。幸運を。LKLMはそれを議論するためのより良い場所です。

PS SIGSTOP。すべての非initプロセスに送信しても、ルートフォーク爆弾はあまり役に立ちません。シェルも常に停止するため、シェルコマンドを入力することはできません。

PPS。質問で引用されたLWNの記事には、cgroup関連する可能性のある-sについて言及したコメントがありました。

于 2013-03-16T20:33:43.820 に答える