正在删除根权限并仍生成CoreDump

正在删除根权限并仍生成CoreDump,c,linux,unix,coredump,C,Linux,Unix,Coredump,我注意到,我的一些用户在崩溃后根本没有得到coredump,即使他们配置中的其他一切看起来都是正确的 在多次阅读手册页后,我注意到了这一点: [如果]进程正在执行由进程的实际用户(组)ID以外的用户(组)拥有的设置用户ID(设置组ID)程序,则不会生成核心转储文件] 我的守护进程不是setuid root,但在很多配置中,它都是以root启动的,如果.conf文件指定了用户名,它会删除特权,使用通常的组合: setgid(gid); setuid(uid); 当它这样做时,不再生成CoreDu

我注意到,我的一些用户在崩溃后根本没有得到coredump,即使他们配置中的其他一切看起来都是正确的

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

[如果]进程正在执行由进程的实际用户(组)ID以外的用户(组)拥有的设置用户ID(设置组ID)程序,则不会生成核心转储文件]

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

setgid(gid);
setuid(uid);
当它这样做时,不再生成CoreDump。环境中的其他一切似乎都是正确的,删除这些调用(并保持为root)会像往常一样获得coredumps

我试图按照手册页的建议更改“真实”的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();
}
#包括
int main(int argc,字符**argv){
如果(argc>1){
setgid(atoi(argv[2]);
setuid(atoi(argv[1]);
}
中止();
}
用法:

  • /a.out
    任何用户都可以在没有setgid/setuid的情况下中止
  • /a.out 1000 100
    (其中1000是uid,100是gid)作为根用户删除权限并监视CoreDump不会发生
  • 额外的意外特性:传递一个参数,而不是两个,以获得SIGSEGV而不是SIGABRT

我已经在arch linux、centos 6.5和openbsd 5.3中对此进行了测试,您必须为其权限已更改的应用程序启用核心转储:

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

编辑:

您可以查看这个整洁的库,它允许您手动将核心转储写入自定义文件:


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

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

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

而非特权用户/组没有禁用核心转储(
ulimit-c
不报告
0
)?是的,两边都不受限制。在没有setuid/gid调用的情况下,将其作为uid(0和1000)运行会导致coredumps。特别是,还有一些PAM模块,记住ubuntu,它们与生成核心转储进行交互。我在arch linux、centos 6.5和openbsd中复制了这种行为(这就是我在vagrant中所做的)。将我的测试代码添加到问题中谢谢!但我只是守护进程的开发人员,我无法控制它将要安装到的系统。我正试图解决这个问题,这样我就可以从没有预料到崩溃的用户那里获得CoreDump,所以。。。如果我必须告诉他们这些,我还不如告诉他们运行gdb。正在寻找我可以在代码中修复的东西。@dequis,不幸的是,我不知道从你这方面做什么。这是一种安全漏洞,这就是核心转储被禁用的原因,除非您手动启用它(作为
根目录
)。在你的情况下,你放弃了特权,所以对我来说,这似乎是安全的。但是有些应用程序会提升特权(
passwd
),允许它们转储内核是一个巨大的风险。@dequis,请阅读我的最新编辑,希望这是您所需要的。在Linux上,通常在
/etc/sysctl.conf
中执行此操作,而不是在
/etc/rc.local
中执行此操作很有趣!我稍后会测试这个。但似乎是linux特有的,BSD在openbsd上也有这种行为,用sysctl()取消设置KERN_nosuidcordump位