Linux에서 파일 설명자 권한을 확인하는 방법은 무엇입니까?

Linux에서 파일 설명자 권한을 확인하는 방법은 무엇입니까?

프로세스가 fd를 성공적으로 사용하면 open(flags=O_RDWR)fd가 닫히지 않는 한(로컬 파일 시스템의 일반 파일) 다른 프로세스가 chmod를 사용하여 해당 프로세스의 읽기/쓰기 권한을 취소하더라도 파일을 읽고 쓸 수 있습니다. 사용자.Linux 커널은 inode에서 파일 권한을 확인하거나 파일 설명을 열 수 있습니까?그러나 프로세스가 를 사용하여 파일을 실행하려고 하면 execveat커널이 x 비트 및 suid 비트 권한을 확인하기 위해 디스크를 읽습니까? 열린 파일 설명에는 어떤 권한이 문서화되어 있습니까? 다른 모든 작업( execveat, 등) fchdirfchmod디스크 정보를 확인할 수 있도록 전체 ACL 또는 단순 읽기/쓰기 비트가 포함되어 있습니까?

디스크 파일 시스템 정보에 따라 fsuid에 파일 읽기/쓰기/실행 비트가 없는 다른 프로세스로 이 fd를 전송하면 수신 프로세스가 fd를 통해 파일을 읽고/쓰기/실행할 수 있습니까?

답변1

execveat에 의해 처리됨do_open_execat, 이는 다음을 수행할 수 있기를 원함을 지정합니다.대상 파일 열기실행을 위해. 파일 오프너 처리통과하다 do_filp_open그리고path_openat, 기록된 경로 걷기 과정 포함각기. 과정이 어떻게 시작되든, 이 모든 것의 결과는struct file그리고 관련struct inode파일의 모드와 ACL이 가리키는 항목(관련된 경우)을 저장합니다. inode 데이터 구조는 동일한 inode를 참조하는 모든 파일 설명에서 공유됩니다.

커널은 검색 시 메모리 내 inode 정보가 최신 상태인지 확인합니다. 일부 경우(특히 로컬 파일 시스템, ext4, ext3, XFS 및 btrfs) 이는 dentry 및 inode 캐시에서 유지 관리될 수 있지만 다른 경우에는 일부 I/O(특히 네트워크를 통한)가 포함됩니다.

권한 확인 자체는 나중에 수행됩니다.bprm_fill_uid;이것은 inode에 대한 현재 권한과 호출 사용자의 현재 권한을 고려합니다.

논의전에, 권한은 파일을 읽거나 쓸 때가 아니라 파일이 열리거나 매핑되거나 해당 메타데이터가 변경될 때만 확인됩니다. 따라서 파일 설명자는 새로운 권한 확인 없이 프로세스 간에 전달될 수 있습니다.

답변2

열린 파일 설명에 기록되는 권한 및 완전한 ACL이 포함되어 있는지 여부

struct file습관. 또는 를 통해 검색할 수 fcntl(F_GETFL)있는 파일 액세스 모드 및 파일 상태 플래그 외에는 파일 열기 설명( )에 "권한"이 보존되지 않습니다 /proc/PID/fdinfo/FD. 모든 파일 권한은 struct inode거기에서 참조되는 파일에 저장됩니다(그리고 해당 특정 파일을 여는 모든 프로세스/사용자 간에 공유됩니다). A는 struct file또한 개시자의 자격 증명에 대한 참조를 저장합니다.

수신 프로세스가 fd를 통해 파일을 읽고/쓰고/실행할 수 있습니까?

execveat(fd, "", av, env, AT_EMPTY_PATH)파일 설명자를 inode에 대한 포인터로 사용하는 것에 대해 묻는 경우모든 것참조된 파일이 해당 경로를 통해 실행된 것처럼 검사가 수행됩니다. 플래그는 fd전혀 중요하지 않습니다. 파일 설명자는 O_PATH다음과 같이 열리는 불투명 핸들일 수 있습니다.성공할 것이다모든 파일은 경로를 통해 액세스할 수 있습니다.

관련 정보