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

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

我设置环境来创建所有崩溃的核心转储,但是当我在与执行用户不同的用户上运行设置了 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)

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

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

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

答案1

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

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

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

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

答案2

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

从上面的示例来看,当以 root 身份运行或删除权限升级时,您似乎能够获得核心转储。

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

答案3

我决定也分享我的用例,直到我忘记为止。这对未来的我来说可能也很方便,因为我几个月前就解决了同样的问题,而且我花了太多时间才再次找出答案。好的。它实际上不是核心转储,但堆栈跟踪也很有用。

问题:不知道那里发生了什么:

sudo id
Segmentation fault

解决方案:将 suid 位从 移至sudo即可valgrind正常工作:

chmod +s /usr/bin/valgrind
chmod -s /usr/bin/sudo
valgrind /usr/bin/sudo id

如果安装了 debuginfo,则会写出漂亮的回溯。

相关内容