正在删除根权限并仍生成CoreDump
我注意到,我的一些用户在崩溃后根本没有得到coredump,即使他们配置中的其他一切看起来都是正确的 在多次阅读手册页后,我注意到了这一点: [如果]进程正在执行由进程的实际用户(组)ID以外的用户(组)拥有的设置用户ID(设置组ID)程序,则不会生成核心转储文件] 我的守护进程不是setuid root,但在很多配置中,它都是以root启动的,如果.conf文件指定了用户名,它会删除特权,使用通常的组合:正在删除根权限并仍生成CoreDump,c,linux,unix,coredump,C,Linux,Unix,Coredump,我注意到,我的一些用户在崩溃后根本没有得到coredump,即使他们配置中的其他一切看起来都是正确的 在多次阅读手册页后,我注意到了这一点: [如果]进程正在执行由进程的实际用户(组)ID以外的用户(组)拥有的设置用户ID(设置组ID)程序,则不会生成核心转储文件] 我的守护进程不是setuid root,但在很多配置中,它都是以root启动的,如果.conf文件指定了用户名,它会删除特权,使用通常的组合: setgid(gid); setuid(uid); 当它这样做时,不再生成CoreDu
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]);
}
中止();
}
用法:
任何用户都可以在没有setgid/setuid的情况下中止/a.out
(其中1000是uid,100是gid)作为根用户删除权限并监视CoreDump不会发生/a.out 1000 100
- 额外的意外特性:传递一个参数,而不是两个,以获得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位