디렉토리를 보고 있는데 /proc
사용자가 소유자라고 표시되어 있어도 사용자로서 디렉토리를 나열할 수 없습니다.
왜 그리고 어떻게 이런 일이 발생합니까?
예를 들어, 이라고 ls -l /proc/2323/map_files
되어 있습니다 ls: reading directory '.': Permission denied
. 하지만 소유자는 분명히 사용자입니다. 사용자는 디렉토리에 CD를 넣을 수 있지만 ls
루트로는 가능하지 않습니다.
뒷이야기 추가:
현재 프로세스는 대문자를 제거하고 네임스페이스를 격리하기 위해 firejail(setuid 바이너리)을 사용하고 있습니다. Firejail이 없으면 모든 것이 예상대로 작동합니다. 즉, 사용자는 할 수 있지만 Firejail을 사용하면 사용자는 ls map_files
map_files 디렉토리를 사용할 수 없습니다 . 디렉토리는 사용자가 읽을 수 있고 .so 파일에 대한 심볼릭 링크인 파일에도 u+r이 표시되므로 이는 권한 문제가 아닙니다.ls
cd
답변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
여전히 cd
object 의 권한 플래그를 존중합니다 /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
해당 폴더에 쓸 수 있다는 의미입니다.