グローバルに設定する場合
alias ':(){ :|:& };:'='echo fork bomb averted'
それはBash fork爆弾の実行を回避するための効果的なセキュリティ戦略でしょうか、それとも実行する方法はまだありますか?
質問は次のようになります:コマンドが他の何かにエイリアスされているときにコマンドを実行する方法はありますか?
a(){ a|a& };a
グローバルに設定する場合
alias ':(){ :|:& };:'='echo fork bomb averted'
それはBash fork爆弾の実行を回避するための効果的なセキュリティ戦略でしょうか、それとも実行する方法はまだありますか?
質問は次のようになります:コマンドが他の何かにエイリアスされているときにコマンドを実行する方法はありますか?
a(){ a|a& };a
回答:
2、ない、3:であることに主な障害の中で、...
エイリアスの有効な名前ではありません。Bashのオンラインマニュアル:
文字...および上記のシェルメタ文字または引用文字は、エイリアス名に表示されない場合があります。
(
、)
、&
、|
および空白バッシュ4.4で実行されています。
その特定の文字列は、シェルにフォークボムを書き込む唯一の方法ではありません。たとえば、:
実際に文字で構成されるものの代わりに関数を呼び出す必要はありません。
エイリアスを設定できる場合、ユーザーはコマンドラインでエイリアス名をエスケープしてエイリアスを設定解除、回避するか、スクリプトで関数を実行することでエイリアスを完全に無効にすることができます(非対話型シェルではエイリアスは展開されません) 。
シェルがフォーク爆弾のすべてのバージョンを停止するのに十分に制限されている場合でも、汎用システムには、サブプロセスを再帰およびフォークできる他のプログラム可能なユーティリティがあります。PerlまたはCコンパイラを入手しましたか?簡単です。awkでさえ、おそらくそれを行うことができます。それらをインストールしていない場合でも、ユーザーがシステムの外部からコンパイルされたバイナリを持ち込んだり、システム/bin/sh
の残りの部分が機能するためにおそらく完全に操作可能なシェルである必要がある実行を停止したりする必要があります。
ユーザーが開始できるプロセスの数を制限するためにulimit -u
(つまりRLIMIT_NPROC
)または同等のものを使用します。ほとんどのLinuxシステムでpam_limits
は、ユーザーが選択したコマンドを開始する前にプロセス数の制限を設定できます。
このようなもの/etc/security/limits.conf
は、すべてのユーザーに50プロセスという厳しい制限を課します。
* hard nproc 50
(Stephen Kittはすでにポイント1 について言及しており、Jeff Schaller は 2および3 について言及しています。)
&
ですか?
&
制限を回避する際に他の禁止されている文字を回避する必要があります。
いいえ。フォークボムを書くにはあまりにも多くの方法があります。
邪悪なフォークボムライターは、別の関数名を使用して再試行します。または、彼のフォーク爆弾が成功するまでのその他の変更。
不注意なフォークボムライターは、そもそも標準的なフォークボムを作成しません。
実際、自分で不注意なフォークボムライターになるのはかなり簡単です。たとえばmake
、外部の未チェックの再帰を再帰的に使用し、cd
それを-j
オプションと存在しないサブディレクトリとます-私が一度つまずいた実際の例です。
すべての可能性から保護することはできません。また、断固として攻撃者に対して保護することはできません。達成するのは、システムの複雑さを増すことだけです。
フォークボムは有効なエイリアス名ではないため、エイリアスできません:
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
文字「/」、「$」、「 `」、「=」、および上記のシェルメタ文字または引用文字は、エイリアス名に表示されない場合があります。
一部のシェルは、宣言時にエイリアス名をチェックしませんが、コマンドを解釈するときにエイリアス名をチェックし、無効な名前をスキップします。フォークボムには常に&
が含まれますが、有効なエイリアス名に含めることはできないため、この方法で自分を保護することはできません。
dash
そして、bosh
例えば両方とも黙って無視します。
二回
それがフォーク爆弾を書く唯一の方法ではありません。
エイリアスがある場合に「コマンド」を実行する方法もいくつかあります。
command the-command
\the-command
例:
$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html output.png
$ command ls
jeff.html output.png
\ls
表示されましoutput.png
たか?command ls
のに表示されなかったのですか?