ptrace的PTRACE_ATTACH故障 - 用户拥有的进程Linux权限(ptrace PTR

2019-09-16 13:02发布

为什么我需要以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

输出作为根:

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

我为什么不能连接,当我的过程中,我试图连接到的主人吗?

Answer 1:

虽然一些应用程序使用prctl()以明确拒绝PTRACE_ATTACH (如SSH-剂),以实现更广泛的解决方案阎王是只允许ptrace直接从父到子过程(即直接gdbstrace仍然有效),或根用户(即gdb BIN PID ,并strace -p PID仍然工作根)。 在本地应用妥协的情况下,攻击者则无法连接到其他进程,并检查他们的记忆和运行状态。

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



文章来源: ptrace PTRACE_ATTACH failure - Linux permissions of user owned process