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

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



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

setgid(gid);
setuid(uid);

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

我试图改变手册页似乎建议的“真实”uid/gid,方法是调用不太便携的 setresgid/uid,这似乎经常被建议永久删除特权:
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);

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

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 来删除权限并观察核心转储不会发生。
  • 额外的意外特性:传递一个参数而不是两个参数来获得 SIGSEGV 而不是 SIGABRT。

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

    最佳答案

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

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

    关于c - 删除 root 权限并仍然生成核心转储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29667243/

    10-13 08:50