Linux 커널은 inode에서 파일 권한을 확인하거나 파일 설명을 열 수 있습니까?

Linux 커널은 inode에서 파일 권한을 확인하거나 파일 설명을 열 수 있습니까?

이 테스트 코드를 작성해 본 결과, 실행 시 읽기 권한이 취소되어도 이 프로그램은 항상 파일을 성공적으로 읽을 수 있다는 사실을 발견했습니다 getchar().

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/types.h> 
int main(){
    int f = open("a.txt",O_RDONLY);
    uint8_t data[200];
    printf("Got %d from read", pread(f, (void *)data, 200, 0));
    getchar();
    printf("Got %d from read", pread(f, (void *)data, 200, 0));
}

이 프로그램은 인쇄합니다

읽은 후 9점 획득

chmod a-r a.txt일시정지 중에 사용해 도 2번 .

나는 일반 사용자이고 내 프로세스에 CAP_DAC_OVERRIDE가 없다고 확신합니다. 두 번째 사용자는 왜 pread()오류를 반환하지 않습니까?

내 생각엔 읽기/쓰기 시 커널은 를 사용하여 생성된 열린 파일 설명에 대한 파일 권한만 확인 open()하고 기본 파일 시스템에서 파일 권한을 변경하더라도 변경되지 않는 것 같습니다.

내 추측이 맞나요?

추가 질문:

  • 내가 옳다면 mmaped 영역은 어떻습니까?

  • 매핑된 영역을 읽고/쓰고/실행할 때 커널은 페이지 테이블에 기록된 권한만 확인합니까?

  • 파일 시스템에 저장된 실제 inode 데이터는 열린 파일 설명과 mmap 영역을 생성할 때만 사용됩니까?

답변1

예, 권한은 열릴 때만 확인되고 기록됩니다. 따라서 파일에 쓸 수 있는지 여부에 관계없이 읽기 전용 액세스로 열린 파일 설명자에 쓸 수 없습니다.

커널은 파일 시스템에 저장된 inode가 아닌 메모리의 inode를 참조합니다. 열린 파일의 참조 횟수가 다르며 마운트 지점은 마운트된 파일의 inode를 가져옵니다.

내가 옳다면 mmaped 영역은 어떻습니까?

동일한. (에 전달된 PROT_* 플래그는 mmap()에 전달된 O_RDWR / O_RDONLY / O_WRONLY 플래그와 동일합니다 open()).

매핑된 영역을 읽고/쓰고/실행할 때 커널은 페이지 테이블에 기록된 권한만 확인합니까?

페이지 테이블에 있는 레코드의 권한을 언제 확인할 수 있는지 잘 모르겠습니다. :-). 내가 이해하는 한 귀하의 질문은 다음과 같습니다. 예.

파일 시스템에 저장된 실제 inode 데이터는 열린 파일 설명과 mmap 영역을 생성할 때만 사용됩니까?

mkdir()또한 O_CREAT 와 유사한 메타데이터 작업에 대한 inode 권한을 확인합니다 open().

chdir()그리고 이것은 어떤 통화와도 다르다는 점을 잊지 마십시오 open(). (또는 적어도 open()현재 Linux에서 호출되는 것과는 다릅니다).

SELinux 특정 권한에 대해 잘 모르겠습니다.

관련 정보