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

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

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

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

예를 들어, 이라고 ls -l /proc/2323/map_files되어 있습니다 ls: reading directory '.': Permission denied. 하지만 소유자는 분명히 사용자입니다. 사용자는 디렉토리에 CD를 넣을 수 있지만 ls루트로는 가능하지 않습니다.

뒷이야기 추가:

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

답변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그것은 작동하는 방식이 아닙니다. 커널은 /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+r및 )할 수 있습니다 o+x. 물론 항상 합격할 수는 있지만뿌리권한 플래그를 무시하는 사람

디렉터리와 /proc디렉터리 내의 파일은 프로세스, 스레드 및 공유 메모리 개체를 나타냅니다. 해당 권한은 스레드/공유 메모리를 생성할 때 애플리케이션에 의해 설정됩니다. 따라서 도구에 응답하지 않으며 chmod권한을 변경하려고 시도하는 것은 실행 중인 애플리케이션을 중단시키는 확실한 방법입니다. 하지만 ls여전히 cdobject 의 권한 플래그를 존중합니다 /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해당 폴더에 쓸 수 있다는 의미입니다.

관련 정보