Если у пользователя нет разрешения на чтение исполняемого скрипта, то попытка запустить его завершится неудачей , если у пользователя нет CAP_DAC_OVERRIDE
возможности (, например. она корень):
$ cat > yup; chmod 100 yup
#! /bin/sh
echo yup
^D
$./yup
/bin/sh: 0: Can't open./yup
Интерпретатор (при неудачном или успешном выполнении )всегда будет работать от имени текущего пользователя, игнорируя любые биты setuid или расширенные атрибуты setcap скрипта.
Исполняемые сценарии отличаются от двоичных тем, что интерпретатор должен иметь возможность открывать и читать их для запуска. Однако обратите внимание, что они просто передаются в качестве аргумента интерпретатору, который может вообще не пытаться их прочитать, а делать что-то совершенно другое :
.
$ cat > interp; chmod 755 interp
#! /bin/sh
printf 'you said %s\n' "$1"
^D
$ cat > script; chmod 100 script
#!./interp
nothing to see here
^D
$./script
you said./script
Конечно, сам интерпретатор может быть двоичным файлом setuid илиcap_dac_override=ep
-setcap (или передавать путь сценария в качестве аргумента такому двоичному файлу ), и в этом случае он будет работать с повышенными привилегиями и может игнорировать любые права доступа к файлам.
В Linux вы можете обойти все ограничения на исполняемые скрипты (и разрушить вашу систему; -))с помощью модуля binfmt_misc
:
Как root:
# echo ':interp-test:M::#!./interp::./interp:C' \
> /proc/sys/fs/binfmt_misc/register
# cat > /tmp/script <<'EOT'; chmod 4001 /tmp/script # just exec + setuid
#!./interp
id -u
EOT
Как обычный пользователь:
$ echo 'int main(void){ dup2(getauxval(AT_EXECFD), 0); execl("/bin/sh", "sh", "-p", (void*)0); }' |
cc -include sys/auxv.h -include unistd.h -x c - -o./interp
$ /tmp/script
0
Яппи!
Больше информации вDocumentation/admin-guide/binfmt-misc.rst
в исходниках ядра.
Опция -p
может вызвать ошибку в некоторых оболочках (, где ее можно просто удалить ), но она необходима в более новых версиях dash
и bash
, чтобы предотвратить их . ] сброс привилегий , даже если они не запрашиваются.
Итак, после долгих раздумий я пришел к выводу, что в SSH нет ничего встроенного для выполнения того, что мод _rewrite делает для Apache2, скорее всего, по веским причинам.
Итак, вместо этого я прибегнул к замене команды gogs
, вызываемой из SSH (в файле .authorized_keys
, сценарием, который перезаписывает переменную окружения SSH _ORIGINAL _COMMAND, а затем вызывает реальную исполняемый файл gogs.
SSH _ОРИГИНАЛЬНАЯ _КОМАНДА — это переменная, в которую SSH записывает команду, отправленную на сервер, перед вызовом команды, записанной в .authorized_keys
(, когда она есть ). В случае gogs эта переменная используется для проверки существования репозитория, проверки его принадлежности вошедшему в систему пользователю SSH и т. д. и, наконец, выполнения над ним операции git. Изменив путь репозитория в этой переменной,можно использовать псевдонимы репозиториев на -лету -.