最近披露了Bash如何解释环境变量的漏洞CVE-2014-6271.该漏洞依赖于Bash将一些环境变量声明解析为函数定义,但随后继续按照定义执行代码:
$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'
vulnerable
Run Code Online (Sandbox Code Playgroud)
但我不明白.我在Bash手册中找不到任何关于将环境变量解释为函数的内容(除了继承函数,这是不同的).实际上,正确命名的函数定义只被视为一个值:
$ x='y() { :; }' bash -c 'echo $x'
y() { :; }
Run Code Online (Sandbox Code Playgroud)
但腐败的人什么都不打印:
$ x='() { :; }' bash -c 'echo $x'
$ # Nothing but newline
Run Code Online (Sandbox Code Playgroud)
损坏的函数是未命名的,因此我不能只调用它.这个漏洞是一个纯粹的实现错误,还是这里有一个预期的功能,我看不到?
Per Barmar的评论,我假设函数的名称是参数名称:
$ n='() { echo wat; }' bash -c 'n'
wat
Run Code Online (Sandbox Code Playgroud)
我之前发誓我可以发誓,但我想我没有努力.它现在可以重复了.这是一个更多的测试:
$ env n='() { echo wat; }; echo vuln' bash -c 'n'
vuln …Run Code Online (Sandbox Code Playgroud) security bash function environment-variables shellshock-bash-bug