You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04下PTRACE_TRACEME报Operation not permitted的解决求助

解决ptrace(PTRACE_TRACEME) "Operation not permitted" 问题

在Ubuntu 22.04上开发自定义调试器时,子进程执行以下代码请求父进程追踪自己:

//child process asks the OS kernel to let its parent trace it
if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) {
      perror("ptrace_traceme");
      exit(EXIT_FAILURE);
}  

但报错:

ptrace_traceme: Operation not permitted

已尝试修改/proc/sys/kernel/yama/ptrace_scope为1或执行echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope,问题仍未解决,以下是其他可行解决方法:

  • 检查AppArmor权限限制
    Ubuntu默认启用AppArmor,部分程序或环境可能被AppArmor规则限制了ptrace权限。可以临时关闭目标进程的AppArmor配置测试:

    sudo aa-disable /etc/apparmor.d/<你的配置文件名>
    

    若不清楚具体配置文件,可临时全局禁用AppArmor(仅测试用,测试后务必恢复):

    sudo systemctl stop apparmor
    sudo systemctl disable apparmor
    

    恢复命令:

    sudo systemctl enable --now apparmor
    
  • 确保父子进程UID/GID一致
    PTRACE_TRACEME要求父进程和子进程的真实UID、有效UID必须匹配(除非父进程是root)。如果调试器或子进程通过sudo启动、存在UID切换情况,会导致权限不匹配。确保两者以同一用户身份运行,或直接以root权限启动调试器。

  • 检查内核ptrace相关配置
    部分定制内核可能禁用ptrace功能或开启额外限制,可通过以下命令检查:

    zgrep CONFIG_SECURITY_YAMA /proc/config.gz
    

    若输出为CONFIG_SECURITY_YAMA=y,说明yama模块启用,之前的scope修改应生效;若为CONFIG_SECURITY_YAMA=n,则需排查其他安全模块。同时检查ptrace功能是否启用:

    zgrep CONFIG_PTRACE /proc/config.gz
    

    确保输出包含CONFIG_PTRACE=y。

  • 用prctl显式设置跟踪权限
    在子进程调用PTRACE_TRACEME前,添加prctl调用允许跟踪(要求内核版本≥3.5):

    #include <sys/prctl.h>
    
    // 在ptrace调用前执行
    if (prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0) == -1) {
        perror("prctl_set_ptracer");
        exit(EXIT_FAILURE);
    }
    

    该调用允许任意进程跟踪当前进程,可绕过部分yama限制。

  • 排查Ubuntu Hardened Runtime限制
    若系统启用了Ubuntu Hardened Runtime,会有额外ptrace限制。可检查进程的personality标志:

    cat /proc/<进程PID>/personality
    

    若输出包含ADDR_NO_RANDOMIZE等安全相关标志,需调整运行环境或以root权限运行程序。

内容的提问来源于stack exchange,提问作者Aviel15

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:17:13