이 테스트 코드를 작성해 본 결과, 실행 시 읽기 권한이 취소되어도 이 프로그램은 항상 파일을 성공적으로 읽을 수 있다는 사실을 발견했습니다 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 특정 권한에 대해 잘 모르겠습니다.