Translated message

A translation of this page exists in English.

使用特殊设计的环境变量导致 Bash 代码注入安全漏洞 (CVE-2014-6271, CVE-2014-7169)

已更新 -

红帽已了解到,在红帽产品所附带的 bash 软件包的所有版本中存在一个安全漏洞。此安全漏洞 CVE-2014-6271 可能会被利用实现任意代码执行。某些服务和应用程序允许远程的未经身份验证的攻击者提供环境变量,从而可以利用这个问题进行安全攻击。

更新:2014-09-30 18:00 UTC

报告了两个新安全漏洞,这些漏洞可以通过当前可用的 Bash 软件包进行缓解。 如需更多信息,请参阅常见问题解答

更新:2014-09-29 05:00 UTC

存在利用这个安全漏洞的恶意软件。如需了解更多详细信息,请参阅本文档

更新:2014-09-26 05:15 UTC

红帽已了解到 CVE-2014-6271 的补丁并不完整。攻击者可以使用精心设计的环境变量,其中包括在特定情况下可以在存在安全漏洞的系统上执行的任意命令。新的问题已被记录为 CVE-2014-7169

可以解决 CVE-2014-7169 的 bash 软件包现在可用于 Red Hat Enterprise Linux 4, 5, 6, 和 7, Red Hat Enterprise Linux 5.6 Long Life, Red Hat Enterprise Linux 5.9 Extended Update Support, Red Hat Enterprise Linux 6.2 Advanced Update Support, 和 Red Hat Enterprise Linux 6.4 Extended Update Support, 以及 Shift_JIS for Red Hat Enterprise Linux 5 和 6。另请参阅 Resolution for Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169) in Red Hat Enterprise Linux.

诊断步骤

Red Hat Access Labs 提供了一个脚本,以帮助确认系统是否已对 Shellshock 漏洞进行了补丁处理。您还可以运行以下命令来手动测试 Bash 版本:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

如果以上命令的输出包含了只有 vulnerable 一词的一行,则代表您正在使用一个存在安全漏洞的 Bash 版本。用于修复此问题的补丁可以确保在 Bash 函数结束后将不允许使用任何代码。

请注意,在执行上述命令时,不同的 Bash 版本可能会输出不同的警告。没有修复的 Bash 版本会生成以下输出:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

仅应用了原始 CVE-2014-6271 修复的版本会产生以下输出:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test

带有来自 RHSA-2014:1306, RHSA-2014:1311 and RHSA-2014:1312 的额外修复的版本会生成以下输出:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

造成输出有区别的原因在下面的"如何影响系统"部分中所述的额外函数处理更改所造成的。

CVE-2014-7169 的修复确保了系统不会受文件创建问题的影响。要测试您的 Bash 版本是否受 CVE-2014-7169 的影响,请运行以下命令:

$ cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo
bash: x: line 1: syntax error near unexpected token `='
bash: x: line 1: `'
bash: error importing function definition for `x'
Fri Sep 26 11:49:58 GMT 2014

如果您的系统存在安全漏洞,会在屏幕中输出时间和日期信息,同时会创建一个名为 /tmp/echo 的文件。

如果您的系统不受相关安全漏洞的影响,您会看到类似如下的输出:

$ cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo
date
cat: /tmp/echo: No such file or directory

如果您的系统存在安全漏洞,您可以通过运行以下命令,将 Bash 软件包更新到最新版本来修复这些问题:

# yum update bash

如何影响系统

此问题会影响所有使用 Bash shell 并解析环境变量值的产品。此问题尤为危险,因为应用程序可以使用多种方法调用 Bash。在很多情况下,如果一个应用执行另一个二进制文件,会调用 Bash 来完成此操作。由于 Bash shell 被广泛使用,因此此问题非常严重,应重点关注。

列出的针对此问题进行了更新的版本之前的所有版本都会受到某种程度的影响。

对于特定的情况,请参阅相应的补救信息。

CVE-2014-7169 的补丁引入了对 Bash 如何评估环境变量的更改。直接创建 Bash 函数作为环境变量的应用程序需要了解这些更改。以前,函数需要存储在相同名称的环境变量中。例如,函数 "compute" 会存储在名为"compute"的环境变量中。在应用了针对 CVE-2014-7169 的补丁后,需要使用名称 "BASH_FUNC_compute()"。因此,在环境字符串中会包括两个括号对,如 "BASH_FUNC_compute()=() { }"。

使用 Bash 本身编写的函数不需要更改,即使它们通过 "export -f" 导出。Bash 会在导出时以透明方式应用适当的命名方式,并在导入功能定义时进行相反的处理。

创建此类环境变量的服务需要重新启动,才能使用新版本的 Bash。任何 Red Hat Enterprise Linux 版本中提供的软件包都没有这个行为。

受影响的产品:

产品/频道 已在软件包中修复 补救详情
Red Hat Enterprise Linux 7 bash-4.2.45-5.el7_0.4 Red Hat Enterprise Linux
Red Hat Enterprise Linux 6 bash-4.1.2-15.el6_5.2 Red Hat Enterprise Linux
bash-4.1.2-15.el6_5.1.sjis.2 Red Hat Enterprise Linux
bash-4.1.2-9.el6_2.2 Red Hat Enterprise Linux 6.2 AUS
bash-4.1.2-15.el6_4.2 Red Hat Enterprise Linux 6.4 EUS
Red Hat Enterprise Linux 5 bash-3.2-33.el5_11.4 Red Hat Enterprise Linux
bash-3.2-33.el5_11.1.sjis.2 Red Hat Enterprise Linux
bash-3.2-24.el5_6.2 Red Hat Enterprise Linux 5.6 LL
bash-3.2-32.el5_9.3 Red Hat Enterprise Linux 5.9 EUS
Red Hat Enterprise Linux 4 bash-3.0-27.el4.4 Red Hat Enterprise Linux 4

常见配置示例:

红帽已进行了相关的分析,以更好地理解此问题的影响程度,以及它对各种配置的影响。以下列表并没有包括所有信息,它仅提供一些关于此问题对某些配置影响的示例,以及为什么高度复杂的配置会导致无法确定特定的环境是否会受此问题的影响。最佳的操作方法是,将 Bash 升级到一个已修复的版本。

软件包 描述
httpd CGI 脚本可能会受到此问题的影响:当 Web 服务器运行 CGI 脚本时,它会使用环境变量将数据传递给脚本。这些环境变量可以被攻击者控制。如果 CGI 脚本调用 Bash,脚本可以以 httpd 用户身份执行任意代码。mod_php、mod_perl 和 mod_python 不使用环境变量,我们认为它们不受影响。
Secure Shell (SSH) 对用户通过 SSH 运行远程命令(如 rsync 或 git )进行限制并不常见。在这些情况下,可以利用此问题来执行任何命令,而不仅仅是受限的命令。
dhclient Dynamic Host Configuration Protocol Client (dhclient) 用于通过 DHCP 自动获取网络配置信息。此客户端使用各种环境变量并运行 Bash 来配置网络接口。如果连接到一个恶意的 DHCP 服务器可能会导致攻击者在客户端机器上运行任意代码。
CUPS 我们认为 CUPS 会受到此问题的影响。在执行 cups 过滤时,用户提供的不同值会存储在环境变量中。
sudo 通过 sudo 运行的命令不受此问题的影响。sudo 会专门查看也作为函数的环境变量。运行的命令仍仍然可以设置一个环境变量,它可能会导致 Bash 子进程执行任意代码。
Firefox 我们不认为,可以强制 Firefox 本身以允许 Bash 运行任意命令的方式设置环境变量。但我们仍然建议升级 Bash,因为安装的各种插件和扩展可能会允许此行为。
Postfix Postfix 服务器会将一些字符替换为 ?。虽然 Postfix 服务器会以多种方式调用 Bash,但我们不认为服务器可以设置任意环境变量。但是,过滤功能可能会设置环境变量。

关于这个安全漏洞的更详细分析,请访问 :https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack

常见问题解答

此常见问题解答适用于 Bash 中的安全漏洞 CVE-2014-6271。

有关 CVE-2014-6271 和 CVE-2014-7169 的额外信息,请参阅:https://securityblog.redhat.com/2014/09/26/frequently-asked-questions-about-the-shellshock-bash-flaws/

有关具有 RHEL 4 标准或高级权利但没有 ELS 的客户的附加信息,请参考 https://access.redhat.com/discussions/1211573

为什么有六个不同的 CVE?

Bash 中的原始漏洞被记录为 CVE-2014-6271。当此问题被公布后,一个研究人员发现了一个第一次发布的修复无法解决的类似的安全漏洞,它被记录为 CVE-2014-7169。之后,红帽产品安全团队研究人员 Florian Weimer 又发现了额外的问题,并对相关问题分配了 CVE-2014-7186CVE-2014-7187。最近,会报告两个安全漏洞,尽管这些漏洞的详细信息当前不可用,并且已分配了 CVE-2014-6277CVE-2014-6278。 在上面提到的前四个安全漏洞已在当前可用的 Bash 软件包中解决,最后两个漏洞也在当前可用的软件包中提供了相关的缓解措施。 在编写本文时(2014 年 9 月 30 日),没有已知的、会影响这些 Bash 软件包的安全漏洞。 有关这些安全漏洞的最新声明,请参阅相关的 CVE 页。

我认为我的系统可能会因为此漏洞而被破坏,我应该做什么?

如果您执行了本文章中的诊断步骤,且您的系统似乎仍存在安全漏洞,或者您认为您的系统已被破坏,请创建一个红帽支持问题单,或通过电话联系红帽支持

在安装了针对 CVE-2014-6271 和 CVE-2014-7169 的更新后,是否需要重启系统或重启服务?

如果您的系统使用导出的 Bash 函数,则建议重启受影响的服务。受影响的交互式用户可能需要重新登录,并可能需要重启 screen 或 tmux 会话。

为修复这些问题提供的 Bash 更新改变了环境中的导出的函数的名称。如果函数由旧版本的 Bash 导出,在进行更新后新启动的 Bash 进程无法识别该函数(基本上变为未定义)。重新启动服务可确保新版本的 Bash 会以预期的名称导出函数,使其可用。

要找出哪些服务需要重启(或者哪些用户需要重新登录),请在更新后执行以下命令:

$ grep -l -z '[^)]=() {' /proc/[1-9]*/environ | cut -d/ -f3

返回的 PID 属于在其环境中使用旧的导出的函数定义的进程。这些进程必须重启。要在 Red Hat Enterprise Linux 7 中了解哪个服务启动了哪个特定的 PID 并需要重启,请使用以下命令:

$ systemctl status <PID>

在 Red Hat Enterprise Linux 6 及更早版本中,使用 pstree -pps -axuf 命令并查找特定的 PID。

其他 shell 是否容易受此问题的影响?

红帽已测试了此问题对其他 shell 的影响。我们无法重现 Bash 中的相关行为。如果在其他 shell 中发现类似的问题,我们将根据需要发布相关的更新。

是否有针对此问题的缓解方案?

如果您无法安装更新的软件包,请参阅缓解 shellshock 漏洞(CVE-2014-6271 和 CVE-2014-7169) )来了解可能的缓解方案。 最佳缓解是安装最新的可用软件包(参阅上面的内容),这可防止所有报告的漏洞。

关于红帽网站漏洞的声明

以下为客户提供服务的红帽网站已进行了相关的更新:

  • www.redhat.com
  • access.redhat.com(红帽客户门户网站)
  • rhn.redhat.com(红帽网络)

红帽使用 Salesforce 向客户提供服务。Salesforce 已发布了一个相关的声明,确定 Salesforce 服务不受这个问题的影响。

红帽已看到利用此漏洞到对上述 Web 站点尝试进行攻击失败的情况。我们会继续监控我们的系统,以确保其机密性、完整性和可用性。

Comments