我了解 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
说服自己这既有用又危险。