php 5.3.1 win64 apache2, через 3 секунды после запуска скрипта с print glob("../../*/../*/*/../../*/*/*/*"); прекращается выполнение, процесс апача успевает занять 25мб. Логично предположить что пхп справляется с этой проблемой :)
ftp> ls ./../../*/*/../*/../*/*/*/../…
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
Я точно помню это в споре о разнице парсинга звезды в DOS (где звезда означает «дальше не важно») и в unix. Как раз тогда приводился пример кода, который подвешивал и cmd, и юникс — и там как раз было несколько звёздочек.
Строка выглядела примерно как a*aa*aa*aa*a*a. Найти информацию сейчас не смог, в те времена интернетов особо не было…
Речь, как я понимаю, шла об эксплуатации worst-case execution time для бэктрекинга. Например, для алгоритма Кнута-Морриса-Пратта строка вида «aaaaaaaaaa» сама по себе является наихудшим паттерном, сопоставление может идти очень долго. Если при этом добавить в паттерн вайлдкарды, бэктрекинг совсем сойдёт с ума и будет работать дольше, чем O(n^2).
Этот баг требует правильности пути. Видимо, исправив(или нет?) его, разработчики упустили противоположный вариант, о котором говорится в топике — проверка не происходит «в случае задания некорректных путей в шаблоне».
Чего-то я не понял, при чем здесь вообще sh…
Разве ls ../../*/../*/*/../../*/*/*/* не подвешивает проц просто потому, что пытается зайти в кучу каталогов подряд и может еще и рекурсивно где-то?.. Тогда с таким же успехом может подвесить проц что-то вроде while true; do true; done
Разобрался, пролистав оригинальную статью. Это действительно просто тяжелая инструкция, с той разницей, что ее можно выполнить, например, на анонимном ftp
То есть проблема в том, что флаг GLOB_LIMIT не действует при некоторых входных данных, из-за чего происходит высокая нагрузка на CPU и потребление RAM?
То, что уязвимость в функции glob — верю.
Но что показывают примеры с ls ../../*/../*/*/../../*/*/*/*, а также примеры на питоне и php?
Разве ls по умолчанию устанавливает флаг GLOB_LIMIT?
Этот параметр по идее должен устанавливаться как раз только на чем-то типа ftp серверов:
«This option should be set for programs that can be coerced
into a denial of service attack via patterns that expand
to a very large number of matches, such as a long string
of `*/../*/..'.»
(man glob)
Уязвимость в стандартной функции glob() как угроза для FTP-серверов