鉴于Bash 3.2(由OS X发行的版本)容易受到称为“ Shell Shock”(CVE-2014-6271和CVE-2014-7169)的远程执行攻击的攻击,我如何重建Bash并保护系统安全。苹果官方补丁?
鉴于Bash 3.2(由OS X发行的版本)容易受到称为“ Shell Shock”(CVE-2014-6271和CVE-2014-7169)的远程执行攻击的攻击,我如何重建Bash并保护系统安全。苹果官方补丁?
Answers:
苹果已经发布了针对Shellshock的Bash安全修复程序和相关漏洞,称为“ OS X bash Update 1.0 ”。对于使用OS X Mountain Lion v10.8.5或OS X Mavericks v10.9.5(它们包含在Security Update 2014-005中)的用户,可以通过常规系统更新安装它们,也可以手动安装。苹果官方修复程序也可用于OS X Lion v10.7.5和OS X Lion Server v10.7.5,但只能通过手动下载获得。可通过基于操作系统版本的不同URL获得安全修复程序:
(如果发布了新补丁,请将它们放在此处,但也请保留这些现有补丁以供参考。)
Apple补丁程序可解决Shellshock和其他几个漏洞,对大多数人来说还不错。tl; dr人们可以在这里停止阅读。
但是,Shellshock错误引起对bash的关注已引起许多研究人员对bash进行了认真研究,并且越来越多地发现(难以利用)漏洞。如果您高度关注安全性(因为可能正在运行OS X Server来托管可公开访问的网站),则您可能希望(尝试)通过自行编译bash来解决漏洞和补丁,以使其保持最新状态。否则,不用担心。
当尘埃落定于寻找进一步的漏洞时,希望苹果在将来的某个时候发布另一项更新以打击它。
bash 3.2的一组正式bash本身修补程序,修补程序52、53和54(对应于Bash 4.3修补程序25、26和27)可用,可修复CVE-2014-6271和CVE-2014-7169,以及下面显示的“游戏结束”。这已经由我(@alblue)测试过,并且该帖子也进行了相应的更新(然后进行了其他更新:该帖子在第54补丁处停止,请参见修订41)。
据报道,针对bash的许多其他漏洞。根据Michal Zalewski的帖子,如果您有54补丁(可能是Apple的官方补丁),“那么就不必担心这些错误的状态了,因为它们不再构成安全隐患:”
CVE-2014-6271-斯蒂芬(Stephane)找到的原始RCE。已由bash43-025和其他版本的相应Sep 24条目修复。
CVE-2014-7169-Tavis发现文件创建/令牌消耗错误。由bash43-026和co修复(9月26日)
CVE-2014-7186-Florian和Todd发现了大概10秒以上无风险的此处文档崩溃。由bash43-028和co(10月1日)修复。
CVE-2014-7187-弗洛里安(Florian)发现的一种不会崩溃的,可能没有秒危险的方式。由bash43-028和co(10月1日)修复。
CVE-2014-6277-未初始化的内存问题,几乎可以肯定是Michal Zalewski找到了RCE。尚无特定补丁。
CVE-2014-6278-由Michal Zalewski发现的命令注入RCE。尚无特定补丁。
变得很混乱。幸运的是,官方bash维护者Chet Ramey发布了CVE到补丁映射。他的帖子提到了bash 4.3的补丁程序,我(@OldPro)已将其翻译为bash 3.2的补丁程序,这适用于OSX。此外,自从他发布了补丁程序以来,他发布了补丁程序57,因此我在下面添加了此内容:
bash32-052 CVE-2014-6271 2014-09-24
bash32-053 CVE-2014-7169 2014-09-26
bash32-054 exported function namespace change 2014-09-27 ("Game Over")
bash32-055 CVE-2014-7186/CVE-2014-7187 2014-10-01
bash32-056 CVE-2014-6277 2014-10-02
bash32-057 CVE-2014-6278 2014-10-05
有关时间轴和更多详细信息,请参阅David A. Wheeler的文章。
@alblue通过修补程序55发布了构建说明。我(@OldPro)在说明中添加了修补程序56和57,但尚未对其进行测试。
通过执行以下测试,可以确定您是否容易受到CVE-2014-6271中的原始问题的影响:
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello
上面的输出是一个非脆弱bash
版本的示例。如果vulnerable
在该命令的输出中看到单词,则表示您bash
很容易受到攻击,应该进行更新。以下是OS X 10.8.5的漏洞版本:
对原始帖子进行了更新,并且Bash 3.2.52(1)仍然容易受到CVE-2014-7169中定义的漏洞变体的攻击。
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
上面的输出是一个易受攻击的bash
版本的示例。如果您在该命令的输出中看到日期,则表示您bash
很容易受到攻击。
研究人员指出,在没有将漏洞归类为漏洞的情况下,脚本可以使用自动导入的函数劫持子外壳中的函数:
$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over
上面的代码将在受影响的系统上显示,Game Over
而不是您期望的目录列表ls
。显然,echo 'Game Over'
可以用您想要的任何恶意代码代替。这被称为“游戏结束”错误。
在发布补丁54之前,默认情况下,NetBSD和FreeBSD均禁用了自动导入bash功能,部分是为了防止“游戏结束”,但主要是因为解析器中包含任何进一步的错误(例如CVE-2014-7169)继续被发现,并添加了新的命令行标志--import-functions
重新启用旧的默认行为。我(@alblue)已经准备了一个补丁(针对3.2.53)供其他人使用,如果他们也想采用这种行为,请在下面添加它。默认情况下,以下构建脚本中未启用此修补程序。我(@OldPro)认为此修补程序不再必要或不是一个好主意,因为它破坏了向后兼容性,并且由54修补程序和较早版本的修补程序很好地解决了它所防御的漏洞,并且启用此非官方修补程序会阻止将来应用修补程序。
(请注意问题编辑器;默认情况下,请勿启用此功能,因为它是非官方的补丁程序。)
a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch
可以通过export ADD_IMPORT_FUNCTIONS_PATCH=YES
在运行构建之前运行来启用补丁。请注意,启用此修补程序将禁用修补程序54和任何将来的修补程序,因为不能保证将来的修补程序与非官方修补程序兼容。
正如@ake_____在Twitter上指出的那样,Apple的官方补丁仍然容易受到可执行文件的环境破坏:
$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over
用户应自己决定这有多重要。我(@OldPro)认为不必担心,因为没有已知的利用此行为的方法(甚至没有提供CVE标识符),因为通常无特权的远程攻击者无法设置环境变量的名称,而具有特权的攻击者则不能使用它来获得他们尚未拥有的特权(至少在没有利用附加漏洞的情况下)。
为了提供一些背景知识,bash允许您定义函数,并且还允许您通过命令将这些函数导出到子shell export -f
。这通常是通过创建与该函数同名的环境变量并将其值设置为函数定义来实现的。所以
$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over
发生这种情况是因为export -f ls
创建了一个名为的环境变量ls
。“游戏结束”漏洞是,您可以直接创建此环境变量,而不必先定义函数,这意味着,如果可以注入正确的变量名,则可以劫持命令。苹果试图通过使其难以创建具有正确名称的变量来解决此问题。官方的bash补丁54实际上使通过使用包括%
在变量名中不允许的字符在内的变量名来创建具有正确名称的变量成为不可能,从而有效地将导出的函数定义置于不同的保留名称空间中。
如果以上都不对您有意义,请不要担心。您现在就可以使用Apple补丁了。
Bash v3.2.51附带了OS X 10.9.5(当前最新的稳定版本):
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
您可以按照以下方式获取并重新编译Bash ,前提是您已经安装了Xcode(并且xcodebuild
在接受许可证之前至少运行了一次):
$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
(注意:您可以通过复制并粘贴以上代码块来运行此代码,进入Terminal然后运行pbpaste | cut -c 2- | sh
。不过,从Internet运行随机脚本时请务必小心...)
之后,Bash版本应为v3.2.57:
$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
为了安全起见,在测试之后,我建议您chmod -x
使用旧版本以确保它们不会被重新使用,或将其移至备份站点。
$ sudo chmod a-x /bin/bash.old /bin/sh.old
其他答案为使用MacPorts或Homebrew的用户提供了解决方案。这些并不能解决问题,它们只是安装了其他版本的Bash。如果要专门升级这些答案,请参阅这些答案。
感谢Chet,他负责bash的工作,并一直在提供这些修补程序。感谢所有对此发表评论并随时间改进的人。
现在,Apple已发布了真正的修复程序,尽管它可能仍然有用。因为他们只发布了Lion和up的修复程序,并且官方补丁提供了GNU bash版本3.2.53(1)-发行版(x86_64-apple-darwin13),但是Game over Bug仍然有些脆弱。此时,针对3.2.57重建自己的Bash版本可能比依赖Apple的补丁程序更安全,除非您做错了。
这将为您提供bash版本4.3.28(1),该版本修复了漏洞(CVE-2014-6271和CVE-2014-7169)以及一些随后发现的漏洞。如果您已将Shell更改为使用Macports bash来获取版本4功能,这将非常有用。
它不会像have #!/bin/sh
或#!/bin/bash
第一行那样解决标准OS脚本的问题。这类问题是为什么Macports尝试不使用Apple提供的程序版本的原因,因为Macports往往更新得更快,例如它具有较新的bash版本)
您可以像Homebrew答案中那样使用终端
要安装的MacPorts遵循这些说明它们是
1.安装Xcode和Xcode的命令行工具
2.同意在终端的Xcode许可证:命令xcodebuild联编-license
3.下载MacPorts的PKG你的OS X版本:链接页面上的
4。运行pkg
安装了Macport之后,您需要最新版本,这是通过运行
sudo port selfupdate
并重新编译或获取最新的二进制文件
sudo port upgrade outdated
bash
通常来自OS X 的地方的修复程序-因此是系统修复程序,Homebrew和MacPorts修复程序。可能还有芬克。如果这是对@AlBlue答案的编辑,我个人比较喜欢。因此,这就是一个最正确的答案。
关于官方Apple OS X bash Update 1.0的注意事项:此软件更新仅使官方Apple bash版本达到3.2.53。3.2.54修补程序修订版提供了以下更改:
此修补程序更改了bash用于导出函数的编码,以避免与shell变量冲突,并避免仅依赖于环境变量的内容来确定是否将其解释为shell函数。
对于已经使用3.2.54二进制文件修补系统的用户,您可以将编译后的二进制文件替换为Apple修补程序,也可以保留原样,但建议不要这样做。尽管Apple在3.2.53保留了其二进制版本,但Apple补丁确实包含以下漏洞利用测试的修复程序:
env X='() { (a)=>\' sh -c "echo date"; cat echo
这意味着Apple官方3.2.53二进制文件包含与香草GNU 3.2.54二进制文件等效的安全性。一个不幸的混乱点,但事实就是如此。苹果的修复方法并不成熟。它似乎是该问题的完整解决方案。因此,以下编译香草bash
和sh
来自GNU源码的路线图应被视为历史性工件,并可能在将来有必要时作为将来如何打补丁的模板进行参考。
注意:使用原始GNU源代码时,sh
存在特权提升问题,该问题会导致各种安装程序(例如Adobe Flash)中的失败。我强烈建议您坚持使用Apple修补的二进制文件。考虑不建议使用此补丁方案,并建议不要这样做。
有一个新的GNU bash 3.2.55补丁程序描述了以下修复程序:
错误说明:
在给定许多附加到单个命令的here-documents或许多嵌套循环中,parse.y中存在两个本地缓冲区溢出,这可能导致外壳转储内核。
我们让温柔的读者决定是坐在苹果官方发行的二进制文件中,还是自己动手处理新的漏洞。就个人而言,我将坚持使用Apple二进制文件。
这篇文章详细介绍了如何编译和安装香草bash
和sh
在OS X上我选择了这条路的下面的例子使用特定的苹果消息人士没有离开我用正确的补丁版本的细节。YMMV。但是,这种原始安装旨在替换OS X二进制文件,这样当Apple最终发布安全更新时,这些原始替代品将被其适当的Apple对手所取代。
我的基本配置是:
装有所有命令行实用程序的OS X Lion 10.7.5和Xcode 4.6.3。
我要解决的步骤是:
从以下位置下载3.2.48的基本bash源代码:
https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz
从以下位置下载bash3.2.49,.50,.51,.52,.53,.54和.55补丁:
https://ftp.gnu.org/gnu/bash/bash-3.2-patches/
我将它们另存为$ filename.patch,例如bash3.2.50.patch。
CD进入您的下载目录,然后…
解压主要源分支:
tar xzvf bash-3.2.48.tar.gz
cd bash-3.2.48
假设您已如前所述重命名了下载的补丁文件,
cp ../*.patch .
然后 …
for file in *.patch ; do
patch -p0 < $file
done
这应该显示各种文件的成功补丁。如果没有,准备做一些探索和调查。
下一个:
sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old
这基本上备份了您的旧的,易受攻击的bash和sh shell,并删除了它们的可执行特权。这样一来,您便可以根据需要还原命令,但同时也消除了它们造成损坏的能力。
下一个:
./configure --prefix=/ ; make ; sudo make install
这应该正确配置,编译新的bash二进制文件并将其安装到/ bin中。完成后,退出Terminal并重新打开。
您应该开心并微笑着,bash --version
并且现在可以看到3.2.55,例如:
Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.
上面命令中的确切输出将因您的OS X版本而异。
您还应该能够测试您的漏洞bash
并发现它很好。
注意:到目前为止,我们仅修复了bash,但是/bin/sh
可执行文件仍处于易受攻击的状态。仅仅bash
在顶部复制sh
是一种Linux风格的服务器。OS X的sh
实现与有所不同bash
,因此您需要再次拖出编译器。有关OS X的方式bash
和sh
区别的更多信息,请参见:
https://apple.stackexchange.com/a/89327/91441
在您的下载目录中:
make clean
在您最喜欢的编辑器中,打开文件Makefile.in
并滚动到第99行。我们将更改Program行,以便输出的二进制文件sh
不再是bash
这样的:
Program = sh$(EXEEXT)
保存然后
./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install
现在,您将sh
几乎完全像苹果公司那样构建。
最后一点:在某些(所有?)系统上,Apple通常似乎将bashbug
可执行文件放在中/usr/bin
。我们的编译将把它放入/bin
。因此,这里的最后步骤是:
sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug
READLINE_LIB = /usr/local/lib/libreadline.a
并进行干净编译。然后在/bin/bash
和/bin/sh
HISTORY_LIB = /usr/local/lib/libhistory.a
。否则,bash将动态链接到libhistory的/ usr / local版本。
bash
会因为内核不同而无法表现出来。无论如何,我认为我的解决方案是暂时的;最终,苹果公司会得到解决,以修补这个问题,我的编译的二进制文件将被取代(这是我编译成主要原因/bin
摆在首位。
自9月29日起,对于那些努力从源代码进行编译的人,Apple正式发布了Mac OS X 10.9.5、10.8.5和10.7.5的修补程序:
首先,为此漏洞修补bash和sh可能会破坏Mac上的某些脚本。除非您直接从Mac向公共互联网提供Web服务,否则您实际上不需要这样做。因此,如果真的没有必要,请等到Apple发布正式的安全更新。
请注意,这里有一些有关如何在Mavericks 10.9上使用Brew进行更新的说明。
首先确认您使用的是过时的bash:
$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
最新的bash是4.3.25
如果您没有安装Xcode,则需要Xcode命令行工具,可以通过以下方式安装
$ xcode-select --install
或从开发人员门户。
要安装Brew(http://brew.sh):
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后做:
$ brew doctor
如果有问题,请按照任何说明进行操作。这里解决了许多常见的问题。
然后将brew更新到最新的软件包列表:
$ brew update
要获取最新的bash 4.3.25:
$ brew install bash
这会将bash安装到 /usr/local/Cellar/bash/4.3.25/bin/bash
旧的bash
和sh
仍然存在的/bin
,所以在安装后,你会重命名旧的可执行文件到一个新的文件。
$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old
如果您非常偏执,可以在 bash_old
$ sudo chmod a-x /bin/bash_old /bin/sh_old
然后创建一个指向Brew安装的新bash 4.3.25的符号链接。
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh
重新启动并完成。
警告-这可能会破坏某些可能依赖bash 3.2的现有shell脚本或Mac sh
与linux 的差异sh
。@TraneFranks在同一线程中给出的答案中有一个更复杂的答案来替换源中的bash和sh。
/bin/bash
与/bin/sh
升级到Brew的最新bash相比,它可能引起的问题更少。
@AlBlue的帖子非常完整。但是,在我的OS X 10.6.8服务器上,他的修复无效。Apple没有针对10.6.8的修复程序,@ AlBlue解释的步骤不适用于Xcode 3.2.6(这是Snow Leopard的最新版本)。我收到一个错误:
** BUILD FAILED **
The following build commands failed:
sh:
CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)
为此我使用brew.sh。当您对OS X 10.6.8 Snow Leopard有更好的解决方案时,请评论您的想法。另请参阅@Jerome的评论,他使用@AlBlue的解决方案成功在OS X 10.6.8 Snow Leopard上进行了补丁。无论如何:
首先使用以下oneliner安装brew:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
更新资料 brew
brew update
现在,只需安装最新版本bash
并替换当前版本即可:
brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash
您可以Command (complete path)
在Terminal.app的首选项(Command,)中
设置默认的登录外壳' '
注意:在注释中,某些用户认为此方法不合适。但是对我来说,这是在OS X 10.6.8 Snow Leopard上升级BASH的唯一可理解的方法。
sh
-您也需要这样做。/bin/sh
!= /bin/bash
。/bin/sh
运行系统命令时,许多工具都会提供支持。system()
例如,/bin/sh
当您具有需要在字符串中扩展的shell扩展字符时,将使用Ruby的调用。您正在使用Homebrew来更新IMO的系统二进制文件,正在玩一场失败的游戏。bash
除了对系统二进制文件进行适当的更新之外,您还应该更新Homebrew 。
xcodebuild
吗?如果是这样,我没有经历过。我没有什么好建议可以给您:请检查您是否有多个bash构建,考虑进行清理(彻底卸载),并可能重新安装xcode ...然后重新开始修补过程。
您可以在此处按照说明进行操作:https : //github.com/tjluoma/bash-fix基本上,请在终端中执行以下操作:
curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f