什么是CVE-2014-6271 bash漏洞(Shellshock),我该如何解决?


141

最近,有关于“ CVE-2014-6271”(请参阅USN-2362-1)的新闻,这是Bash中的漏洞。我怎么知道我是否受此影响,如何解决它,为什么我要关心?

由于其范围和严重性,它被设计为此漏洞的规范答案。


18
“我如何解决它?” -> 只需运行您的升级管理器!确实,Ubuntu发布了安全更新,有专门的安全团队。请不要发布有关从源代码构建Bash的答案!; 它不必要地复杂,将来很难维护您的系统。
gertvdijk

5
另外,还有针对不完整修复程序的其他CVE。CVE-2014-7169
gertvdijk 2014年

18
关于从源文件编译后的答案。无论是否应该,有些人都拥有古老的Ubuntu服务器,从源代码构建可能是他们的唯一选择。
GaryO 2014年

3
抱歉,我只是意识到我在测试中放了bash而不是破折号。没关系,这很好。
Matt H

Answers:


126

什么是Bash?

Bash是Ubuntu中默认的交互式shell。当您与终端连接时(通过终端仿真器,通过tty或ssh),通常是键入bash将读取并执行的命令。即使您根本不使用终端,您仍然可以使用Bash。

在Ubuntu上,/bin/sh不是bash(是破折号)。仅bash受此漏洞影响。

漏洞利用对我有何影响?

Bash和OS会跟踪一组环境变量,这些变量描述了当前登录的用户,在硬盘上寻找程序的位置以及其他此类功能。通过制作具有特定结构的环境变量,攻击者可能能够在Bash下次启动时执行代码。

攻击者可以通过多种方式设置该环境变量:

  • 通过特定的设置(例如git over ssh)远程连接到服务(例如SSH)。正如Mitre所警告的那样,使用sshd ForceCommand选项是一种攻击手段。外壳不是bash的帐户不受影响。
  • 欺骗您设置环境变量。
  • 使另一个程序将环境变量设置为具有该特定值。例如,您可能有一个Web服务器和脚本,需要使用特定的用户内容设置环境变量。即使该脚本创建了自己的脚本,并且不涉及其他环境变量,也足够了。具有任何名称和特定值的单个环境变量足以使攻击成功
  • 我这里没有提到的其他方式。

一旦他们设置了该变量,下一次bash由于任何原因将打开,攻击者的代码将运行。使用时,这尤其令人恐惧sudo -s,因为它以超级用户身份(完全控制计算机数据和程序的管理用户规则)生成bash 。即使您仅以标准用户身份启动bash,也可以删除该用户的文件。

重要的是要注意,即使您自己不使用bash,许多程序也会在操作过程中自行生成bash。即使在这种情况下,您也很脆弱。但是,Ubuntu /bin/sh不是bash,因此仅显式调用bash的程序不受默认脚本外壳的影响。

根据Mitre:

涉及OpenSSH sshd中的ForceCommand功能的矢量,Apache HTTP Server中的mod_cgi和mod_cgid模块,由未指定的DHCP客户端执行的脚本以及其他设置环境跨越Bash执行权限的边界的情况。

我容易受到伤害吗?

使用dpkg检查安装的软件包版本:

dpkg -s bash | grep Version

这将在您的bash软件包上查找信息,并过滤输出以仅向您显示版本。固定版本4.3-7ubuntu1.44.2-2ubuntu2.54.1-2ubuntu3.4

例如,我看到:

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

并可以确定我不脆弱。

我该如何更新?

标准更新管理器将为您提供此更新。这是一个重要示例,说明无论您使用什么操作系统或维护程度如何,安全更新的重要性。

USN公告指出,新的版本已经发布的Ubuntu 14.04忠实的塔尔羊,12.04精确穿山甲和10.04清醒山猫。如果您不是使用这些LTS版本之一,而是使用相当近期的版本,则您很可能能够找到已打补丁的软件包。

首先,检查您是否

如果您容易受到攻击,则应首先获取最新的软件包列表:

sudo apt-get update && sudo apt-get install bash

第一个命令确保您具有包含固定版本的最新软件包列表,第二个命令安装bash的最新(固定)版本。

虽然该错误仅在生成bash时才起作用,但在可行的情况下立即重新启动仍然是一个好主意。


20
抱歉,您很脆弱。原始补丁无法解决整个问题。请参阅cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169 AFAIAA,目前没有公开可用的修复程序。例如参见people.canonical.com/~ubuntu-security/cve/pkg/bash.html
Mormegil

4
@hexafraction您从哪里读到12.10对此进行了更新?我认为不是,12.10、13.04、13.10的寿命终了!而且,反向端口存储库也不用于安全更新
gertvdijk 2014年

2
@hexafraction不,他们没有!那就是终止生命的全部意义:不再支持。
gertvdijk 2014年

1
@MichaelHärtl如果您使用的是Ubuntu 12.10,则可以从packages.ubuntu.com/precise/bash下载bash的12.04版本并手动安装。
大卫

2
CVE-2014-7169的修复程序在更新管理器中(对我而言)可用。
Calmarius 2014年

27

在Hacker News偷走了这笔。如果您在像我这样的存储库(Odroid-XU)上遇到麻烦,那么如果您想从源代码进行修补/构建,这应该很好用。

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR

然后运行:

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

那你们都很好!


警告: make install将在bash中安装bash /usr/local/bin,因此/bin/bash未经修改,可以从curl调用它!


1
以下是在Debian Lenny
Matt White

13
-1。无需从源代码构建。Ubuntu在存储库中有一个安全补丁。如果您有“仓库问题”,请改正它。如果不进行安全升级,您可能会在许多方面受到威胁!
gertvdijk

1
@马特·怀特谢谢!您刚刚救了我几个小时:)
弗洛里安·菲达

5
@FlorianFida这是AskUbuntu!希望该站点上的每个人都能在使用Ubuntu的范围内发布答案。
gertvdijk 2014年

6
@MichaelHärtl12.10即将终止。很长时间以来,它不再接收任何安全更新。升级!!!
gertvdijk 2014年

9

注意:CVE-2014-7169的安全修补程序已作为标准安全更新发布。无需添加其他ppa即可接收此补丁。仅需要以下内容。

sudo apt-get update

sudo apt-get upgrade

为了确保正确修补了bash,请运行以下命令

dpkg -s bash | grep Version

如果您使用的是14.04 LTS,则应该看到以下输出:

Version: 4.3-7ubuntu1.4

如果使用的是12.04 LTS,则输出应为:

 Version: 4.2-2ubuntu2.5

1
这是正确的,但是现已提供了官方补丁程序,因此安全更新已发布。因此,这些步骤不再是必需的。
罗比·巴萨克

这是对的。我将编辑以上帖子。谢谢。
branch.lizard 2014年

1

如果您使用的是11.04:请使用以下步骤(对我有用)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

如果未下载所需补丁,则安装ftp软件包

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

要查看是否已应用补丁:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

0

我正在使用Natty 11.04,这是EOL(并且我已经将/etc/apt/sources.list更新为使用old-releases.ubuntu.com),所以我必须从源代码进行构建。我想构建一个.deb,因此至少软件包管理是“意识到”的,bash版本不是默认版本。我不是100%成功的-但是,该软件包被注册为“较新的”,并且bash二进制文件最终被修复,所以这是我所做的:

apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

现在,在(子)目录bash-4.2/中有:一个文件bash-4.2.tar.xz,需要解压缩才能获取bash源文件;还有一个名为的子目录debian

我进行了以下更改以避免依赖texlivebash-4.2/debian/control

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

...并在bash-4.2/debian/rules

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

要更改版本,请在此bash-4.2/目录中执行以下操作:

bash-4.2$ dch --local patchCVE

...,并在询问时填写变更日志中的注释。这将确保调用.deb(及相关元数据)(在我的情况下)bash_4.2-0ubuntu3patchCVE1_i386.deb

然后,您可以尝试使用dpkg-buildpackage -us -ucdebuild命令进行构建。注意-这些都将重新从zip中解压缩源-因此将覆盖您可能拥有的所有补丁!不过,请运行其中之一,以便解压缩并构建源代码(debuild由于texlive,最后可能仍会失败,但是它应该解压缩并构建源代码)。

然后,应用补丁;注意,您应该-p1在这里使用,因为当前您在bash-4.2/目录中:

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

然后通过运行以下命令重建修补的版本:

bash-4.2$ fakeroot debian/rules build 

这将重建可执行文件。测试一下:

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

要生成.deb文件,请运行:

bash-4.2$ fakeroot debian/rules binary

这会将.deb文件保存在父目录中。列出他们的内容:

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

要安装.deb:

bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

但是,由于某种原因,此.deb包含未修补的二进制文件(?!),因此我不得不另外执行以下操作:

bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/

...然后,测试对我而言已正确通过:

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for `VAR'
Bash Test

问题:原始问题指出1种可能的攻击媒介为“未指定的DHCP客户端执行的脚本”。这是什么意思?这是否意味着Ubuntu的/ sbin / dhclient <-容易受到攻击?
麸皮

我认为未指定的客户端可能意味着Ubuntu感染了/ sbin / dhclient,该客户端随后运行命令,导致bash脚本启动shellshock。那是什么DHCP客户端容易受到Shellshock的攻击?(希望如此,请看我从10月10
Bran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.