Что делает `ln /path/to/file -i `в сценарии с setuid?

parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary 0GB 100%

Затем запустите программу установки.

2
15.06.2021, 07:51
2 ответа

Документ, на который вы ссылаетесь (http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html), описывает поведение lnв (предположительно )системе UNIX, и вы смотрели руководство в системе Linux, или, точнее, GNU/Linux. GNU является важным моментом здесь. У GNU lnдействительно есть вариант, который вы упомянули :

.
   -i, --interactive
          prompt whether to remove destinations

Однако это расширение GNU и не является частью стандарта POSIX , в котором определены только следующие флаги опций:

-f
    Force existing destination pathnames to be removed to allow the link.
-L
    For each source_file operand that names a file of type symbolic link, create a (hard) link to the file referenced by the symbolic link.
-P
    For each source_file operand that names a file of type symbolic link, create a (hard) link to the symbolic link itself.
-s
    Create symbolic links instead of hard links. If the -s option is specified, the -L and -P options shall be silently ignored.

Таким образом, поскольку -iне является допустимой опцией для ln, команда ln /etc/setuid_script -iфактически создаст жесткую ссылку с именем -i, которая указывает на /etc/setuid_script. Затем команда PATH=.переопределяет переменную PATHдля поиска исполняемых файлов только в текущем каталоге, что теперь означает, что -iбудет выполнять файл с именем -iв текущем каталоге, который, поскольку он является жесткой ссылкой на /etc/setuid_script, вместо этого выполнит сценарий. Однако, поскольку это сценарий оболочки, фактический запуск команды будет /bin/sh -i.

3
28.07.2021, 11:25

Код ln /etc/setuid_script -iпредназначен для создания жесткой ссылки на файл с именем -iв текущем каталоге. Вам может понадобиться сказать ln -- /etc/setuid_script -i, чтобы это заработало, если вы используете инструменты GNU.

Оболочка может запускать команды тремя различными способами.

  1. Из строки. Используйте sh -c "mkdir /tmp/me"с флагом -c.
  2. Из файла. Используйтеsh filename
  3. С терминала используйте sh -iили sh.

Исторически сложилось так, что когда у вас есть сценарий оболочки с именем foo, начинающийся с #!/bin/sh, ядро ​​вызывает его с именем файла, то есть /bin/sh foo, чтобы указать ему использовать второй способ чтения команд. Если вы дадите ему имя файла -i, тогда ядро ​​вызовет /bin/sh -i, и вы получите третий способ.

Существуют также условия гонки. Это было использовано таким образом.

  1. Системный вызов execвызывается для запуска скрипта.
  2. Ядро видит, что файл имеет SUID, и соответствующим образом устанавливает разрешения процесса.
  3. Ядро читает первые несколько байтов файла, чтобы узнать, какой это исполняемый файл, находит #!/bin/shи видит, что это сценарий для /bin/sh.
  4. Злоумышленник подменяет сценарий.
  5. Ядро заменяет текущий процесс на /bin/sh.
  6. /bin/sh открывает имя файла и выполняет команды.

Это классический TOCTTOU (время проверки на время использования)атака. Проверка на шаге 2 выполняется в отношении файла, отличного от того, который использовался (в открытом вызове )на шаге 6.

Обе эти ошибки обычно исправляются в наши дни.

5
28.07.2021, 11:25

Теги

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