$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':' vulnerable
但我不明白。在Bash手册中,我没有找到任何东西来解释环境变量作为函数(除了继承的功能,这是不同的)。事实上,一个正确的命名函数定义只是作为一个值:
$ x='y() { :; }' bash -c 'echo $x' y() { :; }
但腐败的一个没有打印:
$ x='() { :; }' bash -c 'echo $x' $ # Nothing but newline
腐败函数未命名,所以我不能只是调用它。这个漏洞是一个纯实现bug,还是有一个预期的功能在这里,我只是看不到?
更新
$ n='() { echo wat; }' bash -c 'n' wat
我可以发誓我试过,但我想我没有努力足够。它现在是可重复的。这里有一些更多的测试:
$ env n='() { echo wat; }; echo vuln' bash -c 'n' vuln wat $ env n='() { echo wat; }; echo $1' bash -c 'n 2' 3 -- 4 wat
…因此显然args不是在exploit执行时设置的。
无论如何,我的问题的基本答案是,是的,这是Bash如何实现继承的函数。