Баш Segfault по бесконечной рекурсии

566
Alfe

Я только что заметил, что bashя использую (4.2.25 (1)) не защищен от бесконечной рекурсии функции. В таком случае происходит Segfault (и bashпроцесс завершается). Чтобы это проверить bash, просто наберите:

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

(Запуск сначала подоболочки (первая строка) дает нам кандидата, с которым мы можем поэкспериментировать, не подвергая опасности оболочку терминала; без первой строки окно вашего терминала, вероятно, закроется так быстро, что вы не увидите ничего интересного.)

Я понимаю причину этого явления, я думаю; это, вероятно, переполнение стека, которое приводит к bashпопытке записи в области памяти, которые не назначены его процессу.

Что меня интересует, так это две вещи:

  • Разве не должно быть проверки, bashчтобы защитить его от таких ситуаций? Более приличное сообщение об ошибке, такое как «Переполнение стека в функции оболочки», безусловно, будет лучше, чем простое бесполезное Segfault.

  • Может ли это быть проблемой безопасности? Перед тем, как этот метод записывает в части памяти, которые не назначены процессу (что приводит к Segfault), он может перезаписать другие части, которые не предназначены для использования в bashстеке -internal.

2
Можно подтвердить это для bash 3.2.57 (OS X 10.10.2 Yosemite) и 4.3.11 (Ubuntu 14.04 LTS). Этого не должно происходить (из `man bash`):` Функции могут быть рекурсивными. На количество рекурсивных вызовов не накладывается никаких ограничений. Хотя это может означать, что `bash` не ограничивает его, только доступная память :-) jaume 9 лет назад 1
Похоже, это старое известное поведение как минимум с 2003 года. Может быть, вы можете [найти интересное это] (http://lists.gnu.org/archive/html/bug-bash/2003-12/msg00007.html). Hastur 9 лет назад 1
Спасибо @hastur, это было поучительно об истории «жука». Остается вопрос, является ли это проблемой безопасности. Наверное, слишком хаотичное поведение, чтобы его использовать. Alfe 9 лет назад 0

0 ответов на вопрос

Похожие вопросы