user@Host$ killall -9 -u user
user
が所有するすべてのプロセス(forkbombsを含む)を確実に強制終了しますか?
user
に新しいプロセスが生成されることはありません。user
のプロセスはDスリープ状態になく、強制終了できません。ptrace
を検出してkillall
または終了しようとしているプロセスはありません(ただし、プロセスは相互にptraceまたは他のことを実行できます)ulimit
があります(ただし、killall
はすでに開始されており、メモリが割り当てられています)例えば。 killall
が改ざんされずに正常に終了し、このuidでプロセスが残っていないのは100%ですか?いいえの場合、それを適切に行う方法(標準コマンドとルートアクセスなし)。
SysRq + Iは間違いなくすべてのものを殺しますか(複製も)?
いいえ。killall
最初に すべてのプロセスを一覧表示します 強制終了し、次にその一覧を繰り返し処理して強制終了します。フォークボムを実行している場合、killall
がそのプロセスの1つを強制終了した後、別のプロセスが解放されたばかりのPIDをすぐに再利用する可能性が非常に高いですが、killall
はすでにそのプロセスを強制終了したと見なします、したがって事実上何も起こりません。
フォークボムが問題になる場合は、 limit を使用する必要があります。プロセスの数をたとえば128に制限すると、フォークボムは、その記述方法に応じて、サイレントに死ぬか、拡張を停止します。とにかく、それはそのシステムの他のユーザーに危険をもたらすことはありません。
私は最近、公的にアクセス可能なCTFサーバー上で多くのforkbombを処理する必要がありました。私はすでにpam_limitsでulimitsを設定していました。ほとんどのforkbombsの場合、これを行うことができます。
_killall -v -STOP -u mallory; killall -v -9 -u mallory
_
STOP信号はプロセスをフリーズするため、killallはプロセスをすべてリストして強制終了する機会があります。
ただし、通常のpython forkbombsの場合、ulimitに達するとすぐに、フォークプロセスは例外を除いて終了します。つまり、nprocのulimitが500の場合、次の定常状態になります。約500 pythonプロセスですが、各プロセスは最大でミリ秒の間しか実行されません。上記のアプローチを試したとき、killallが任意のpython信号を処理します、それはすでに終了していました。
私が学んだ最も重要なことはkillall(1)
から来ました:
_ -g, --process-group
Kill the process group to which the process belongs. The kill
signal is only sent once per group, even if multiple processes
belonging to the same process group were found.
_
したがって、これはおそらくあなたが望むことをするでしょう:
_killall -9 -v -g -u mallory
_
または、代わりに_killall -STOP
_を実行して、現在静止しているプロセスを調べて、暇なときにそれらを強制終了することもできます。必要に応じて、CONT
シグナルを使用して再開できます。