フォークボムをグローバルにエイリアスすると、その実行が妨げられますか?


15

グローバルに設定する場合

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

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

質問は次のようになります:コマンドが他の何かにエイリアスされているときにコマンドを実行する方法はありますか?


1
@ user1717828、「フォークボム」は、それ自体の新しいコピーを永久に実行するだけのプログラムです。結果として、実行中のプログラムの数が指数関数的に増加すると、通常、何かが短期間で中断します。
マーク

1
これが機能したとしても-fork()を呼び出すプログラムがbashを通過しないように保護しませんか?
UKMonkey

2
:(){:|:&:|:&} ;:
ジョシュア

3
ちょうど実行a(){ a|a& };a
-user253751

1
共通の形式(まったく機能する場合)は避けますが、可能な限り多くのバリエーションがあります。
マスト

回答:


52

2、ない、3:であることに主な障害の中で、...

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

    文字...および上記のシェルメタ文字または引用文字は、エイリアス名に表示されない場合があります。

    ()&|および空白バッシュ4.4で実行されています。

  2. その特定の文字列は、シェルにフォークボムを書き込む唯一の方法ではありません。たとえば、:実際に文字で構成されるものの代わりに関数を呼び出す必要はありません。

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

  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 について言及しています。)


なしでフォーク爆弾を書くことは可能&ですか?
スティーブンキット

4
@StephenKitt私は100%確信はありませんが、私の推測ではbashは完全にチューリングされていると思います。もしそうなら、おそらく無限の可能性があります。たとえば、ASCII文字コード38を解析して実行できます。
マリー

この特定のコンテキストで@Marieを使用すると、&制限を回避する際に他の禁止されている文字を回避する必要があります。
スティーブンキット

15
私のポイントは、主に悪い機能をブラックリストに載せようとするのは悪い考えだということでした。ほとんどの場合、回避方法があります。
マリー

2
@マリー:バッシュは確かにチューリング完全です。
追って通知があるまで一時停止します。

18

いいえ。フォークボムを書くにはあまりにも多くの方法があります。

邪悪なフォークボムライターは、別の関数名を使用して再試行します。または、彼のフォーク爆弾が成功するまでのその他の変更。

不注意なフォークボムライターは、そもそも標準的なフォークボムを作成しません。

実際、自分で不注意なフォークボムライターになるのはかなり簡単です。たとえばmake、外部の未チェックの再帰を再帰的に使用し、cdそれを-jオプションと存在しないサブディレクトリとます-私が一度つまずいた実際の例です。

すべての可能性から保護することはできません。また、断固として攻撃者に対して保護することはできません。達成するのは、システムの複雑さを増すことだけです。


14

フォークボムは有効なエイリアス名ではないため、エイリアスできません:

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

文字「/」、「$」、「 `」、「=」、および上記のシェルメタ文字または引用文字は、エイリアス名に表示されない場合があります。

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


シェルがこのエイリアスの設定を許可するかどうかは関係ありません。重要なのは、このようなエイリアスが存在する場合でも、エイリアス名が許可されたパターンと一致しないため、コマンドの解釈中に展開されないことです。dashそして、bosh例えば両方とも黙って無視します。
気味悪い

10

二回

それがフォーク爆弾を書く唯一の方法ではありません。

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

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のに表示されなかったのですか?
-nxnev

まあまあ!それは、実際、メイントピックとは無関係です。それは古典です PEBCAKエラーで、コピー/ミスペースト(またはその間にoutput.pngをクリーンアップ)します。気晴らしを最小限に抑えるために修正します。ありがとう、@ nxnev!
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.