사용자가 소유하지만 소유자가 읽을 수 없는 파일을 설정하는 방법은 무엇입니까?

사용자가 소유하지만 소유자가 읽을 수 없는 파일을 설정하는 방법은 무엇입니까?

디렉터리를 살펴보고 있는데 /proc, 사용자가 소유자라고 표시되어 있어도 사용자로서 디렉터리를 나열할 수 없습니다.

왜 그리고 어떻게 이런 일이 발생합니까?

예를 들어, ls -l /proc/2323/map_files거기에는 이라고 적혀 있습니다 ls: reading directory '.': Permission denied. 그러나 소유자는 분명히 사용자입니다. 사용자는 디렉토리에 CD를 넣을 수 있지만 ls. 루트로 이것을 하는 것은 괜찮습니다.

추가된 뒷이야기:

현재 프로세스는 setuid 바이너리인 firejail을 사용하여 대문자를 삭제하고 Firefox를 네임스페이스를 격리하고 있습니다. Firejail이 없으면 모든 것이 예상대로 작동합니다. 즉, 사용자는 할 수 있지만, ls map_filesFirejail을 사용하면 map_files 디렉토리를 ls사용자가 사용할 수 없습니다. 하지만 cd괜찮습니다. 디렉토리는 사용자가 읽을 수 있고 .so 파일에 대한 심볼릭 링크인 파일에도 u+r이 표시되므로 권한 문제는 아닙니다.

답변1

자신이 소유한 파일에서 읽기 권한을 제거하면 해당 파일을 더 이상 읽을 수 없게 됩니다.

$ echo hello >foo
$ chmod u=w,go+r foo
$ ls -l foo
--w-rw-r-- 1 gilles gilles 6 Oct 20 15:13 foo
$ cat foo
cat: foo: Permission denied

소유자는 언제든지 파일의 권한을 변경할 수 있으므로 이는 보안에 유용하지 않습니다. 이는 권한이 작동하는 방식의 결과일 뿐입니다.


그러나 이것은 에서 보고 있는 내용을 설명하지 않습니다 /proc. /proc다소 특별한 파일 시스템입니다. "일반적인" 파일 시스템에서는 프로세스가 파일을 열 때(또는 디렉토리를 나열하거나 심볼릭 링크의 대상을 읽을 때) 커널이 프로세스의 자격 증명(예: 실행 중인 사용자 등)을 확인하고 파일의 권한을 읽습니다. 자격 증명이 파일에 대한 액세스 권한을 부여하는지 확인합니다. 하지만 /proc이렇게는 작동하지 않습니다. 커널은 NET의 파일마다 다른 특정 검사를 적용합니다 /proc. 이와 별도로 프로세스가 디렉터리를 나열하면 커널은 파일을 열 때 수행되는 검사와 유사한 권한을 생성합니다.

특히, 프로세스가 상승된 자격 증명으로 실행 중이거나 실행되고 있는 경우(일반적으로setuid 또는 setgid, 일부 정보는 /proc더 이상 사용자가 액세스할 수 없으며 루트에서만 액세스할 수 있습니다. 이는 권한에 반영되지 않습니다. 예를 들어 setgid를 실행하는 프로세스를 생각해 보세요. 이 프로세스에는 /proc예상 사용자가 소유한 모든 파일이 있으며 권한은 권한이 없는 프로세스와 동일합니다. 그러나 프로세스가 추가 그룹 권한을 갖고 있는 동안 기밀 정보에 액세스했을 수 있으므로 커널은 더 이상 사용자가 이 정보를 추출할 수 있는 작업을 수행하는 것을 허용하지 않습니다. 예를 들어 /proc/$pid/cwd프로세스가 사용자가 일반적으로 액세스할 수 없는 디렉터리로 변경된 경우 사용자는 무엇을 가리키는지 볼 수 없습니다 . 사용자는 /proc/$pid/mem. 사용자는 /proc/$pid/map*기밀 정보가 반영된 경우 프로세스의 메모리 맵을 볼 수 없습니다 .ASLR효과적인). 등등.

답변2

사용자가 소유하지만 동일한 사용자가 읽을 수 없는 파일을 설정하는 것은 실제로 매우 쉽습니다.

chmod u-r file

그렇게 하는 경우 파일을 읽는 유일한 방법은 권한을 높이거나 읽기 플래그를 다시 반환하는 것입니다( u+r).

디렉토리에도 마찬가지입니다. 사용자 읽기 플래그를 제거하면 디렉토리 소유자는 ls이를 수행할 수 없습니다. 디렉터리( u-x)에서 실행 가능 플래그를 제거하면 소유자는 cd해당 디렉터리에 대한 권한을 잃게 됩니다.

동시에 - 이 파일과 디렉토리는 다른 사람( o+ro+x)이 액세스할 수 있습니다. 물론 그들은 항상 다음을 통해 접근할 수 있습니다.뿌리허가 플래그를 무시하는 사람.

디렉토리와 /proc디렉토리의 파일은 프로세스, 스레드, 공유 메모리 개체를 나타냅니다. 해당 권한은 스레드/공유 메모리를 생성할 때 애플리케이션에 의해 설정됩니다. 따라서 도구에 응답하지 않으며 chmod권한 변경을 시도하는 것은 실행 중인 응용 프로그램을 중단시키는 확실한 방법입니다. 그러나 ls여전히 cd의 개체에 대한 권한 플래그를 준수합니다 /proc. 그러므로 거기에서 정말로 뭔가를 읽어야 한다면, 당신은 자신을 다음 수준으로 끌어 올려야 합니다.뿌리.

답변3

사용자 권한으로 인해 발생합니다.

예:

[~] whoami
mm
[~] mkdir test
[~] echo "Hello World" > test/hello.txt
[~] ls -ld test
drwxr-xr-x 2 mm mm 4,0K 20. Okt 14:20 test
[~] chmod 111 test
[~] ls -ld test
d--x--x--x 2 mm mm 4,0K 20. Okt 14:20 test
[~] ls test
ls: cannot open directory 'test': Permission denied
[~, ERR:2] cat test/hello.txt
Hello World
[~] chmod 555 test
[~] ls -ld test
dr-xr-xr-x 2 mm mm 4,0K 20. Okt 14:20 test
[~] ls test
hello.txt

폴더 권한은 파일 권한과 다릅니다. 이는 x폴더에 액세스할 수 있지만 폴더를 살펴볼 수는 없음을 의미합니다. 해당 폴더를 살펴보려면 필요합니다 r. 그리고 원인은 w해당 폴더에 쓸 수 있다는 것을 의미합니다.

관련 정보