Товарищи по U&L: Прежде чем отклонять мой ответ об использовании C-стиля с функцией main ()
, перейдите по этой ссылке: https: // unix.stackexchange.com/a/313561/85039 Использование основных функций в скриптах - обычная практика, используемая многими профессионалами в данной области.
Как указал Жиль, подоболочки не могут делать переменные доступными вне своей среды. Но давайте подойдем к этой проблеме с другой стороны - если вы напишете свой скрипт в функциях, можно объявить переменную как local
, и это можно будет редактировать.
Из руководства bash 4.3, local
описание:
... Когда local используется в функции, это приводит к тому, что имя переменной имеет видимую область видимости, ограниченную этой функцией и ее дочерними элементами. ...
Пример:
#!/bin/bash
outter()
{
for i in $(seq 1 3)
do
var=$i
done
}
main()
{
local var=0
outter
echo $var
}
main "$@"
$ ./testscript.sh
3
Как вы можете видеть после 3 итераций функции цикла, переменная изменяется.
Согласно Брэду Спенглеру на https://forums.grsecurity.net/viewtopic.php?f=7&t=2522, существует тривиальный способ эскалации до uid 0 с помощью CAP_SYS_CHROOT
(возможность использования chroot(2)
:
CAP_SYS_CHROOT: generic: От Julien Tinnes/Chris Evans: если у вас есть доступ на запись в ту же файловую систему, что и suid root бинарник, создайте chroot окружение с backdoored libc, а затем выполните жестко связанный suid root бинарник внутри chroot и получите полные привилегии root через бэкдор
chroot(2)
не меняет рабочий каталог, поэтому после вызова .
может находиться вне дерева с корнем в /
. Затем вы можете запустить любой двоичный файл setuid из chroot, используя относительный путь. Вероятно, есть много способов использовать это. Например, изменив /etc/ld.so.preload
внутри вашего каталога chroot, вы можете выполнять произвольный код с привилегиями root. Вы можете посмотреть пример .