更改用户时未生成核心转储文件
Coredump file not generated when changing user
以下代码生成核心转储文件:
#include <iostream>
#include <string>
#include <pwd.h>
#include <grp.h>
#include <sys/resource.h>
int main() {
int b = 0;
int a = 140/b;
return 0;
}
输出:Floating point exception (core dumped)
核心转储生成于 /opt/cores
$ ls -al /opt/cores
total 188
drwxrwxrwx 2 root root 4096 Jan 13 16:46 .
drwxr-xr-x 28 root root 4096 Jan 12 11:57 ..
-rw------- 1 root root 344064 Jan 13 16:46 core.prueba.6776.8
但是,这不会生成核心转储文件:
#include <iostream>
#include <string>
#include <pwd.h>
#include <grp.h>
#include <sys/resource.h>
int main() {
std::string usr = "nobody";
std::string grp = "oinstall";
group* gp = getgrnam(grp.data());
passwd* user = getpwnam(usr.data());
if (gp && user && setgid(gp->gr_gid) == 0 && setuid(user->pw_uid) == 0) {
std::cout << "changed!" << std::endl;
} else {
std::cout << "not changed =(" << std::endl;
}
struct rlimit rlim;
rlim.rlim_cur = RLIM_INFINITY;
rlim.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rlim) != 0) {
std::cout << "setrlimit error" << std::endl;
}
getrlimit(RLIMIT_CORE, &rlim);
std::cout << "rlim_cur: " << (int)rlim.rlim_cur <<", rlim_max: " << (int)rlim.rlim_max << std::endl;
int b = 0;
int a = 140/b;
return 0;
}
输出:
changed!
rlim_cur: -1, rlim_max: -1
Floating point exception
我已经 运行 更改了用户的第一段代码,它生成了 coredump 文件,因此该目录具有正确的权限。问题是当我在代码中更改用户时。有什么线索吗?
这发生在 Linux(CentOS 6、CentOS 7、RHEL 6)上。
在 Solaris 中工作正常。
setuid() 联机帮助页有此注释:
If uid is different from the old effective UID, the process will be
forbidden from leaving core dumps.
这是一种安全机制,您可以阅读更多有关原因的信息here
您需要通过执行以下操作来启用 fs.suid_dumpable 以进行进程核心转储:
sysctl -w fs.suid_dumpable=2
nos 对安全机制的看法是正确的。
解决方案是 在 更改用户后添加:
prctl(PR_SET_DUMPABLE, 1, 0,0,0);
现在已生成核心转储。
以下代码生成核心转储文件:
#include <iostream>
#include <string>
#include <pwd.h>
#include <grp.h>
#include <sys/resource.h>
int main() {
int b = 0;
int a = 140/b;
return 0;
}
输出:Floating point exception (core dumped)
核心转储生成于 /opt/cores
$ ls -al /opt/cores
total 188
drwxrwxrwx 2 root root 4096 Jan 13 16:46 .
drwxr-xr-x 28 root root 4096 Jan 12 11:57 ..
-rw------- 1 root root 344064 Jan 13 16:46 core.prueba.6776.8
但是,这不会生成核心转储文件:
#include <iostream>
#include <string>
#include <pwd.h>
#include <grp.h>
#include <sys/resource.h>
int main() {
std::string usr = "nobody";
std::string grp = "oinstall";
group* gp = getgrnam(grp.data());
passwd* user = getpwnam(usr.data());
if (gp && user && setgid(gp->gr_gid) == 0 && setuid(user->pw_uid) == 0) {
std::cout << "changed!" << std::endl;
} else {
std::cout << "not changed =(" << std::endl;
}
struct rlimit rlim;
rlim.rlim_cur = RLIM_INFINITY;
rlim.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rlim) != 0) {
std::cout << "setrlimit error" << std::endl;
}
getrlimit(RLIMIT_CORE, &rlim);
std::cout << "rlim_cur: " << (int)rlim.rlim_cur <<", rlim_max: " << (int)rlim.rlim_max << std::endl;
int b = 0;
int a = 140/b;
return 0;
}
输出:
changed!
rlim_cur: -1, rlim_max: -1
Floating point exception
我已经 运行 更改了用户的第一段代码,它生成了 coredump 文件,因此该目录具有正确的权限。问题是当我在代码中更改用户时。有什么线索吗?
这发生在 Linux(CentOS 6、CentOS 7、RHEL 6)上。
在 Solaris 中工作正常。
setuid() 联机帮助页有此注释:
If uid is different from the old effective UID, the process will be forbidden from leaving core dumps.
这是一种安全机制,您可以阅读更多有关原因的信息here
您需要通过执行以下操作来启用 fs.suid_dumpable 以进行进程核心转储:
sysctl -w fs.suid_dumpable=2
nos 对安全机制的看法是正确的。
解决方案是 在 更改用户后添加:
prctl(PR_SET_DUMPABLE, 1, 0,0,0);
现在已生成核心转储。