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

От APUE

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

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

    3 Solutions collect form web for “Может ли процесс суперпользователя изменить реальный идентификатор пользователя и идентификатор группы процесса, не совпадая с данными в файле паролей?”

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

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

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

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

     setgid (54321); setuid (12345); 

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

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

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

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

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


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

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

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

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

    Linux и Unix - лучшая ОС в мире.