删除root权限并仍然生成coredump

时间:2015-04-16 06:46:02

标签: c linux unix coredump

我注意到我的一些用户在崩溃后根本没有获得coredump,即使他们的配置中的其他所有内容都是正确的。

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

  

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

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

setgid(gid);
setuid(uid);

当它这样做时,不再生成coredump。环境中的其他所有内容似乎都是正确的,删除​​这些调用(并保留为root)会像往常一样让我获得coredump。

我试图改变"真实" uid / gid就像man页面似乎建议的那样,通过调用不那么便携的setresgid / uid,似乎经常建议永久删除权限:

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

我希望能解决这个问题,但......它根本没有改进。仍然没有coredumps。

Sooo ...现在是什么?


测试代码:

#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身份删除权限并观看未发生的coredump。
  • 奖励无意识的功能:传递一个参数而不是两个参数来获取SIGSEGV而不是SIGABRT。

我已经在arch linux,centos 6.5和openbsd 5.3

中对此进行了测试

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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/

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