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