루트가 아닌 사용자로서 프로세스를 실행하고 있습니다. 프로세스 바이너리에는 cap_sys_resource 기능이 부여되었습니다. 동일한 사용자가 프로세스를 소유하더라도 해당 사용자는 해당 /proc//fd 디렉터리를 읽을 수 없습니다. /proc/pid의 권한은 다음과 같습니다.
dr-xr-xr-x. 9 ec2-user ec2-user 0 May 12 01:03 .
dr-xr-xr-x. 249 root root 0 Apr 3 13:34 ..
dr-xr-xr-x. 2 ec2-user ec2-user 0 May 12 01:03 attr
-rw-r--r--. 1 root root 0 May 12 01:04 autogroup
-r--------. 1 root root 0 May 12 01:03 auxv
-r--r--r--. 1 root root 0 May 12 01:04 cgroup
--w-------. 1 root root 0 May 12 01:04 clear_refs
-r--r--r--. 1 root root 0 May 12 01:03 cmdline
-rw-r--r--. 1 root root 0 May 12 01:04 comm
-rw-r--r--. 1 root root 0 May 12 01:04 coredump_filter
-r--r--r--. 1 root root 0 May 12 01:04 cpuset
lrwxrwxrwx. 1 root root 0 May 12 01:04 cwd
-r--------. 1 root root 0 May 12 01:04 environ
lrwxrwxrwx. 1 root root 0 May 12 01:04 exe
dr-x------. 2 root root 0 May 12 01:03 fd
dr-x------. 2 root root 0 May 12 01:04 fdinfo
-rw-r--r--. 1 root root 0 May 12 01:04 gid_map
-r--------. 1 root root 0 May 12 01:04 io
-r--r--r--. 1 root root 0 May 12 01:04 limits
-rw-r--r--. 1 root root 0 May 12 01:04 loginuid
dr-x------. 2 root root 0 May 12 01:04 map_files
-r--r--r--. 1 root root 0 May 12 01:04 maps
-rw-------. 1 root root 0 May 12 01:04 mem
-r--r--r--. 1 root root 0 May 12 01:04 mountinfo
-r--r--r--. 1 root root 0 May 12 01:04 mounts
-r--------. 1 root root 0 May 12 01:04 mountstats
dr-xr-xr-x. 5 ec2-user ec2-user 0 May 12 01:04 net
dr-x--x--x. 2 root root 0 May 12 01:03 ns
-r--r--r--. 1 root root 0 May 12 01:04 numa_maps
-rw-r--r--. 1 root root 0 May 12 01:04 oom_adj
-r--r--r--. 1 root root 0 May 12 01:04 oom_score
-rw-r--r--. 1 root root 0 May 12 01:04 oom_score_adj
-r--r--r--. 1 root root 0 May 12 01:04 pagemap
-r--r--r--. 1 root root 0 May 12 01:04 personality
-rw-r--r--. 1 root root 0 May 12 01:04 projid_map
lrwxrwxrwx. 1 root root 0 May 12 01:04 root
-rw-r--r--. 1 root root 0 May 12 01:04 sched
-r--r--r--. 1 root root 0 May 12 01:04 schedstat
-r--r--r--. 1 root root 0 May 12 01:04 sessionid
-rw-r--r--. 1 root root 0 May 12 01:04 setgroups
-r--r--r--. 1 root root 0 May 12 01:04 smaps
-r--r--r--. 1 root root 0 May 12 01:04 stack
-r--r--r--. 1 root root 0 May 12 01:03 stat
-r--r--r--. 1 root root 0 May 12 01:03 statm
-r--r--r--. 1 root root 0 May 12 01:03 status
-r--r--r--. 1 root root 0 May 12 01:04 syscall
dr-xr-xr-x. 3 ec2-user ec2-user 0 May 12 01:03 task
-r--r--r--. 1 root root 0 May 12 01:04 timers
-rw-r--r--. 1 root root 0 May 12 01:04 uid_map
-r--r--r--. 1 root root 0 May 12 01:04 wchan
루트 사용자를 사용하지 않고 /proc//fd 디렉토리를 읽을 수 있는 방법이 있습니까?
답변1
기술적으로는 이를 허용하는 방법이 있습니다. 대부분의 상황에서 실용적이거나 유용한지 잘 모르겠습니다.
호출하려는 프로그램을 수정할 수 있습니다 prctl(PR_SET_DUMPABLE, 1, ...)
. 이는 대상 프로그램이 비밀번호 파일과 같은 보다 민감한 정보에 액세스하는 기능을 사용하는 경우 위험할 수 있습니다. 이 위험은 귀하의 경우에는 적용되지 않습니다. CAP_SYS_RESOURCE 함수만 사용하기 때문에 해당 함수는 프로그램이 다른 함수보다 더 많은 정보에 액세스하는 것을 허용하지 않습니다.
문제 1: 디렉터리는 소유자( ) /proc/[pid]/fd/
만 액세스할 수 있기 때문에 해당 디렉터리에 대한 액세스가 거부된 것으로 확인되었습니다 . 이 때문입니다:r-x------
root
http://man7.org/linux/man-pages/man5/proc.5.html
각 /proc/[pid] 디렉토리의 파일은 일반적으로 프로세스의 유효 사용자 및 유효 그룹 ID가 소유합니다. 그러나 보안 조치로 프로세스의 "dumpable" 속성이 1이 아닌 값으로 설정된 경우 소유권은 root:root로 설정됩니다.
[...]
프로세스의 "덤프 가능" 속성은 다음과 같은 이유로 변경될 수 있습니다.
이 속성은 prctl(2) PR_SET_DUMPABLE 작업을 통해 명시적으로 설정됩니다.
prctl(2)에 설명된 이유로 이 속성은 /proc/sys/fs/suid_dumpable 파일의 값으로 재설정되었습니다(아래 설명).
http://man7.org/linux/man-pages/man2/prctl.2.html
PR_SET_DUMPABLE (리눅스 2.3.20부터)
기본 동작이 코어 덤프를 생성하는 신호가 전달될 때 호출 프로세스에 대해 코어 덤프가 생성되는지 여부를 결정하는 "dumpable" 플래그의 상태를 설정합니다.
[...] (proc(5)의 /proc/sys/fs/suid_dumpable에 대한 설명도 참조하십시오.)
일반적으로 이 플래그는 1로 설정됩니다. 그러나 다음 조건에서는 /proc/sys/fs/suid_dumpable 파일에 포함된 현재 값(기본값은 0)으로 재설정됩니다.
프로세스의 유효 사용자 또는 그룹 ID가 변경되었습니다.
프로세스의 파일 시스템 사용자 또는 그룹 ID가 변경되었습니다(자격 증명(7) 참조).
이 프로세스는 설정된 사용자 ID 또는 그룹 ID 설정 프로그램을 실행(execve(2))하여 유효 사용자 ID 또는 유효 그룹 ID를 변경합니다.
프로세스는 파일 기능을 가진 프로그램을 실행(execve(2))합니다.(능력(7) 참조), 그러나 획득한 허용 능력이 프로세스에서 이미 허용한 능력을 초과하는 경우에만 해당됩니다.
문제 2: 단순히 나열할 수 있다는 것 /proc/[pid]/fd/
자체는 그다지 유용하지 않습니다. 적어도 열린 파일이 무엇을 참조하는지 알고 싶으실 겁니다.
디렉토리와 그 안에 있는 파일에 대한 권한 후에 proc
매뉴얼 페이지에는 이 "덤프 가능" 플래그와 관련된 또 다른 보안 검사가 있음이 표시됩니다.
이 디렉토리의 심볼릭 링크를 역참조하거나 읽을 수 있는 권한(readlink(2))은 ptrace 액세스 모드 PTRACE_MODE_READ_FSCREDS 검사로 제어됩니다. ptrace(2)를 참조하세요.
http://man7.org/linux/man-pages/man2/ptrace.2.html
대상 프로세스의 "dumpable" 속성이 1(SUID_DUMP_USER, prctl(2)의 PR_SET_DUMPABLE에 대한 설명 참조)이 아닌 값을 갖고 호출자가 대상 프로세스의 사용자 네임스페이스에 CAP_SYS_PTRACE 기능을 갖고 있지 않으면 액세스가 거부됩니다.
따라서 문제 2를 우회하는 또 다른 방법은 CAP_SYS_PTRACE 기능이 있는 경우입니다. CAP_SYS_PTRACE를 사용하면 다른 프로세스를 제어할 수 있습니다. 이것이 실제 사용자보다 덜 강력할지 여부는 논쟁의 여지가 있습니다 root
.
또한 파일 권한인 문제 1을 우회해야 합니다. CAP_DAC_READ_SEARCH(또는 CAP_DAC_OVERRIDE) 기능이 있으면 이 작업을 수행할 수 있습니다.