2012-04-15 2 views
1

왜 r00t_가 아닌 root로 실행해야합니까?ptrace PTRACE_ATTACH 실패 - 사용자 소유 프로세스의 Linux 사용 권한

// main() 
scan.scanProcessOffset(10838, 0x7f8c14000000); // proper pid and offset 

void MemoryMapper::scanProcessOffset(unsigned int procId, unsigned long long offset) 
{ 
    long attach = ptrace(PTRACE_ATTACH, procId, NULL, NULL); 
    cout << attach << endl << errno << endl; 

    long memory = ptrace(PTRACE_PEEKDATA, procId, offset); 
    if (memory == -1 && errno == 3) 
    { 
     cout << errno << endl; 
     errno = 0; 
    } 

    cout << memory; 
} 

당신은 내가 루트로 실행 r00t_

[email protected]:/proc/10838$ ls -l 
lrwxrwxrwx 1 r00t r00t_ 0 2012-04-15 08:21 exe -> /usr/bin/gedit 
-rw------- 1 r00t r00t_ 0 2012-04-15 09:04 mem 

출력 하지가 소유에 접선 해요 과정에서 볼 수 있듯이 root로

[email protected]:~/memedit$ ./a.out 
-1 
1 
3 
-1 

출력 :

[email protected]:~/memedit$ sudo ./a.out 
0 
0 
140239607693344 

내가 첨부하려는 프로세스의 소유자 인 이유는 무엇입니까?

+0

우분투를 사용하고 있습니까? –

+0

예 우분투를 사용하고 있습니다. 11.10 –

답변

4

일부 응용 프로그램은 특히 PTRACE_ATTACH (예를 들어, SSH 에이전트)을 허용하지 prctl()를 사용 Yama에서 구현보다 일반적인 솔루션은 자식 프로세스에 부모로부터 직접 ptrace을 허용하는 동안 (즉, 직접 gdbstrace 여전히 작동) 또는 루트 사용자 (즉, gdb BIN PIDstrace -p PID은 여전히 ​​루트로 작동합니다). 로컬 앱이 손상된 경우 공격자는 다른 프로세스에 연결하여 메모리 및 실행 상태를 검사 할 수 없습니다.

이 동작은 /proc/sys/kernel/yama/ptrace_scope sysctl 값을 통해 제어됩니다. 자식이 아닌 ptrace 호출을 차단하려면 기본값은 "1"입니다. "0"값은보다 관대 한 동작을 복원합니다. 이는 개발 시스템 및/또는 관리 계정 만있는 서버에 더 적합 할 수 있습니다. sudo을 사용하면 기능을 통해 ptrace 권한을 일시적으로 부여 할 수 있지만이 방법을 사용하면 모든 프로세스의 ptrace이 허용됩니다.

+0

그래서 많은 다른 유형의 응용 프로그램에 연결할 수 있기를 원하기 때문에 일반적으로 루트 수준의 privelages가 필요할 것 같습니다. 필요한 이유에 대해 통찰 해 주셔서 감사합니다. –

관련 문제