Esto también sucede en Fed 28 cuando se ejecuta su desde la terminal de un usuario. Ejecutar "su -" no producirá este problema.
Hay un fragmento de código idéntico en /etc/bashrc y /etc/profile.d/vte.sh para probar el env. y configurando COMANDO INDICADOR _. Jugar con el código revela que es el primero el que se está ejecutando.
execveat
обрабатывается do_open_execat
, который указывает, что он хочет иметь возможность открыть целевой файл для выполнения. Процедура открытия файла обрабатывается черезdo_filp_open
иpath_openat
с процессом обхода пути -, который задокументирован отдельно . Результатом всего этого, независимо от того, как запускается процесс, являетсяstruct file
и связанный с ним struct inode
, в котором хранится режим файла и, при необходимости, ссылка на ACL. Структура данных индексного дескриптора является общей для всех описаний файлов, которые ссылаются на один и тот же индексный дескриптор.
Ядро гарантирует, что информация об индексных дескрипторах в памяти соответствует дате от -до -при извлечении. Это может поддерживаться в кэшах dentry и inode в некоторых случаях (в локальных файловых системах, в частности в ext4, ext3, XFS и btrfs ), в других это будет включать некоторые операции ввода-вывода (, в частности, через сеть ).
Сама проверка разрешений выполняется чуть позже с помощьюbprm_fill_uid
; при этом учитываются текущие разрешения на inode и текущие привилегии вызывающего пользователя.
Как обсуждалось ранее , разрешения проверяются только при открытии, сопоставлении или изменении его метаданных, а не при чтении или записи; поэтому файловые дескрипторы могут передаваться между процессами без новых проверок разрешений.
What kind of permissions are recorded in open file description, does it contain a full ACL
Нет. В «описании открытого файла»(struct file
)не хранятся никакие «разрешения», кроме режимов доступа к файлу и флагов состояния файла, которые можно получить с помощью fcntl(F_GETFL)
или через /proc/PID/fdinfo/FD
. Все права доступа к файлам хранятся в struct inode
, на которые ссылается оттуда (и которые совместно используются всеми процессами/пользователями, у которых открыт этот конкретный файл ). struct file
также содержит ссылку на учетные данные открывателя.
will that receiver process be able to read/write/execute the file through the fd?
Если вы спрашиваете о execveat(fd, "", av, env, AT_EMPTY_PATH)
, который использует только дескриптор файла в качестве указателя на индексный дескриптор, и все будет проверено так же, как если бы указанный файл был выполнен по его пути. Флаги fd
не имеют значения; дескриптор файла может быть непрозрачным дескриптором, открытым сO_PATH
(чем-то, что преуспеет с любым файлом, доступным по некоторому пути ).