环境变量可以设为不可变的吗?

环境变量可以设为不可变的吗?

随着最近发现共生体的脆弱性,现在显然我们需要缓解LD_PRELOAD 注入攻击LD_PRELOAD以及类似的情况。我们可能能够阻止这种利用的一种方法是将影响安全性的其他变量设置为不可变的。

是否有任何方法可以通过 SELinux、AppArmor、命名空间、cgroups 或任何其他机制来实现这一点?

答案1

环境变量并不是真正的对象,它们几乎就像可以传递给 exec() 的第二个参数数组。LSM,例如 AppArmor过滤通过 exec 继承的环境变量,尽管使用 AppArmor 我不确定它是否可以全局完成(它可按配置文件使用)。

另一个缓解措施是维护您自己的 glibc 版本,并完全修补 LD_PRELOAD 功能ld.so

glibc 的 ld.so 已经检查了在加载“setuid”可执行文件时忽略 LD_PRELOAD,因此任何此类环境变量对“sudo”或“su”工具都无效。这也可以在一定程度上用于保护“ssh”——赋予它无害的功能(例如“cap_net_broadcast=p”)或将其设置为无害组,它将不受 LD_PRELOAD 的影响。

必须从以下位置加载库某处,因此,挂载所有可写位置noexec应该会有所帮助,因为它可以防止 ld.so 在这些文件系统中创建文件的可执行映射,因此不仅可以运行可执行文件,还可以从 noexec 文件系统加载库。

目前尚不清楚恶意软件最初是如何设置环境变量的,也就是说,它们是否会影响init自身,还是仅影响用户 shell 进程。如果它们不影响 init,则可以要求它在干净的环境中启动新进程 - 例如使用 systemd,systemctl 调用者不会向服务泄露任何信息。

相关内容