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


11

我了解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的补丁?


Answers:


13

自从我第一次发布这个问题以来,我已经在网络上闲逛了一段时间。

根据该错误的原始发现者,在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 > echoecho创建一个名为的文件,并将date命令的stdout 重定向到其中。

; cat echo

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


2

它不能为您提供清晰的输出,但是可以演示该错误。

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

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尝试其他方法,以使自己确信这是有用且危险的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.