当应用程序设置了 SUID 时,为什么不创建核心转储?

Dip*_*tch 17 linux security core-dump

我设置了我的环境以创建所有崩溃的核心转储,但是当我在与执行用户不同的用户上运行设置了 SUID 的程序时,它不会创建核心转储。知道为什么会这样吗?我在网络上的任何地方都找不到它,我认为这是某种安全功能,但我想禁用它...

问题:

$ cd /tmp
$ cat /etc/security/limits.conf | grep core
*     -     core     unlimited
root  -     core     unlimited

$ ls -l ohai
-rwsr-sr-x 1 root root 578988 2011-06-23 23:29 ohai

$ ./ohai
...
Floating point exception

$ sudo -i
# ./ohai
...
Floating point exception (core dumped)
# chmod -s ohai
# exit
$ ./ohai
...
Floating point exception (core dumped)
Run Code Online (Sandbox Code Playgroud)

编辑: 为了让它尽可能安全地工作,我现在有以下脚本来设置环境:

mkdir -p /var/coredumps/
chown root:adm /var/coredumps/
chmod 772 /var/coredumps/

echo "kernel.core_pattern = /var/coredumps/core.%u.%e.%p" >> /etc/sysctrl.conf
echo "fs.suid_dumpable = 2" >> /etc/sysctl.conf

echo -e "*\t-\tcore\tunlimited" >> /etc/security/limits.conf
echo -e "root\t-\tcore\tunlimited" >> /etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)

现在剩下要做的就是将 ACL 添加到 /var/coredumps 以便用户只能添加文件,而不能再修改或读取它们。唯一的缩小是我仍然会遇到需要 chroot 的应用程序bind mount或类似的问题。

Gil*_*il' 22

setuid 程序的内存可能(甚至可能)包含机密数据。所以核心转储必须只能由 root 读取。

如果核心转储归 root 所有,我看不到明显的安全漏洞,尽管内核必须小心不要覆盖现有文件。

Linux 禁用 setxid 程序的核心转储。要启用它们,您至少需要执行以下操作(我还没有检查这是否足够):

  • 通常通过将fs.suid_dumpablesysctl设置为 2 来启用 setuid 核心转储,例如使用echo 2 >/proc/sys/fs/suid_dumpable. (注意:2,不是 1;1 表示“我正在调试整个系统并希望删除所有安全性”。)
  • prctl(PR_SET_DUMPABLE, 1)从程序调用。


unp*_*nic 7

核心转储包含故障发生时内存中所有内容的副本。如果程序正在运行 suid,则意味着它需要访问您作为用户无权访问的内容。如果程序获取该信息然后转储核心,您将能够读取该特权信息。

从上面的示例中,您似乎可以在以 root 身份运行或删除权限提升时获得核心转储。

虽然从 setuid 程序轻松访问 coredump 可能很方便(仅对开发人员而言),但它是一个安全漏洞,应该留在原地。