/proc/$PID의 파일(예: ssh-agent, Chrome)은 사용자에게 속하지 않고 루트에 속합니다.

/proc/$PID의 파일(예: ssh-agent, Chrome)은 사용자에게 속하지 않고 루트에 속합니다.

저는 여기서 또 다른 질문에 답하고 있습니다 :-), 한 번 살펴보세요 –구함어떤 소켓을 사용하는지 /proc/$PID/fd확인 하세요 . ssh-agent하지만 나는 못해. 대부분의 파일과 디렉터리가 루트 디렉터리에 속한다는 사실에 놀랐습니다. ssh-agent상위 프로세스와 마찬가지로 내 사용자로 실행되며 SUID 루트가 설치되어 있지 않습니다. KDE가 정확히 어디서 시작하는지 알 수 없습니다. 궁금해요. 여기서 무슨 일이 일어나고 있는지 말해 줄 수 있나요?

아니면 이것은 사용자와 전혀 관련이 없으며 프로세스가 일부 커널 마법을 사용하여 /proc공개(또는 동일한 사용자의 다른 프로세스)로부터 정보의 대부분을 숨길 수 있습니까?

/proc/$PID/fd방금 모든 프로세스를 확인한 결과 이 ssh-agent​​이상한 속성이 이 프로세스만 있는 것이 아니라는 것을 알았습니다. 다른 것들은 다수의 Chrome 프로세스입니다 kdesud(SUID 루트 바이너리도 없음).

답변1

[다음은 프로세스에 방금 추가한 텍스트를 수정한 것입니다.공정(5)매뉴얼 페이지는 이 질문에 답합니다. ]

다음 파일은 /proc/PID일반적으로 프로세스의 유효 사용자 및 유효 그룹 ID가 소유합니다. 그러나 보안 조치로 root:root프로세스의 "dumpable" 속성이 1이 아닌 값으로 설정된 경우 소유권이 부여됩니다. [이 속성의 기본값은 1입니다. 이 속성을 0으로 설정하면 중요한 정보가 포함될 수 있으므로 프로세스에서 코어 덤프를 생성하지 않습니다. 마찬가지로 특정 파일은 /proc/PID민감한 정보에 대한 액세스를 제공할 수 있습니다. ]

이 속성은 다음과 같은 이유로 변경될 수 있습니다.

  1. 이 속성은 action 을 통해 명시적으로 설정됩니다 prctl(2) PR_SET_DUMPABLE.
  2. 속성이 파일의 값으로 재설정되었습니다 /proc/sys/fs/suid_dumpable.

기본값은 /proc/sys/fs/suid_dumpable0입니다. 덤프 가능한 속성이 파일의 값으로 재설정될 수 있는 이유는 suid_dumpable다음과 같습니다.prctl(2)매뉴얼 페이지:

  • 프로세스의 유효 사용자 또는 그룹 ID가 변경되었습니다.
  • 프로세스의 파일 시스템 사용자 또는 그룹 ID가 변경되었습니다.
  • 프로세스는 set-user-ID 또는 set-group-ID 프로그램이나 해당 기능이 있는 프로그램을 실행합니다.

답변2

chrome-sandbox크롬의 경우 suid 비트가 있어서 루트 권한으로 실행되기 때문입니다 .

귀하의 질문에 대해서는 ssh-agent잘 모르겠지만 제 경우에는 /usr/bin/ssh-agentsuid 비트가 설정되었습니다. 즉, 루트 항목이 의미가 있습니다. kde가 ssh-agent를 어떻게 처리하는지 모르지만 suid 도우미가 관련되어 있다는 것은 확실합니다.

일반적으로 말하자면, 마법 같은 것은 없습니다. 일반적으로 프로그램은 suid 비트를 갖고 이를 명시적으로 지정 CAPABILITIES하거나 외부 도우미 프로그램을 직접 실행하거나 이와 유사한 방식으로 사용해야 합니다 polkit.

ps이러한 프로그램은 루트로 실행되지만 권한을 포기하므로 ​​사용자로 실행되지만 파일은 여전히 ​​suid 비트 소유자가 소유하는 것을 볼 수 있습니다 .

답변3

디스플레이 관리자(lightdm, openbox 등)는 init의 하위 항목이며 루트가 소유합니다. Init는 매우 특별한 프로세스이고 방금 uid 0으로 시작되었기 때문에 set-uid가 아닙니다. 이 명령은 ps -eaH원점의 구조화된 보기를 제공하며 관련 비트는 다음과 같습니다.

r    1 ?        00:00:00 init
r 1521 ?        00:00:00   lightdm
r 1531 tty7     00:00:12     Xorg
m 2035 ?        00:00:00     lightdm
m 2177 ?        00:00:00       gnome-session
m 2225 ?        00:00:00         ssh-agent

프로세스 소유자(Root 또는 Me)를 앞에 추가했습니다. /proc는 실제 파일 시스템은 아니지만 내부 커널 구조에 대한 파일과 같은 액세스를 제공하며 커널은 적절하다고 판단되는 모든 권한을 설정할 수 있습니다. 2035에는 실제적이고 유효한 UID가 있지만 /proc/2035의 항목은 루트가 소유하고 /proc/2035/fd에는 0700(-rx------) 권한이 있습니다. 2177에 도달할 때까지 proc에 더미 파일이 없습니다. 2177의 PPID가 UID 루트가 아니기 때문입니다.

왜? 루트 프로그램에 의해 생성된 경우 내 파일 중 일부로 인해 시스템 보안을 이용할 수 있기 때문입니다. 예전에는 그렇지 않았는데/proc/sys/fs/protected_hardlinks 아래의 proc(5) man 주석:

이 파일의 기본값은 0입니다. 이 값을 1로 설정하면 /tmp와 같이 누구나 쓸 수 있는 디렉터리에서 가장 흔히 발생하는 하드 링크 기반 검사 시간, 사용 시간 경합으로 인해 발생하는 오랜 보안 문제를 방지할 수 있습니다. 이 결함을 악용하는 일반적인 방법은 주어진 하드 링크를 따라갈 때 권한 경계를 넘는 것입니다(즉, 루트 프로세스가 다른 사용자가 만든 하드 링크를 따라갑니다). 또한 별도의 파티션이 없는 시스템에서는 권한이 없는 사용자가 취약한 set-user-ID 및 set-group-ID 파일을 "고정"하여 관리자가 특수 파일을 에스컬레이션하거나 링크하는 것을 방지합니다.

이 기사에서는 /proc/fd 공격 벡터가 악용될 수 있는 이유를 정확히 설명하지는 않지만 커널/fs/proc에 있는 수천 줄의 코드보다 더 나은 느낌을 줍니다.

답변4

/proc는 특별한 의사 파일 시스템입니다. 에서 proc(5)( man 5 proc):

   The proc file system is a pseudo-file system which is used as an inter-
   face to kernel data structures.  It is commonly mounted at /proc.  Most
   of  it  is  read-only,  but  some  files  allow  kernel variables to be
   changed.

설명을 보려면 전체 매뉴얼 페이지를 읽는 것이 좋습니다.

관련 정보