我们知道ld.so
在环境变量指定的目录中搜索库$LD_LIBRARY_PATH
,但普通用户可以运行:
export LD_LIBRARY_PATH=dir1:dir2...
他们可以将受感染的库保存在优先级高于原始库的路径中,以便ld.so
在ld.so.cache
.
这是一个风险吗?
我们如何禁止普通用户写入此环境变量?
我们知道ld.so
在环境变量指定的目录中搜索库$LD_LIBRARY_PATH
,但普通用户可以运行:
export LD_LIBRARY_PATH=dir1:dir2...
他们可以将受感染的库保存在优先级高于原始库的路径中,以便ld.so
在ld.so.cache
.
这是一个风险吗?
我们如何禁止普通用户写入此环境变量?
这根本不是安全风险,因为您始终只能为当前环境(例如当前 Bash 会话)设置环境变量,并使用
export
命令设置其子环境(您启动的脚本、子 shell 等)。不可能将创建或修改的环境变量升级到父环境。当然,这包括普通用户不可能进行系统范围的更改。因此,如果您运行,唯一会受到影响的环境
export LD_LIBRARY_PATH=...
是您当前的 shell 以及您以后可能生成的任何子 shell。假设您将查找路径更改为在开头包含受感染的库,即具有最高优先级的库。然后,您运行一个可执行文件,该可执行文件会在不知情的情况下加载其中一个受感染的库。现在会发生什么?您有恶意代码(来自受感染的库)在您自己的用户帐户下运行,并且具有常规的非管理员权限。这听起来可能很糟糕,但实际上……那又怎样?它以常规用户权限运行,这再次意味着它不会影响整个系统。顺便说一句,使用相同的恶意代码直接运行可执行文件比修改库查找路径并等待正常的可执行文件加载它要容易得多。
结论:普通用户只能修改自己的库查找路径,这意味着他们也只能在具有常规非系统范围权限的普通用户帐户下自己加载这些库。也就是说,它们是强制加载受感染的库还是直接运行受感染的可执行文件没有区别。如果用户无法覆盖该环境变量,您将一无所获。
PS:还有一些可执行文件设置了setuid或setgid标志,这意味着它们不会以运行它们的用户/组的身份运行,而是以拥有它们的用户/组的身份运行。例如,
sudo
可执行文件由 root 拥有并设置了setuid标志,这意味着它在执行时始终以 root 身份运行。出于安全原因,设置了setuid/setgid$LD_LIBRARY_PATH
标志之一的可执行文件会忽略该变量,以确保普通用户无法使可执行文件以 root 权限运行以加载任意库。(感谢@Rinzwind 指出这一点!)