针对 CVE-2014-7169 的更新版 Shellshock 漏洞测试如何工作?

针对 CVE-2014-7169 的更新版 Shellshock 漏洞测试如何工作?

我了解 CVE-2014-6271 的原始测试是:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

但是我对 CVE-2014-7169 的更新测试和相应的输出感到困惑:

$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

有人可以简单解释一下这里发生了什么以及它是如何绕过 CVE-2014-6271 补丁的吗?

答案1

自从我第一次发布这个问题以来,我一直在网上搜索。

根据最初发现者该漏洞是由于 CVE-2014-6271 补丁之前的 bash 导入了一个如下函数:

foo=() {
  code
}

通过用空格替换等号并进行解释......这意味着可以进行超出函数定义的解释。

修补CVE-2014-6271 漏洞引入了 parse_and_execute() 函数的特殊模式将评估限制在函数定义内,而不是超出它。

然而,正如此主题,CVE-2014-7169 漏洞测试的特制环境变量旨在 1)使解析器陷入混乱 2)在缓冲区中留下残渣 3)彻底改变原始 bash 命令与缓冲区中已有的残渣结合时所做的事情。

因此要剖析环境变量:

X='() { (a)=>\'

  • 解析器将分析() { (a)=>\。请注意\是字符串的一部分;它是不是转义结尾的单引号。

() {

  • 解析器将其识别为函数定义。

(a)=

  • 这会让解析器非常困惑。

>\

  • 解析器将最后两个字符留在缓冲区中。

>\[NEWLINE]

  • sh运行命令之前的某个时间点,换行符会被放置在缓冲区中。

>\[NEWLINE]echo date

  • sh被调用时(在这种情况下可能是到 bash 的符号链接),它会将其命令参数添加echo date到缓冲区中已经存在的字符中。

>echo date

  • 由于换行符被转义,bash 会将缓冲区解析为>echo date,其效果与 相同date > echo。将创建一个名为 的文件echo,并将命令的标准date输出重定向到该文件。

; cat echo

  • 第二条命令只是显示新创建文件的内容。

答案2

它并没有给你一个干净的输出,但它确实演示了错误。

如果没有错误,环境变量X应该被忽略,bash 应该运行echo date,cat 应该抱怨没有名为 echo 的文件。例如,考虑 dash 的行为:

me@myserver$ rm -f echo && env -i  X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory

我不会重复你在问题中展示的输出,也不会假装了解它的工作原理,但 bash 正在运行date并将输出放入名为“echo”的文件中。你可以尝试其他方法,以date说服自己这既有用又危险。

相关内容