переименовать файл, сохранив первые 10 символов нетронутыми

$0может быть любым, что захочет вызывающий скрипт. Это путь к сценарию, и вызывающая сторона может сделать копию или ссылку на сценарий в любом месте.

Однако это не является уязвимостью само по себе, если скрипт не работает с большими привилегиями, чем его вызывающий. Если исполняемый файл сценария не является привилегированным, вызывающая сторона может запустить другую программу. Это может стать уязвимостью, если вызывающая сторона сама является привилегированной и ее можно убедить передать другой $0.

Если скрипт выполняется с привилегиями, то значение $0зависит от метода, используемого для повышения привилегий. Если сценарий вызывается через символическую ссылку на исполняемый файл с setuid, тогда $0может быть произвольным (однако большинство систем отказываются от исполняемых файлов с setuid).

Несмотря на отсутствие последствий для безопасности в большинстве сценариев в этом конкретном случае, ваш сценарий не полностью устойчив к произвольному $0. Двойные кавычки в "$0"приводят к тому, что значение используется как есть (тогда как $0без кавычек будет рассматриваться как список шаблонов подстановочных знаков). Но когда команда basenameвидит это значение как аргумент, она будет обрабатывать его по-разному в зависимости от того, начинается ли значение с -. Если значение начинается с -(а не просто -), то это вариант.По крайней мере, в GNU базовое имяаргумент без опций является обязательным, поэтому вызов его с одним аргументом, начинающимся с -, приведет только к ошибке. Но это более серьезная проблема с некоторыми другими командами. Чтобы справиться с произвольными значениями, включая те, которые начинаются с -, поставьте --перед аргументом, чтобы указать, что больше не следует никаких опций: basename -- "$0".

1
17.10.2017, 16:08
0 ответов

Теги

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