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