什么是CVE-2014-6271 bash漏洞(Shellshock)以及如何解决?

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

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

什么是Bash?

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

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

漏洞如何影响我?

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

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

  • 使用特定设置(例如git over ssh)远程连接到SSH等服务。 正如Mitre警告的那样,使用sshd ForceCommand选项是攻击向量。 shell不是bash的帐户不受影响。
  • 欺骗你设置环境变量。
  • 导致另一个程序设置环境变量以获得该值。 例如,您可能有一个Web服务器和脚本需要设置具有特定用户内容的环境变量。 即使该脚本创建了自己的脚本,也没有触及其他环境变量,它就足够了。 具有任何名称和精心设计值的单个环境变量足以使漏洞利用成功
  • 我在这里没有提到的其他方法。

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

重要的是要注意,即使你不自己使用bash,许多程序也会自行生成bash作为其操作的一部分。 即使在这种情况下,你也很脆弱。 但是,Ubuntu的/bin/sh不是bash,因此只有显式调用bash而不是默认脚本shell的程序才会受到影响。

根据米特尔:

涉及OpenSSH sshd中的ForceCommandfunction,Apache HTTP Server中的mod_cgi和mod_cgid模块的向量,由未指定的DHCP客户端执行的脚本,以及在Bash执行的特权边界内设置环境的其他情况。

我很脆弱吗?

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

 dpkg -s bash | grep Version 

这将在您的bash包中查找信息,并过滤输出以仅显示版本。 固定版本为4.3-7ubuntu1.44.1-2ubuntu3.4

例如,我看到:

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

并且可以确定我不易受伤害。

我该如何更新?

标准更新管理器将为您提供此更新。 这是安全更新如何重要的一个主要示例,无论您使用何种操作系统或维护良好。

USN公告称已经发布了针对Ubuntu 14.04 Trusty Tahr,12.04 Precise Pangolin和10.04 Lucid Lynx的新版本。 如果您不是这些LTS版本之一,但是处于合理的最新版本,那么您很可能能够找到修补的软件包。

首先,检查一下你

如果你很脆弱,你应该先获取最新的软件包列表:

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

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

虽然在生成bash时这个bug似乎才会发挥作用,但如果可行的话,立即重启仍然是个好主意。

在黑客新闻中偷走了这个cft 。 如果你像我这样的回购邮件有问题(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会在/usr/local/bin安装bash,所以/bin/bash不会被修改,可以从curl调用!!

注意: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 

如果你在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 

如果没有下载所需的patche然后安装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" 

我正在使用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的子目录。

我做了以下更改以避免对texlive依赖:在bash-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命令debuild 。 注意 – 其中任何一个都会从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