我有一个CentOS 7系统。我需要将 GDB 连接到已经运行的应用程序,但得到(显然是常见的)“ptrace:不允许操作”。错误。以 root 身份运行 GDB 可以防止该错误,但我不想诉诸于此。
我研究了这个问题,并找到了多个答案,说明您只需要修改/proc/sys/kernel/yama/ptrace_scope
该值0
或对文件进行永久修复/etc/sysctl.d/10-ptrace.conf
...
嗯,显然每个人都认为你使用的是 YAMA,但这里的情况似乎并非如此。然而,我还没有找到适合我的情况该怎么做。
我查了一下,好像我的系统配置了SELinux,但没有启用。我的内核启动设置包括 flagselinux=0
和命令
grep CONFIG_SECURITY /boot/config-`uname -r`
读
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
# CONFIG_SECURITY_PATH is not set
CONFIG_SECURITY_SECURELEVEL=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_SECURITY_SMACK is not set
# CONFIG_SECURITY_TOMOYO is not set
# CONFIG_SECURITY_APPARMOR is not set
# CONFIG_SECURITY_YAMA is not set
最后getsebool deny_ptrace
返回getsebool: SELinux is disabled
。
据我了解,我的系统当前未启用 LSM,但我仍然受到 ptrace 限制。我在这里不知道下一步该去哪里,或者甚至是什么导致了 ptrace 在这一点上的限制。
我的可执行文件上设置的 setuid 位是否可能导致此问题? gdb 和应用程序本身都是使用同一用户启动的,没有专门添加任何超级用户权限。ps -eouid,comm
还显示两者具有相同的 uid。只有应用程序使用setuid位运行,并且文件属于root:root。
答案1
调试具有特权的程序实际上为调试器提供了相同的特权。因此,无论任何安全设置如何,调试具有额外权限的程序都必须要求调试器至少具有所有这些权限。例如,setuid 程序同时拥有原始用户和目标用户的权限,因此调试器必须拥有这两个用户的权限。实际上,这意味着调试器必须是 root。在Linux 上,为调试器提供该功能就足够了CAP_SYS_PTRACE
(这不会降低调试器的有效权限,但这意味着调试器不会意外覆盖其他用户的文件)。
通常,在运行时调试程序更方便,无需额外的权限。相应地调整文件权限、路径等。如果您需要在实际情况下使用特权调试程序,则调试器需要以 root 身份运行。在 Linux 上,这可以是包含所涉及的两个用户的用户命名空间中的 root。