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를 가진 프로세스가 "대상 프로세스"입니다.) 알고리즘은 다음과 같습니다.(...)
- 대상 프로세스의 "dumpable" 특성에 1(...) 이외의 값이 있고 호출자가
CAP_SYS_PTRACE
대상 프로세스의 사용자 네임스페이스에 해당 기능을 갖고 있지 않으면 액세스가 거부됩니다.