Может ли процесс суперпользователя изменить реальный идентификатор пользователя и идентификатор группы процесса, не совпадая с данными в файле паролей?

11

От APUE

Идентификатор реального пользователя и идентификатор реальной группы процесса определяют, кто мы на самом деле. Эти два поля взяты из нашей записи в файле паролей при входе в систему. Обычно эти значения не меняются во время сеанса входа в систему, хотя существуют и способы для суперпользователя, чтобы изменить их

Может ли процесс суперпользователя изменить реальный идентификатор пользователя и реальный идентификатор группы процесса, чтобы отношение между реальным идентификатором пользователя и реальным идентификатором группы не совпадало с теми, которые указаны в файле паролей? Например, если пользователь Timне является членом группы oceanпо файлу паролей, может ли суперпользовательский процесс изменить реальный идентификатор пользователя и реальный идентификатор группы процесса на Timи oceanсоответственно?

Тим
источник
5
Здесь есть одно важное пояснение: процесс, выполняющийся с привилегиями суперпользователя, может изменять свои собственные UID и GID, а не таковые для другого процесса.
Filbranden
База данных пользователя является исключительно пользовательской. Ядро заботится только о UID и GID, а не о базе данных пользователей или групп.
德里克 薯条 德里克

Ответы:

15

Да, процесс суперпользователя может изменить свой реальный идентификатор пользователя и реальный идентификатор группы на любое значение, которое он пожелает. Значения /etc/passwdи /etc/shadowявляются конфигурацией для того, какие значения должны быть установлены, но не ограничением возможных значений.

Редактировать # 1

Это означает, что программы вроде loginбудут читать значения из файлов, поэтому файлы являются файлами конфигурации или входными файлами. Они не являются ограничением того, что может сделать программа. Процесс суперпользователя может передать ядру любое значение, и ядро ​​не будет проверять какие-либо файлы.

Программа может позвонить

setgid (54321);
setuid (12345);

и это будет работать, даже если ни один из идентификаторов не упомянут ни в одном файле.

RalfFriedl
источник
9

Файл пароля и файл группы не читаются, они считываются только процессом входа в систему, чтобы установить реальный идентификатор пользователя и реальный идентификатор группы.

В ядре нет ничего, упоминающего эти файлы. Логин должен открыть файлы, обработать их и установить два идентификатора. Это может быть написано по-другому, чтобы получить эти идентификаторы откуда-то еще. Например, из сетевой базы данных.

Любой процесс с возможностью CAP_SETUID может установить эти идентификаторы, root имеет эту возможность.

Модель безопасности в Unix является частью, реализованной в ядре, и частью, реализованной в процессе, который работает с повышенными возможностями (например, с правами root).


Обратите внимание , что /etc/passwdи /etc/groupтакже читать ls, psи любую другую программу , которая должна переводить имена пользователей / групп в / из идентификаторов пользователей / групп. (Они могут сделать это через библиотеку, чем знают об альтернативных методах хранения этих деталей.)

Ctrl-Alt-Делор
источник
1
Они ( /etc/passwd, /etc/groups) также считываются процессами, которые хотят показывать или обрабатывать имена пользователей вместо внутренних числовых идентификаторов, например, psи ls.
Йонас Шефер
3

Помимо прочего, целью /etc/passwdявляется преобразование имени пользователя в UID пользователя . Если вам все равно, что такое UID Боба, вам не нужен этот файл. Если вы просто хотите изменить произвольный UID / GID, используйте соответствующие системные вызовы:

int setuid(uid_t uid);
int setgid(gid_t gid);

Обратите внимание , что привилегированный процесс с CAP_SETUIDи CAP_SETGID возможностями (которые процесс корня обычно имеет) может изменить только свой собственный UID и GID, не то другой запущенный процесс.

лес
источник