【问题标题】:Dropping root privileges and still generate coredumps删除 root 权限并仍然生成核心转储
【发布时间】:2015-06-22 10:02:27
【问题描述】:

我注意到我的一些用户在崩溃后根本没有得到核心转储,即使他们的配置中的其他所有内容似乎都正确。

在多次阅读core(5) 手册页后,我注意到了这一点:

[如果不生成核心转储文件] 进程正在执行一个由用户(组)拥有的 set-user-ID (set-group-ID) 程序,而不是进程的真实用户(组)ID。

我的守护进程不是 setuid root,但在很多配置中它是以 root 身份启动的,如果 .conf 文件指定了用户名,它会放弃特权,使用通常的组合:

setgid(gid);
setuid(uid);

执行此操作时,不再生成核心转储。环境中的其他一切似乎都是正确的,删除​​这些调用(并保持 root 身份)让我像往常一样获得核心转储。

我试图更改“真正的”uid/gid,正如手册页所暗示的那样,通过调用似乎经常被建议永久放弃特权的不太便携的 setresgid/uid:

setresgid(gid, gid, gid);
setresuid(uid, uid, uid);

我希望这能解决问题,但是......它根本没有改善。仍然没有核心转储。

太好了……现在呢?


测试代码:

#include <stdlib.h>

int main(int argc, char **argv) {
        if (argc > 1) {
                setgid(atoi(argv[2]));
                setuid(atoi(argv[1]));
        }
        abort();
}

用法:

  • ./a.out 任何用户都可以在没有 setgid/setuid 的情况下中止
  • ./a.out 1000 100(其中 1000 是 uid,100 是 gid)以 root 身份删除权限并观察不会发生核心转储。
  • 额外的无意功能:传递一个参数,而不是两个参数,以获取 SIGSEGV 而不是 SIGABRT。

我已经在 arch linux、centos 6.5 和 openbsd 5.3 中测试过这个

【问题讨论】:

  • 并且非特权用户/组没有禁用核心转储(ulimit -c 不报告0)?
  • 是的,双方无限制。在没有 setuid/gid 调用的情况下以 uid(0 和 1000)的形式运行它会导致核心转储。
  • 你真的必须对这类东西更具体,Linux 发行版在这里做不同的事情。特别是,那里有 PAM 模块,记住 ubuntu,它们与生成核心转储交互。
  • 我已经在 arch linux、centos 6.5 和 openbsd 中重现了这种行为(这是我在 vagrant 中所拥有的)。将我的测试代码添加到问题中

标签: c linux unix coredump


【解决方案1】:

要强制进程始终进行核心转储,请使用 prctl 系统调用。

prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);

【讨论】:

  • 有趣!我稍后会对此进行测试。不过似乎是特定于 linux 的,BSD 也有这种行为
  • 在 openbsd 上使用 sysctl() nixdoc.net/man-pages/OpenBSD/sysctl.3.html 取消设置 KERN_NOSUIDCOREDUMP 位
【解决方案2】:

您必须为权限已更改的应用程序启用核心转储:

echo 2 > /proc/sys/fs/suid_dumpable

我建议你把它放在/etc/rc.local


例如,这是我所拥有的:

# This is to enable debugging as a normal user, rather than root
sysctl kernel.yama.ptrace_scope=0

# This is a convenient core file pattern 
# '%e' is the name of the process
# '%p' is the pid of process
sysctl kernel.core_pattern="/tmp/core.%e.%p"

# Enable dump for processes with lowered privileges
echo 2 > /proc/sys/fs/suid_dumpable

# Remove limit for the size of core files
ulimit -c unlimited

编辑:

您可以看看这个简洁的库,它允许您手动将核心转储写入自定义文件:https://code.google.com/p/google-coredumper/

我相信这正是您所需要的。

【讨论】:

  • 谢谢!但我只是守护进程的开发人员,我无法控制将要安装的系统。我正在尝试解决这个问题,以便我可以从没想到崩溃的用户那里获得核心转储,所以.. . 如果我不得不告诉他们,我还不如告诉他们运行 gdb。寻找我可以在我的代码中修复的东西。
  • @dequis,不幸的是,我不知道如何从你这边做到这一点。这是一种安全漏洞,这就是核心转储被禁用的原因,除非您手动启用它(作为root)。在你的情况下,你放弃了特权,所以对我来说,这似乎是安全的。但是有些应用程序会提升特权(passwd),允许它们转储内核是一个巨大的风险。
  • @dequis,请阅读我的最新编辑,希望这是您需要的。
  • 在 Linux 上,习惯上在/etc/sysctl.conf 中而不是在/etc/rc.local 中执行此操作
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2011-09-05
  • 2023-03-27
  • 2013-07-24
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多