flapenguin.me

euid - от кого запустили sudo

|

    Оригинал https://t.me/bits_and_bicycles/20

    Уже достаточно давно я разбирал как запускать всякое от root’а через setuid флажки.

    Сегодня расскажу про вторую половинку этого механизма. Без которой ничего, на самом деле, не заведётся.

    Потому что мало просто выбросить свою старую идентичность и стать root’ом. sudo нужно знать от кого его запустили, иначе как он будет свой /etc/sudoers читать. А ping было бы неплохо иметь возможность SIGSTOP’нуть или SIGKILL’нуть не из под root’а.

    Никакой сложной системы тут нет и решение проблемы поистине дубовое. Старая идентичность при запуске setuid бинарников не выбрасывается, а перекладывается в соседние поля процесса.

    sudo знает кто его запустил из saved user id и saved group id.

    Ядро знает, кому можно kill’ять ping из real user id и real group id.

    Поля эти есть у каждого процесса и у них даже есть описание в man 7 capabilities. Оно старательно пытается выглядеть не как ой-нам-тут-надо-было-прокинуть-получилось-как-получилось, но костыли за широкими мануалами не спрячешь.

    Тем не менее: - euid Effective User ID — это про проверки unix permission в ядре (то, что делает root’а root’ом) - suid Saved User ID — это способ сообщить setuid процесс’у от чьего имени его запустили - ruid Real User ID — это разрешение процессам с таким же uid посылать любые сигналы

    Посмотреть на всё это добро можно через procfs. Дока последнего говорит, что они лежат в /proc/1337/status в таком формате

    Uid | Real, effective, saved set, and file system UIDs
    Gid | Real, effective, saved set, and file system GIDs