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

bil*_*lyw 11 security bash

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

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

但我对 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
Run Code Online (Sandbox Code Playgroud)

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

bil*_*lyw 13

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

根据该漏洞的最初发现者的说法,在 CVE-2014-6271 补丁之前的 bash 引入了一个函数,例如:

foo=() {
  code
}
Run Code Online (Sandbox Code Playgroud)

通过用空格替换等号并对其进行解释……这意味着可以在函数定义之外进行解释。

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

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