12

Linux动态链接器包括一种使用LD_重新加载环境变量和/etc/ld.so/预加载文件。这听起来很危险危险。作为最近的一个例子,Windigo/Ebury恶意软件依赖它:

侦听此UNIX套接字的永久运行进程是通过使用以下命令将Ebury有效负载加载到合法的可执行文件中来启动的LD_重新加载

然而,在所有Linux发行版中,默认情况下都会启用此机制,即使是基于MUSL的。这似乎极为轻率,虽然有合法的使用案例(如在封闭源代码中添加插装),但它们是利基且不保证LD_重新加载默认情况下处于启用状态。

虽然有缓解的技巧通过这种机制加载任意代码,听起来太复杂和不可靠了。我认为最好的解决方案是防患于未然,并从系统动态链接器中删除此功能。合法用户仍然可以通过自定义链接器使用它,但数十万受感染的web服务器将更加安全。那么为什么还没有这样做呢?为什么没有人反对这一错误特征?

10
  • 21
    我认为您误解了Unix-Linux安全范例。权限被授予用户不是为了程序。普通用户可以执行任意代码,甚至可以提供自己的代码(默认情况下通常安装C编译器)。如果有人可以在您的环境中添加LD_PRELOAD变量,那么它也可以更改您的路径,使您启动程序的修改副本。因此,这不能用于特权升级。我看不出LD_PRELOAD如何成为一个安全问题,就像set_user_id位那样。 评论 5月15日7:12
  • 与指定要运行的可执行文件的显式路径类似,可以显式清除LD_重新加载从shell运行可执行文件时的变量:LD_PRELOAD=/usr/bin/program args。。。 评论 5月15日20:56
  • 4
    我不认为Serge这么认为路径这是一个错误的特征。他的观点是专注于LD_重新加载放错了位置。如果对手有足够的权限控制任意用户的环境,那么游戏就已经失败了。如果对手可以控制特定用户的环境,则该用户的帐户已经受到威胁。使用的技巧LD_重新加载不是主要漏洞。它们可能是有效载荷单独的攻击,而不是提供特权升级的攻击。 评论 5月16日14:55
  • 2
    作为雷蒙德他说:这相当于在这个密闭舱口的另一边。
    – 马丁
    评论 5月17日8:25
  • 2
    @AustinHemmelgarn,你可以看看已经到位的缓解机制。请参见stackoverflow.com/questions/9232892/…询问为什么对setuid二进制文件使用LD_PRELOAD不起作用——其答案链接到相关资源。 评论 5月17日15:25

2个答案2

重置为默认值
22

在Unix安全模型中,进程和其父进程之间没有安全边界(假设两者都在同一个用户ID下运行)。即使您删除了LD_PRELOAD,也会有无数其他方法来实现相同的最终结果:例如,只需修改应用程序二进制文件,在使用ptrace启动后修改它,修改/proc/PID/mem,更改LD_LIBRARY_PATH等。因此,删除此功能不会使事情变得更安全。一旦攻击者能够在服务器上引入并执行恶意代码,您就会受到攻击。

10
  • 28
    如果攻击者可以修改环境变量,则安全性已被破坏。Unix安全模型假设用户不想攻击自己。 评论 5月15日8:48
  • 9
    @EgorSozonov-如果不是API,SSH是什么。。。 评论 5月15日15:44
  • 1
    @埃戈尔·索佐诺夫,这是一个单独的问题。评论不用于前后讨论。如果您有新问题,请使用“提问”按钮提问。请不要用这个答案下的评论来讨论其他话题。谢谢您! 评论 5月15日22:56
  • 这个可以是父进程和子进程之间的安全边界,通过强制访问控制(例如SELinux)。不过,我想这不是标准UNIX安全模型的一部分。 评论 5月16日14:30
  • 2
    @埃戈尔·索佐诺夫,你为什么认为这是一个安全问题?如果用户说LD_PRELOAD=/tmp/evil.so ls,然后该用户故意要求邪恶的并且有足够的权限执行邪恶的想要做的(否则由其进行的系统调用将失败)。 评论 5月17日15:17
-1
  1. 没有“Linux默认”这样的东西。

  2. 这个“恶意软件”是sharedlib,它注入到以root身份运行的进程中,可以将自身分发到系统的所有进程中。很好,但这并没有什么特别的,显然作为root用户,您可以在系统中做任何事情,包括修改所有二进制文件。

  3. 无法通过以下方式将任何内容远程或甚至本地作为非根注入到linux进程中LD_重新加载。上一次使用此功能的安全漏洞是在90年代末关闭的。从这个意义上说,你可以说是的,LD_重新加载是“禁用的”(嗯,不是完全禁用的,只是以其他用户的名义执行操作是禁用的,包括使用LD_重新加载).

你必须登录来回答这个问题。

不是你想要的答案吗?浏览已标记的其他问题.