Не можете отбросить привилегии с помощью 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,

Другие вопросы по тегам