删除root权限并仍然生成coredump

deq*_*uis 13 c unix linux coredump

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

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

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

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

setgid(gid);
setuid(uid);
Run Code Online (Sandbox Code Playgroud)

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

我尝试通过调用不太便携的setresgid/uid来改变"真正的"uid/gid,因为这个似乎经常被建议永久删除权限:

setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
Run Code Online (Sandbox Code Playgroud)

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

Sooo ......现在怎么样?


测试代码:

#include <stdlib.h>

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

用法:

  • ./a.out 任何用户只是在没有setgid/setuid的情况下中止
  • ./a.out 1000 100 (其中1000是uid,100是gid)作为root来删除权限并观察coredumps不会发生.
  • 额外无意识功能:传递一个参数,而不是两个参数,以获得SIGSEGV而不是SIGABRT.

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

clo*_*ey1 3

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

prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)