Не можете отбросить привилегии с помощью suid-файла?
Мне было интересно, есть ли способ отбросить привилегии, используя двоичный файл suid (используя Ubuntu 18.04). Посмотрите:
# cp /bin/bash .
# chown www-data bash
# chmod 4700 bash
# ls -lh
-rws------ 1 www-data root 1,1M abr 4 2018 bash
# ./bash
# id
uid=0(root) gid=0(root) groups=0(root)
Есть ли объяснение, почему можно получить привилегии, но не отбрасывать их с помощью suid-файлов?
Возможно, вам интересно, чего я пытаюсь достичь, но это только для обучения.
Спасибо!
2 ответа
Это работает в общем случае:
# cp /usr/bin/id .
# chown www-data id
# chmod 4700 id
# ./id
uid=0(root) gid=0(root) euid=33(www-data) groups=0(root)
bash
это особый случай. Из раздела "ПРИЗНАНИЕ" bash
руководство, с дополнительным акцентом на соответствующую часть:
Если оболочка запущена с эффективным идентификатором пользователя (группы), не равным реальному идентификатору пользователя (группы), и
-p
опция не указана, файлы запуска не читаются, функции оболочки не наследуются от среды,SHELLOPTS
,BASHOPTS
,CDPATH
, а такжеGLOBIGNORE
переменные, если они появляются в среде, игнорируются, и эффективный идентификатор пользователя устанавливается равным реальному идентификатору пользователя. Если-p
опция предоставляется при вызове, поведение при запуске такое же, но эффективный идентификатор пользователя не сбрасывается.
Проходя -p
(привилегированный) флаг действительно подавит это поведение:
# cp /bin/bash .
# chown www-data bash
# chmod 4700 bash
# ./bash -p
bash-4.4$ id
uid=0(root) gid=0(root) euid=33(www-data) groups=0(root)
Что касается set-uid, то здесь нет иерархии привилегий - она просто меняет эффективный ИД пользователя на владельца программы. Root ничем не отличается от любого другого пользователя.
То, что вы видите, является преднамеренным действием со стороны bash
, Есть много последствий для безопасности при запуске сценариев оболочки setuid, и bash не позволяет этого по умолчанию. когда bash
запускается, он проверяет, совпадает ли эффективный UID с реальным UID. Если нет, это означает, что запущен set-uid. Если это не выполняется одним из способов, где это разрешено, он вызывает функцию, такую как setuid()
чтобы вернуться к реальному UID.
Вот что здесь произошло. root
побежал bash
и ОС изменила эффективный UID на www-data
, bash
обнаружил это и изменил обратно root
,