/proc/를 읽는 방법/fd 디렉토리의 어떤 프로세스에 Linux 기능이 있습니까?

/proc/를 읽는 방법/fd 디렉토리의 어떤 프로세스에 Linux 기능이 있습니까?

루트가 아닌 사용자로서 프로세스를 실행하고 있습니다. 프로세스 바이너리에는 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) 기능이 있으면 이 작업을 수행할 수 있습니다.

관련 정보