2012-04-15 65 views
1

爲什麼我需要以root身份運行(而不是r00t_)?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

你使用的是Ubuntu嗎? – 2012-04-15 16:22:13

+0

是的,我使用的是Ubuntu 11.10 – 2012-04-15 16:26:50

回答

4

雖然一些應用程序使用prctl()專門禁止PTRACE_ATTACH(如SSH代理),在Yama實施更加通用的解決方案是隻允許ptrace直接從父到子過程(即直接gdbstrace仍然工作),或以root用戶身份(即gdb BIN PIDstrace -p PID仍以超級用戶身份運行)。 如果本地應用程序受到攻擊,攻擊者無法附加到其他進程並檢查其內存和運行狀態。

此行爲通過/proc/sys/kernel/yama/ptrace_scope sysctl值進行控制。默認值爲「1」以阻止非子女ptrace調用。值爲「0」會恢復更寬容的行爲,這可能更適合於僅具有管理帳戶的開發系統和/或服務器。使用sudo也可以通過CAP_SYS_PTRACE功能臨時授予ptrace權限,雖然此方法允許任何進程ptrace

+0

所以它似乎只需要root級別的privelages,因爲我希望這能夠鉤入許多不同類型的應用程序。感謝您瞭解需要這樣做的原因。 – 2012-04-15 16:35:38