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