我注意到我的一些用户在崩溃后根本没有得到核心转储,即使他们配置中的其他一切看起来都是正确的。
在多次阅读 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 来删除权限并观察核心转储不会发生。 我已经在 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/