無限再帰によるセグフォルトのバッシュ


2

bashが使用している(4.2.25(1))は無限関数の再帰に対して保護されていないことに気付きました。このような場合、Segfaultが発生します(そしてbashプロセスが終了します)。でこれを確認するにはbash、次のように入力します。

$ bash
$ f() { f; }
$ f

(最初にサブシェルを開始すると(最初の行)、端末のシェルを危険にさらすことなく実験できる候補が得られます。最初の行がなければ、ターミナルウィンドウはおそらくすぐに閉じられるので、興味深いものは何も表示されません。)

私はこの現象の理由を理解していると思います。おそらくbashプロセスに割り当てられていないメモリの領域に書き込もうとするスタックオーバーフローです。

私が疑問に思っているのは、2つのことです。

  • bashそのような状況からそれを保護するためのチェックを行うべきではありませんか?「シェル関数でのスタックオーバーフロー」のようなより適切なエラーメッセージは、単純な役に立たないセグフォールトよりも確実に優れています。

  • これはセキュリティ上の問題でしょうか?このメソッドは、プロセスに割り当てられていない(Segfaultになる)メモリパーツに書き込む前に、bash内部スタックに使用することを意図していない他のパーツを上書きする可能性があります。


1
bash 3.2.57(OS X 10.10.2 Yosemite)および4.3.11(Ubuntu 14.04 LTS)でこれを確認できます。これは起こるべきではありません(からman bash):Functions may be recursive. No limit is imposed on the number of recursive calls.それbashはそれを制限しないことを意味するかもしれませんが、利用可能なメモリのみです:
jaume

1
少なくとも2003年以来、これは古い既知の動作のようです。これは興味深いものです。
ハスター

@hasturに感謝します。これは「バグ」の歴史について啓発するものでした。これがセキュリティ問題かどうかは疑問です。おそらくそれを利用するにはカオスが多すぎると思います。
アルフェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.