Использование 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

Другие вопросы по тегам