フォーク爆弾をグローバルにエイリアスすると、その実行は防止されますか?

フォーク爆弾をグローバルにエイリアスすると、その実行は防止されますか?

グローバルに設定すると

alias ':(){ :|:& };:'='echo fork bomb averted'

これは、Bash フォーク爆弾の実行を回避するための効果的なセキュリティ戦略でしょうか、それともまだ実行する方法があるのでしょうか?

質問は、コマンドが他のものにエイリアスされているときにそれを実行する方法はあるか、ということに集約されると思います。

答え1

2、いや、3つ...それに対する主な障害は次のとおりです。

  1. エイリアスとして有効な名前ではありません。Bashのオンラインマニュアル:

    文字 ... および上記のシェル メタ文字または引用符文字は、エイリアス名には使用できません。

    (、、)および空白&|Bash 4.4 では廃止されました。

  2. この特定の文字列は、シェルでフォーク爆弾を記述する唯一の方法ではなく、単にわかりにくいように見えるために有名になっているだけです。たとえば、:実際に文字で構成されたものの代わりに関数を呼び出す必要はありません。

  3. エイリアスを設定できる場合、ユーザーはエイリアスの設定を解除したり、コマンド ラインでエイリアス名をエスケープしてエイリアスを回避したり、スクリプトで関数を実行してエイリアスを完全に無効にしたりすることができます (Bash は非対話型シェルでエイリアスを展開しません)。

  4. シェルがすべてのバージョンのフォーク爆弾を阻止できるほど十分に制限されているとしても、汎用システムには、サブプロセスを再帰的にフォークできる他のプログラム可能なユーティリティがあります。Perl または C コンパイラをお持ちですか? 簡単です。awk でもおそらくできます。これらがインストールされていない場合でも、ユーザーがシステム外からコンパイル済みのバイナリを持ち込んだり、/bin/shシステムの残りの部分が機能するために完全に機能するシェルである必要があるものを実行したりしないようにする必要があります。

ただ使うだけulimit -u(つまりRLIMIT_NPROC)または同等の方法で、ユーザーが開始できるプロセスの数を制限します。ほとんどのLinuxシステムでは、pam_limitsユーザーが選択したコマンドが開始される前にプロセス数の制限を設定できます。

次のようなものは、/etc/security/limits.confすべてのユーザーに対して 50 プロセスのハード制限を設定します。

*        hard    nproc           50

(スティーブン・キットすでに述べたポイント 1、ジェフ・シャーラー言及された2と3。

答え2

いいえ。フォーク爆弾を書く方法が多すぎるのです。

邪悪な fork-bomb の作成者は、異なる関数名で再試行します。または、fork-bomb が成功するまで他の変更を加えます。

不注意なフォーク爆弾作成者は、そもそも標準的なフォーク爆弾を作成しません。

実際には、うっかりしてフォーク爆弾を作成してしまうことは非常に簡単です。たとえば、makeチェックされていない外部の を recursive で使用しcd、オプションと存在しないサブディレクトリを組み合わせることができます-j。これは、私が一度遭遇した実際の例です。

あらゆる可能性から身を守ることは不可能であり、ましてや決意を固めた攻撃者から身を守ることは不可能です。達成できるのは、システムの複雑さが増すだけです。

答え3

フォーク爆弾はエイリアス化できません。有効なエイリアス名:

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

'/'、'$'、'`'、'=' の文字、および上記のシェル メタ文字または引用符文字は、エイリアス名には使用できません。

一部のシェルは、エイリアス名が宣言されたときにはチェックせず、コマンドを解釈するときにチェックし、無効な名前をスキップします。フォーク爆弾には必ず が含まれますが&、これは有効なエイリアス名に含めることができないため、この方法で自分自身を保護することは不可能です。

答え4

二度はダメ。

フォーク爆弾を書く方法はこれだけではありません。

エイリアスがある場合、「コマンド」を実行する方法もいくつかあります。

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

関連情報