setuid - получаем root
Оригинал https://t.me/bits_and_bicycles/12
Я рассказывал, что у процесса есть точно такие же числа uid/gid, как у файлов. И то, что когда процесс пытается получить доступ к файлу, эти числа сраниваются.
Но иногда оно работает в обратную сторону. Когда процесс делает execve
файла, ядро может взять его uid/gid и запустить процесс с ними.
Фича эта называется setuid
(чтобы было не скучно и ты путал её с setuid(2)
при каждом случае). Аналогично есть setgid
. Включается проставлением флага на файле через chmod: fchmod(fd, S_ISUID)
(только не забудь чекнуть свои привелегии).
Это единственный способ поднять привелегии процесса. Без него если кто-то из родителей процесса добровольно отдал root, то больше процесс больше никак не может позвать setuid(2)
. А бывает нужно.
Иногда тупо нужно запустить что-то от имени другого пользователя. Ну, через su
или sudo
. Запускаешь такую программу, она насильно запускается от root'а, читает закрытый от всех /etc/sudoers
и понимает, можно тебе запускать команду, или нет. Если да, то по максимуму сбрасывает окружение (а то мало ли ты LD_PRELOAD передал) и вперёд.
Бывает, логически у тебя должен быть доступ, но данные уже хранятся в таком виде, что доступ туда есть только у root'а. Например, ты хочешь поменять пароль, а он лежит в /etc/shadow
, куда у тебя, очевидно, нет доступа. Приходится звать passwd
с setuid'ом. Он не только проследит, что ты меняешь только свой пароль, но и проверит его на всякие политики безопасности (так что отдельные файлики /etc/users/:uid/password
не сработают, увы).
Другой классический пример: ping
. Рядовому пользователю нельзя слать по сети произвольные байты. ping
занимается плюс-минус этим, поэтому запустится от root’а, параноидально сделает свои дела и завершится. (К слову, во FreeBSD только что нашли RCE именно в ping
'е https://www.opennet.ru/opennews/art.shtml?num=58232)
Можно было бы написать демонов passwdd
и pingd
и общаться с ним по какому-нибудь сокету, но это банально сложнее.
Мне фича всегда казалась плохо спроектированным грязным хаком и зияющей дырой в безопасности. Но хак хорош. Настолько хорош, что у Денниса Ритчи даже был на него патент.
Ах да, монтируй только проверенные харды без nosuid
'а.