冒着增加“Shellshock”相关问题的风险......
Shellshock 补丁可防止在环境变量中的函数定义之后执行任意代码。例如,当人们试图利用漏洞时,修补版本的 Bash 会执行以下操作:
$ env foo='() { :;}; echo derp' bash -c 'echo herp'
bash: foo: ignoring function definition attempt
bash: error importing function definition for 'foo'
herp
这仍然是设计允许的:
$ env foo='() { echo derp; }' bash -c foo
derp
但是如果通过环境定义函数是可能的,那么任何有能力修改环境的人都可以用任意代码替换命令(假设目标脚本没有通过绝对路径指定命令):
$ env ls='() { echo derp; }' bash -c ls
derp
虽然 Shellshock 补丁可以防止 HTTP User-Agent 标头攻击(任何环境变量都可用于执行代码)之类的事情,但它无法阻止重新定义现有命令。
通过修改 PATH 以指向包含任意恶意命名的可执行文件的目录,在没有函数继承的情况下已经可以进行类似的攻击,但这种情况需要文件系统访问。这个没有。
那么问题来了:能够通过环境重新定义命令算作漏洞吗?是否有任何常见情况可以将其用于邪恶目的?(例如,Git/Mercurial over SSH、Gitolite...)