2

Я на OSX 10.8.

Перед моим экспериментом это так:

Nathan-der-Graue:~ max$ ls -l /bin/bash
-r-xr-xr-x  1 root  wheel  1333920 17 Feb 15:22 /bin/bash

Тогда я бегу

Nathan-der-Graue:~ max$ sudo chmod +s /bin/bash

Я ожидал, что это заставит bash всегда выступать в качестве корневой оболочки, но, похоже, это ничего не изменило в поведении bash:

Nathan-der-Graue:~ max$ /bin/bash
bash-3.2$ whoami
max

Я знаю, что это не очень хорошая идея. Где моя ошибка? Думаю, я неправильно понял флаг +s.

2 ответа2

3

Это не работает, потому что bash явно проверяет случай "запущенного setuid" и устанавливает свой EUID таким же, как RUID - другими словами, он отбрасывает все привилегии, которые он мог получить от бита setuid.


Процессы имеют несколько отдельных UID - два основных - это RUID (реальный UID, часто просто "UID"), который определяет, кому принадлежит процесс, и EUID (эффективный UID), который определяет привилегии, которыми обладает процесс.

Когда EUID равен 0 (root), процесс может установить любой RUID или EUID, который он хочет; и если у процесса нет корневых привилегий, он все равно может установить свой RUID таким же, как EUID, или наоборот.

Когда бит setuid установлен, он влияет только на EUID нового процесса, а не на RUID - другими словами, он дает только привилегии владельца файла, а не идентификацию. Попробуйте еще раз с /usr/bin/id .

-1

Если у вас есть права sudo , вы можете запустить

sudo -s

получить корневую оболочку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .