gpt4 book ai didi

ptrace - 为什么 ptrace 在 setuid 后不附加到进程?

转载 作者:行者123 更新时间:2023-12-04 07:32:20 30 4
gpt4 key购买 nike

我的 Linux 守护程序有问题。它以 root 权限开始,进行一些配置,然后通过切换到某个用户和组来永久删除权限并继续工作。切换到非特权用户是这样完成的:

void switch_to_user_group(std::string const& username, std::string const& groupname)
{
// Switch to user/group
gid_t gid = getgid();
if (!groupname.empty())
{
gid = get_group_id(groupname);
if (0 != setgid(gid))
{
std::cout << "Failed to switch to group " << gid << std::endl;
std::abort();
}
}

if (!username.empty())
{
uid_t uid = get_user_id(username);
if (initgroups(username.c_str(), gid) != 0)
{
std::cout << "initgroups failed" << std::endl;
std::abort();
}
if (0 != setuid(uid))
{
std::cout << "Failed to switch to user " << uid << std::endl;
std::abort();
}
}
}

开关正确执行,我可以在 ps 和 top 中看到我的用户下运行的进程。问题是我无法从 gdb 附加到这个进程,即使它已经放弃了特权。输出是:
Attaching to process 15716
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.

我在进程切换到的同一用户下运行 gdb,并且我能够附加到最初在该用户下启动的其他进程。我在 Kubuntu 13.10(YAMA 已禁用)、Debian 6 和 7 上尝试过,结果相同。

所以我的问题是:
  • 为什么 ptrace 不能附加到与 gdb 具有相同有效和真实 UID 的进程?
  • 是否可以以某种方式删除我的程序的特权,以便我可以从非特权 gdb 附加到它?如何?

  • 谢谢。

    最佳答案

    我自己找到了解决方案。

    每个进程的内核都有一个“可转储”标志。当进程执行 setuid 或 setgid 时(至少在我的情况下,当进程放弃特权时)这个标志被清除,普通用户无法使用调试器附加到这个进程,并且进程崩溃也不会产生崩溃转储.这样做是出于安全原因,以保护可能在进程内存中的使用提升权限获得的任何敏感数据。

    为了解决这个问题,进程可以通过将 'dumpable' 标志设置为 1 来明确允许调试。

    prctl(PR_SET_DUMPABLE, 1);

    这必须在 setgid/setuid 调用之后完成。

    关于ptrace - 为什么 ptrace 在 setuid 后不附加到进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337923/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com