Ubuntu 22.04下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

