Использование setreuid(), где _POSIX_SAVED_IDS не установлен
Я изучаю область suid и не смог ответить на этот вопрос. Ради вопроса, давайте предположим, что двоичный файл программы является suid, принадлежит пользователю 1001 и запускается пользователем 1000 (оба не-root) - поэтому RUID=1000, EUID=1001.
когда _POSIX_SAVED_IDS
установлено, я могу использовать setuid()
а также seteuid()
чтобы изменить RUID и EUID (соответственно) между 1000 и 1001.
Однако когда _POSIX_SAVED_IDS
не установлен, seteuid(1000)
окажет делать seteuid(1001)
невозможно позже, и setuid(1001)
будет делать то же самое с setuid(1000)
позже.
Чтобы изменить EUID на RUID и сохранить возможность вернуться позже, решение, которое я нашел здесь Пример программы GNU Setuid, заключается в использовании setreuid(1001,1000)
(обменивая их). Как это влияет на программу, так как она меняет RUID? Насколько я понимаю, он меняет владельца процесса и, следовательно, влияет на разрешение убийства или взаимодействия с процессом.
Какие системы не используют _POSIX_SAVED_IDS?
1 ответ
Поскольку POSIX требует _POSIX_SAVED_IDS
Для определения положительного значения не должно быть недостатка в системах _POSIX_SAVED_IDS
,
Источник: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
Мне просто пришлось иметь дело с этим, и часть ниже не получила должного ответа.
Чтобы изменить EUID на RUID и сохранить возможность вернуться позже, решение, которое я нашел здесь, Пример программы GNU Setuid, заключается в использовании setreuid(1001,1000) (их замена). Как это влияет на программу, так как она меняет RUID? Насколько я понимаю, это меняет владельца процесса и, следовательно, влияет на разрешение убийства или взаимодействия с процессом.
что происходит везде, так это то, что EUID - это единственное, что используется для таких разрешений, как доступ к файлам или возможность убивать процессы (могут применяться некоторые редкие исключения). Идея в том, что вы можете переключаться между EUID и RUID, но только между ними. Ядро должно отслеживать эти два идентификатора.
seteuid
для пользователей без полномочий root разрешено переключаться только на один из EUID, RUID и - если ядро поддерживает это - SUID.
Если система соответствует POSIX, SUID доступен, поэтому это произойдет:
// uids are: EUID=1001, RUID=1000, SUID=1001
seteuid(1000) ; // works because RUID=1000
// uids are: EUID=1000, RUID=1000, SUID=1001
seteuid(1001); // works because SUID=1001
в системах без SUID:
// uids are: EUID=1001, RUID=1000
seteuid(1000); // works because RUID=1000
// uids are: EUID=1000, RUID=1000
seteuid(1001); // fails, neither EUID, nor RUID is 1001
наоборот
// uids are: EUID=1001, RUID=1000
setreuid(1001, 1000) ; // works because EUID=1001 and RUID=1000
// uids are: EUID=1000, RUID=1001
setreuid(1000, 1001); // works because EUID=1000 and RUID=1001
Я не нашел стандартного способа постоянного удаления привилегий в системе, соответствующей POSIX, так как для этого требовалось изменить SUID. доступно только расширение GNU:
// uids are: EUID=1001, RUID=1000, SUID=1001
setresuid(1000, 1000, 1000);
// uids are: EUID=1000, RUID=1000, SUID=1000
см.: https://people.eecs.berkeley.edu/~daw/papers/setuid-usenix02.pdf