ptrace PTRACE_ATTACH失败 – 用户拥有的进程的Linux权限

为什么我需要以root身份运行(而不是r00t_)?

// 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_

 r00t_@:/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身份运行:

 r00t_@:~/memedit$ ./a.out -1 1 3 -1 

以root身份输出:

 r00t_@:~/memedit$ sudo ./a.out 0 0 140239607693344 

为什么我不能附加,当我是我试图附加的过程的所有者?

虽然有些应用程序使用prctl()来明确禁止PTRACE_ATTACH (例如ssh-agent),但是在Yama中实现的更一般的解决方案是只允许父进程直接从父进程到子进程(即直接使用gdbstrace仍然可用)根用户(即gdb BIN PIDstrace -p PID仍以strace -p PID用户身份运行)。 如果本地应用程序受到攻击,攻击者无法附加到其他进程并检查其内存和运行状态。

此行为通过/proc/sys/kernel/yama/ptrace_scope sysctl值进行控制。 默认值是“1”来阻止非子ptrace调用。 值“0”恢复更宽容的行为,这可能更适合于只有管理帐户的开发系统和/或服务器。 使用sudo也可以通过CAP_SYS_PTRACE功能临时授予ptrace权限,尽管此方法允许任何进程的ptrace