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

r00*_*0t_ 2 c++ linux memory ptrace

为什么我需要以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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,我正在进行的过程由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
Run Code Online (Sandbox Code Playgroud)

输出以root身份运行:

r00t_@:~/memedit$ ./a.out
-1
1
3
-1
Run Code Online (Sandbox Code Playgroud)

以root身份输出:

r00t_@:~/memedit$ sudo ./a.out
0
0
140239607693344
Run Code Online (Sandbox Code Playgroud)

当我是我想要附加的过程的所有者时,为什么我无法附加?

Mic*_*kis 5

虽然一些应用程序用于prctl()特别禁用PTRACE_ATTACH(例如ssh-agent),但在Yama中实现的更通用的解决方案是仅允许ptrace直接从父进程到子进程(即直接gdbstrace仍然工作),或者作为root用户(即gdb BIN PID,和strace -p PID仍然以root身份工作).如果本地应用程序受到攻击,则攻击者无法连接到其他进程并检查其内存和运行状态.

此行为通过/proc/sys/kernel/yama/ptrace_scopesysctl值控制.默认值为"1"以阻止非子ptrace呼叫.值"0"恢复更宽松的行为,这可能更适合于仅具有管理帐户的开发系统和/或服务器.使用sudo也可以ptrace通过该CAP_SYS_PTRACE功能暂时授予权限,但此方法允许ptrace任何进程.