Уязвимость arg0 сценария Bash?

Вышеупомянутый ответ работает большую часть времени, но использует следующий сценарий:

#!/bin/bash

a='foo: '
b='44494949494'

if [ ${a} -eq ${b} ]
then
   echo "a matches b"
else
   echo "a is different than b"
fi

Вместо того, чтобы полностью повторять один из вышеперечисленных вариантов, он выполняет следующие действия:

./test.sh: line 6: [: foo:: integer expression expected
a is different than b

Чтобы скрипт работал должным образом (например, сравнивал значения как строки) , вам нужно изменить сравнение на:

if [ ${a} = ${b} ]
2
06.06.2017, 04:45
2 ответа

Тривиально можно решить, каким должен быть $0. Просто создайте ссылку:

$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"

echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF

В данном конкретном случае нет, я не думаю, что это можно будет использовать с какой-либо большой пользой. "$0"и SCRIPT_HELPзаключаются в кавычки при использовании (внутри подстановок вложенных команд и здесьдокументов, но, тем не менее, в кавычки), и они не оцениваютсяed.

$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF
2
27.01.2020, 21:55

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

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

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

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

3
27.01.2020, 21:55

Теги

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