flapenguin.me

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 именно в pinghttps://www.opennet.ru/opennews/art.shtml?num=58232)

    Можно было бы написать демонов passwdd и pingd и общаться с ним по какому-нибудь сокету, но это банально сложнее.

    Мне фича всегда казалась плохо спроектированным грязным хаком и зияющей дырой в безопасности. Но хак хорош. Настолько хорош, что у Денниса Ритчи даже был на него патент.

    Ах да, монтируй только проверенные харды без nosuid'а.