即使有了 Shellshock 补丁,Bash 是否容易受到命令重定义的影响?

信息安全 炮击 重击
2021-08-25 17:08:34

冒着增加“Shellshock”相关问题的风险......

Shellshock 补丁可防止在环境变量中的函数定义之后执行任意代码。例如,当人们试图利用漏洞时,修补版本的 Bash 会执行以下操作:

$ env foo='() { :;}; echo derp' bash -c 'echo herp'
bash: foo: ignoring function definition attempt
bash: error importing function definition for 'foo'
herp

这仍然是设计允许的:

$ env foo='() { echo derp; }' bash -c foo
derp

但是如果通过环境定义函数是可能的,那么任何有能力修改环境的人都可以用任意代码替换命令(假设目标脚本没有通过绝对路径指定命令):

$ env ls='() { echo derp; }' bash -c ls
derp

虽然 Shellshock 补丁可以防止 HTTP User-Agent 标头攻击(任何环境变量都可用于执行代码)之类的事情,但它无法阻止重新定义现有命令。

通过修改 PATH 以指向包含任意恶意命名的可执行文件的目录,在没有函数继承的情况下已经可以进行类似的攻击,但这种情况需要文件系统访问。这个没有。

那么问题来了:能够通过环境重新定义命令算作漏洞吗?是否有任何常见情况可以将其用于邪恶目的?(例如,Git/Mercurial over SSH、Gitolite...)

1个回答

理论上,是的。但是你也有问题

  • LD_PRELOAD
  • LD_LIBARAY
  • BASH_ENV
  • 等等。

shellshock 的最大问题是环境变量的名称无关紧要,bash即使您从不调用 eg 也会在其中执行代码HTTP_COOKIES(顺便说一句,谁会这样做?)

攻击者通常只能选择变量名称的一部分,并且不太可能(但并非不可能)调用具有这种名称的函数/程序。

例如,如果您通过 SSH 限制您的 git,因此它们只能调用git,那么攻击者需要定义一个环境变量git- 这应该是不可能的。

更新:还有其他可能的本地权限提升:

即使使用完整路径调用命令,您也可以隐藏命令

env /bin/date='() { echo fail; }' bash -c /bin/date

哪个可能会与system(和其他)调用混淆 - 这对于使用其中一个函数作为 root 的 SUID 可执行文件来说是一个问题。