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

Posted

技术标签:

【中文标题】ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限【英文标题】:ptrace PTRACE_ATTACH failure - Linux permissions of user owned process 【发布时间】:2012-04-15 16:10:48 【问题描述】:

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

当我是我尝试附加到的进程的所有者时,为什么我不能附加?

【问题讨论】:

【参考方案1】:

虽然某些应用程序使用prctl() 来明确禁止PTRACE_ATTACH(例如ssh-agent),但在Yama 中实现的更通用的解决方案是只允许ptrace 直接从父进程到子进程(即直接gdbstrace 仍然有效),或者作为 root 用户(即 gdb BIN PIDstrace -p PID 仍然作为 root 工作)。 如果本地应用程序受损,攻击者将无法附加到其他进程并检查它们的内存和运行状态。

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

【讨论】:

所以看起来它通常只需要根级别的权限,因为我希望它能够连接到许多不同类型的应用程序中。感谢您了解需要这样做的原因。

以上是关于ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限的主要内容,如果未能解决你的问题,请参考以下文章

docker中ptrace失败的解决方法

Android 逆向Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

Android 逆向ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )

libunwind-ptrace -- ptrace() support in libunwind

Android 逆向ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )(代

linux之使用ptrace 跟踪多线程程序