最近披露了Bash如何解释环境变量的漏洞CVE-2014-6271。该漏洞利用 Bash 将一些环境变量声明解析为函数定义,然后继续执行定义后的代码:
$ 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
损坏的函数是未命名的,所以我不能直接调用它。这个漏洞是纯粹的实现错误,还是这里有我看不到的预期功能?
更新
根据 Barmar 的评论,我假设函数的名称是参数名称:
$ 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
…所以显然在漏洞执行时没有设置参数。
无论如何,我的问题的基本答案是,是的,这就是 Bash 实现继承函数的方式。