Bash 或Bourne again shell,是一个类UNIX shell 脚本,可能是任何Linux系统中最常见的安装组件。从1980年诞生到现在,bash 已经从一个简单的基于终端的命令解释器演进到诸多其他的奇特用途。
在Linux中,环境变量影响着系统软件。它们都是由一个名称和对名称的赋值构成。bash shell也是如此。在程序后台运行bash shell很常见。通常用于向远程用户提供一个shell(例如通过ssh,telnet),为CGI脚本提供解析器(例如Apache),甚至提供有限的命令执行支持(例如git)。
回到主题,你可以在调用bash shell前使用特殊加工的值创建环境变量,这个事实暴露了系统的脆弱。这些变量可以包含代码,随着shell调用执行。这些加工过的变量名并没有什么,主要是它们的内容。在以下的语境中,脆弱暴露无遗:
和编程语言一样,Bash也有函数,尽管是有限的实现,这些bash函数可能放入环境变量中。这个缺陷在这些环境变量内部的函数定义尾部附加额外的代码时触发。像这样:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
补丁修复了这个缺陷,确保bash函数的尾部不允许额外的代码。所以如果你用打过补丁的bash版本运行上面这个例子,应该得到类似这样的输出:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
我们相信这不应该影响任何的向后兼容。它当然会影响使用如上所述创建的环境变量的任何脚本,但这么做会被认为是糟糕的编程实践。
Red Hat的安全问题报告修复了Red Hat企业版Linux的这个问题。Fedora也运送了问题修复包。
Gitlab-shell 受 Bash CVE-2014-6271 漏洞影响
解决办法是升级 Bash,请参考这篇文章。