如何重新编译Bash以避免Shellshock(远程利用CVE-2014-6271和CVE-2014-7169)?


368

鉴于Bash 3.2(由OS X发行的版本)容易受到称为“ Shell Shock”(CVE-2014-6271CVE-2014-7169)的远程执行攻击的攻击,我如何重建Bash并保护系统安全。苹果官方补丁?

更新:请注意,Apple现在已经发布了官方补丁。有关详情,请参见下文


5
:苹果已经发布了一个补丁support.apple.com/kb/DL1769
AT

1
上面提到的OS X bash Update 1.0修补程序特定于OS X 10.9.5或更高版本-都是这些:OS X 10.7.5(Lion),OS X 10.8.5(Mountain Lion),OS X 10.9.5(小牛)。
2014年

是的,我在9小时前添加了链接,但是它们被错误地删除了。 apple.stackexchange.com/revisions/146849/10
AlBlue

创建了要点gist.github.com/dnozay/395dcdef05c6b4b1836a,该步骤具有大多数步骤,并且已经包含补丁程序(应该在OSX 10.6上运行)。
dnozay 2014年

@dnozay感谢您的要旨!请对其进行更新,以包括补丁55和56(已发布)和补丁57(即将发布)。
老职业

Answers:


429

状态

苹果已经发布了针对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终端的屏幕截图显示了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之前,默认情况下,NetBSDFreeBSD均禁用了自动导入bash功能,部分是为了防止“游戏结束”,但主要是因为解析器中包含任何进一步的错误(例如CVE-2014-7169)继续被发现,并添加了新的命令行标志--import-functions重新启用旧的默认行为。我(@alblue)已经准备了一个补丁(针对3.2.53)供其他人使用,如果他们也想采用这种行为,请在下面添加它。默认情况下,以下构建脚本中未启用此修补程序。我(@OldPro)认为此修补程序不再必要或不是一个好主意,因为它破坏了向后兼容性,并且由54修补程序和较早版本的修补程序很好地解决了它所防御的漏洞,并且启用此非官方修补程序会阻止将来应用修补程序。

(请注意问题编辑器;默认情况下,请勿启用此功能,因为它是非官方的补丁程序。)

a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch

可以通过export ADD_IMPORT_FUNCTIONS_PATCH=YES在运行构建之前运行来启用补丁。请注意,启用此修补程序将禁用修补程序54和任何将来的修补程序,因为不能保证将来的修补程序与非官方修补程序兼容。

Apple Patch具有Game Over漏洞,

正如@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的补丁程序更安全,除非您做错了。


18

麦克波特

这将为您提供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

5
由于这是关于修复现有二进制文件中的安全漏洞,并且不会替代/修复易受攻击的二进制文件,因此我看不到如何解决此问题。
AlBlue

它欺骗了Macports版本-确实是在要求IanC的评论
马克

是。我们应该列出所有bash通常来自OS X 的地方的修复程序-因此是系统修复程序,Homebrew和MacPorts修复程序。可能还有芬克。如果这是对@AlBlue答案的编辑,我个人比较喜欢。因此,这就是一个最正确的答案。
伊恩·C(

2
@InaC这些应该分开,因为答案确实不同,并且不能检查一个大的答案;例如,看到我说这不能解决Apple的bash和自制的答案通过OSX复制Homebrew的bash的问题。实际上,它们是单独的问题
标记

参见我对@AlBlue答案的编辑。我不同意这些应该分开。
伊恩C.

17

关于官方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二进制文件等效的安全性。一个不幸的混乱点,但事实就是如此。苹果的修复方法并不成熟。它似乎是该问题的完整解决方案。因此,以下编译香草bashsh来自GNU源码的路线图应被视为历史性工件,并可能在将来有必要时作为将来如何打补丁的模板进行参考。

注意:使用原始GNU源代码时,sh存在特权提升问题,该问题会导致各种安装程序(例如Adobe Flash)中的失败。我强烈建议您坚持使用Apple修补的二进制文件。考虑不建议使用此补丁方案,并建议不要这样做。

有一个新的GNU bash 3.2.55补丁程序描述了以下修复程序:

错误说明:

在给定许多附加到单个命令的here-documents或许多嵌套循环中,parse.y中存在两个本地缓冲区溢出,这可能导致外壳转储内核。

我们让温柔的读者决定是坐在苹果官方发行的二进制文件中,还是自己动手处理新的漏洞。就个人而言,我将坚持使用Apple二进制文件。


这篇文章详细介绍了如何编译和安装香草bashsh在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的方式bashsh区别的更多信息,请参见:

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

1
不要抱怨什么的,但是当问题是“如何做我编译bash的”我的回答是“请点击以下链接到这个问题的答案,似乎总结要求站立。
特灵Francks

2
知道了:bash随附的readline库与10.6不兼容。改为安装GNU readline,然后修改bash makefile以使用它。安装readline:ftp.cwru.edu/pub/bash/readline-6.3.tar.gz 在bash中,完成配置后,在Makefile中设置READLINE_LIB = /usr/local/lib/libreadline.a并进行干净编译。然后在/bin/bash/bin/sh
Seth Noble

2
附录:在bash Makefile中,还需要进行设置HISTORY_LIB = /usr/local/lib/libhistory.a。否则,bash将动态链接到libhistory的/ usr / local版本。
赛斯·诺布尔

1
请注意,可从Apple开源页面下载的版本具有自定义更改,以使其可在OSX上使用。我不建议您使用原始的上游bash,否则您将无法按原样替换。
AlBlue

1
苹果进行了许多更改,以优化系统上的开源工具。就是说,我看不出香草在哪里bash会因为内核不同而无法表现出来。无论如何,我认为我的解决方案是暂时的;最终,苹果公司会得到解决,以修补这个问题,我的编译的二进制文件将被取代(这是我编译成主要原因/bin摆在首位。
特灵Francks

15

自9月29日起,对于那些努力从源代码进行编译的人,Apple正式发布了Mac OS X 10.9.5、10.8.5和10.7.5的修补程序:


1
谢谢!这可能比许多大多数重新编译要容易。
AlBlue

@AlBlue同意。而且,尽管有些地方指出补丁不是很干净,但这总比没有好。而且比一些新手在恐慌中编译源代码要安全得多。
JakeGould 2014年

2
与往常一样,软件更新传播延迟是完全有效的。我想知道包装要花多长时间才能显示出来。令人耳目一新的是,Apple对这个问题的反应很快!
特兰·

2
@TraneFrancks“像往常一样,软件更新的传播延迟是完全有效的。”我真的不明白,将U2完整专辑推给所有iOS用户的组织如何以某种方式阻止不到4MB的安全更新。
JakeGould 2014年

@JakeGould:嘿。是的,这是一个傻笑。我刚刚在此Lion系统上检查了软件更新,它声称该系统是最新的。与此处的另一个Mountain Lion系统相同。
特兰·弗朗克斯

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

旧的bashsh仍然存在的/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。


4
从3.2.51修补到3.2.52所造成的损害要比升级到4.3.anything少。
AlBlue

我警告说,它可能会破坏某些脚本,但是Brew当前安装的是4.3.25版-我正在尝试提供一个易于安装的版本,以便从头开始安装。而且,您始终可以通过将旧的可执行文件重命名来还原。
Christopher Allen

2
该错误可被恶意DHCP服务器(例如WiFi热点)利用,并且可以完全伪装您的计算机,因此值得尽快修复。其他答案具有更好的替换指导,/bin/bash/bin/sh升级到Brew的最新bash相比,它可能引起的问题更少。
旧专业版

Mac可能不容易受到DHCP攻击。
Christopher Allen

10
仅当您的DHCP客户端使用Bash脚本时才可能发生DCHP服务器攻击,而OSX实施则不这样做。
AlBlue

5

OS X 10.6.8-雪豹

@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的唯一可理解的方法。


1
也有一些脚本依赖bash 3而不能与bash 4一起使用(macports已修复bash 4.3.25,我认为自制软件已更新为
马克

2
您也没有更新sh-您也需要这样做。/bin/sh!= /bin/bash/bin/sh运行系统命令时,许多工具都会提供支持。system()例如,/bin/sh当您具有需要在字符串中扩展的shell扩展字符时,将使用Ruby的调用。您正在使用Homebrew来更新IMO的系统二进制文件,正在玩一场失败的游戏。bash 除了对系统二进制文件进行适当的更新之外,您还应该更新Homebrew 。
伊恩C.

1
请记住,OSX 10.8和10.9使用Bash 3.2,因此为了直接保持一致,我选择使用3.2作为版本。这也是基于它放在苹果官方搭建的先前版本,其中可能包括像额外的扩展属性的认识等等
AlBlue

1
我在所有实例上都运行3.2.6。我了解运行时构建失败xcodebuild吗?如果是这样,我没有经历过。我没有什么好建议可以给您:请检查您是否有多个bash构建,考虑进行清理(彻底卸载),并可能重新安装xcode ...然后重新开始修补过程。
杰罗姆

1
我在Snow Leopard上使用手工构建的bash-4.3 遇到了严重的作业控制问题(如果我启动emacs然后将其挂起,则无法使用'fg'恢复它)。从那以后,我已经从opensource.apple.com/release/mac-os-x-1068下载了bash的Snow Leopard源代码,并应用了ftp.gnu.org/gnu/bash/bash-3.2-patches的补丁程序,并将其重建为效果要好得多。
mormegil 2014年

-6

您可以在此处按照说明进行操作:https : //github.com/tjluoma/bash-fix基本上,请在终端中执行以下操作:

curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f

5
从随机的github帐户执行随机的shell脚本并不是您在任何机器上都能获得更安全情况的方式。您想信任终点。
伊恩C.

我必须在这里同意伊恩。通过不受信任的Shell脚本引入一些戏剧性的损害真的很容易,例如这些CVE描述的问题。
特兰·弗朗克斯

强烈反对FUD的这种传播。执行之前,请仅从https://阅读所有shell脚本。
dhchdhd 2014年
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.