prctl(PR_SET_DUMPABLE, 0); 이후에는 심볼릭 링크를 읽을 수 없게 됩니다.

prctl(PR_SET_DUMPABLE, 0); 이후에는 심볼릭 링크를 읽을 수 없게 됩니다.

kcheckpass아래에서 디버깅 했습니다 Archlinux. (로그인에 실패해서요 kcheckpass)

어쨌든 나는 이 특별한 문제가 존재하지 않는다고 믿습니다 kcheckpass.

int
main(int argc, char **argv)
{
#ifdef HAVE_PAM
  const char    *caller = KSCREENSAVER_PAM_SERVICE;
#endif
  const char    *method = "classic";
  const char    *username = 0;
#ifdef ACCEPT_ENV
  char      *p;
#endif
  struct passwd *pw;
  int       c, nfd, lfd;
  uid_t     uid;
  time_t    nexttime;
  AuthReturn    ret;
  struct flock lk;
  char fname[64], fcont[64];

  // disable ptrace on kcheckpass
#if HAVE_PR_SET_DUMPABLE
  prctl(PR_SET_DUMPABLE, 0);

첫 번째 줄을 실행하기 전에:prctl(PR_SET_DUMPABLE, 0);

ls /proc/$(pidof kcheckpass)/exe  -al
lrwxrwxrwx 1 wuyihao wuyihao 0 Jan 16 16:16 /proc/31661/exe -> /cker/src/build/kcheckpass/kcheckpass

실행 후:

ls /proc/$(pidof kcheckpass)/exe  -al
ls: cannot read symbolic link '/proc/31661/exe': Permission denied

/proc/31661/root와 동일/proc/31661/cwd

coredump읽기 권한 사이에 어떤 연관성도 보이지 않습니다/proc/$PID/exe

고쳐 쓰다

문제를 재현하는 최소 예:

#include <sys/prctl.h>
#include <stdio.h>
int main(){
    prctl(PR_SET_DUMPABLE, 0);
    return 0;
}

업데이트 2 kcheckpass최소한의 예 test는 다음과 같습니다:

-rwsr-xr-x 1 root root

답변1

덤프 가능 속성을 제거하면 /proc/<pid>/사용자가 소유한 파일 및 링크 묶음은 다른 프로세스에서 읽을 수 없습니다.

prctl맨페이지내용은 다음과 같습니다.

덤프할 수 없는 프로세스는 다음을 통해 연결할 수 없습니다. 트랙(2)PTRACE_ATTACH;참조트랙(2)더 알아보기.

프로세스를 덤프할 수 없으면 프로세스 /proc/[pid]디렉터리에 있는 파일의 소유권이 영향을 받습니다.공정(5).

그리고proc맨페이지내용은 다음과 같습니다.

/proc/[pid]

/proc/[pid]하위 디렉터리에는 아래 설명된 의사 파일과 디렉터리가 포함되어 있습니다. 이러한 파일은 일반적으로 프로세스의 유효 사용자 및 유효 그룹 ID가 소유합니다. 그러나 보안 조치로 프로세스의 "dumpable" 속성이 1이 아닌 값으로 설정된 경우 소유권은 root:root로 설정됩니다.

마침내,ptrace맨페이지내용은 다음과 같습니다.

ptrace 액세스 모드 확인

커널 사용자 공간 API( ptrace() 작업뿐만 아니라)의 다양한 부분에는 소위 "ptrace 액세스 모드" 검사가 필요하며, 그 결과에 따라 작업이 허용되는지(또는 어떤 경우에는 "읽기" 작업이 삭제된 데이터를 반환하게 되는지)가 결정됩니다. ) .

(...)

ptrace 액세스 모드 검사에 사용되는 알고리즘은 호출 프로세스가 대상 프로세스에서 해당 작업을 수행하도록 허용되는지 여부를 결정합니다. (열린 파일의 경우 /proc/[pid] "호출 프로세스"는 파일을 연 프로세스이고 해당 PID를 가진 프로세스가 "대상 프로세스"입니다.) 알고리즘은 다음과 같습니다.

(...)

  1. 대상 프로세스의 "dumpable" 특성에 1(...) 이외의 값이 있고 호출자가 CAP_SYS_PTRACE대상 프로세스의 사용자 네임스페이스에 해당 기능을 갖고 있지 않으면 액세스가 거부됩니다.

관련 정보