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

标签 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;
}

如你所见,我连接的进程归 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

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

最佳答案

虽然一些应用程序使用 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 .

关于c++ - ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163678/

相关文章:

c++ - 哪些贪婪的初始化列表示例潜伏在标准库中?

linux - 在ubuntu中远程编辑文件时文件权限被覆盖

java - 声明/初始化和内存分配

c++ - 我可以通过这种方式为链接列表实现push_back方法吗?

c++ - 在虚幻引擎中导入 Steam 社区 API

c++ - 如何在 IMFByteStream 接口(interface)中实现 `BeginRead`

c++ - 使用模板制作类型安全的 C++ "component manager"

Linux UART 比指定的波特率慢

linux - Openwrt 生成文件

c# - 私有(private)方法和属性与公共(public)方法和属性在 C#(和其他语言)中的内存占用