最近,有关“CVE-2014-6271”的消息四处流传(参见USN-2362-1),这是 Bash 中的一个漏洞。我如何知道我是否受此影响,如何修复它,以及我为什么要关心它?
由于该漏洞的范围和严重性,这被设计为针对该漏洞的规范答案。
答案1
什么是 Bash?
Bash 是 Ubuntu 中的默认交互式 shell。当您与终端交互时(通过终端仿真器、tty 或 ssh),您通常会输入bash
将读取并执行的命令。即使您根本不使用终端,您仍然有 Bash。
在 Ubuntu 上,/bin/sh
不是 bash(而是 dash)。只有 bash 受到此漏洞的影响。
此漏洞对我有何影响?
Bash 和操作系统跟踪一组环境变量描述当前登录用户、在硬盘上查找程序的位置以及其他此类功能。通过制作具有特定结构的环境变量,攻击者可能能够在下次启动 Bash 时执行代码。
攻击者可以通过多种方式设置该环境变量:
- 使用特定设置(例如通过 ssh 连接 git)远程连接到 SSH 等服务。正如 Mitre 所警告的那样,使用 sshd
ForceCommand
选项是一种攻击媒介。shell 不是 bash 的帐户不会受到影响。 - 诱骗您设置环境变量。
- 导致另一个程序将环境变量设置为具有该精心设计的值。例如,您可能有一个 Web 服务器和脚本,需要设置具有特定用户内容的环境变量。即使该脚本创建了自己的环境变量,并且不触及其他环境变量,这也足够了。一个具有任意名称和精心设计的值的环境变量就足以让漏洞利用成功。
- 其他方法我这里没有提到。
一旦他们设置了这个变量,下一次bash
打开任何原因在于,攻击者的代码将被运行。这对于 来说尤其可怕sudo -s
,因为它会以超级用户身份生成 bash(具有以下权限的管理用户规则)满的控制计算机的数据和程序)。即使您仅以标准用户身份启动 bash,该用户的文件也可能会被删除。
需要注意的是,即使您自己不使用 bash,许多程序也会在运行过程中自行生成 bash。即使在这种情况下,您也容易受到攻击。但是,Ubuntu 不是/bin/sh
bash,因此只有明确调用 bash 而不是默认脚本 shell 的程序才会受到影响。
根据 Mitre 的说法:
涉及 OpenSSH sshd 中的 ForceCommand 功能、Apache HTTP 服务器中的 mod_cgi 和 mod_cgid 模块、未指定的 DHCP 客户端执行的脚本,以及其他跨 Bash 执行权限边界设置环境的情况。
我是否很脆弱?
使用 dpkg 检查您安装的软件包版本:
dpkg -s bash | grep Version
这将查找有关您的bash
软件包的信息,并过滤输出以仅显示版本。修复的版本是4.3-7ubuntu1.4
,4.2-2ubuntu2.5
, 和4.1-2ubuntu3.4
。
例如,我看到:
wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4
并且可以确定我并不脆弱。
我如何更新?
标准更新管理器将为您提供此更新。这是一个典型的例子,说明安全更新的重要性,无论您使用什么操作系统,无论操作系统维护得如何好。
这美国海军公报声明已发布适用于 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 生成时才会发挥作用,但如果可行的话,立即重新启动仍然是一个好主意。
答案2
偷了这Hacker News 上的 cft。如果您像我(Odroid-XU)一样遇到了 repos 问题,那么如果您想从源代码进行修补/构建,这应该可以很好地工作。
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 /usr/local/bin
,因此/bin/bash
不会被修改并且可以从 curl 调用!!
答案3
注意: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
答案4
我使用的是 Natty 11.04,它已经停产(我已经更新了 /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 -uc
或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