“破壳”漏洞深度剖析

时间:2022-07-07 12:01:15

【 摘 要 】 著名Shell软件Bash的“破壳”漏洞席卷全球,引起业内人士的全面关注。文章从该漏洞的披露过程出发,深入剖析漏洞的工作原理和可被利用的攻击方式。通过分析该漏洞所造成的影响,提出与漏洞处理的技术手段相比,漏洞处理的机制问题更值得反思。

【 关键词 】 “破壳”漏洞;Bash;env;CVE

Deep Analysis of “Shellshock”

Guo Rui

(Guangzhou School of Administration, Information and Network Center GuangdongGuangzhou 510070 )

【 Abstract 】 “Shellshock” vulnerability of Bash shocks the global network, and IT insiders focus on it all over the world. This thesis shows the discovery process of the vulnerability, and deeply analyses the work theory and attack methods of it. After discussing the influence of the vulnerability, it shows that the processing mechanism of vulnerability is more important than the technical method.

【 Keywords 】 "shellshock"; bash; env; cve

1 引言

2014年9月24日,NVD(美国国家漏洞库)披露了著名Shell软件GNU Bash的一个严重漏洞(CVE-2014-6271),该漏洞将导致远程攻击者在受影响系统上执行任意代码,被形象地称为“破壳”(Shellshock)。

该漏洞由法国GNU/Linux研究者StéphaneChazelas发现,影响目前主流的Linux和Mac OS操作系统平台,同时影响到与Bash交互的多种应用,包括Apache、OpenSSH、DHCP等。该漏洞存在于Bash 4.3及之前的所有版本中,已存在约20年,全球至少150万台主机受其影响。NVD将该漏洞的严重性定义为10级(最高),而上半年席卷全球三分之二服务器的OpenSSL“心脏出血”漏洞(CVE-2014-0160)才被定义为5级,其严重程度可想而知。

2 漏洞原理

在计算机科学领域,Shell俗称为“壳”,用于区别于内核,是作为使用者的人机接口界面软件。Bash最早是GNU计划为Unix系统编写的一个命令行式Shell,现在已经作为主流Linux平台的内定Shell被广泛使用。Shell作为操作系统的命令解析器,将操作者输入的命令行指令和脚本进行解析后,交给操作系统内核进行处理。

此次发现的“破壳”漏洞正是发生在Bash解析命令行指令的时候,可以运行以下代码来检测其是否存在:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

若该版本Bash存在“破壳”漏洞,将出现如下结果:

“破壳”漏洞公布之后,Bash成为全球黑客瞄准的目标,大家争相寻找Bash的其他漏洞。于是,Bash的其它漏洞被相继发现并披露(CVE-2014-7169, CVE-2014-7186, CVE-2014-7187, CVE-2014-6277, CVE 2014-6278),而且这一系列漏洞的原理都与“破壳”类似。

要理解“破壳”漏洞的原理,首先从环境变量谈起。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序将使用到的信息。环境变量通常用来指定操作系统运行环境的一些参数,例如Linux系统中的PATH变量设置了Shell在执行时需要在哪些目录路径下按照给出的程序名搜索与之同名的文件。

env命令是一个外部命令,查看帮助可以知道,env命令可以用于显示当前用户的环境变量,给环境变量赋值,并可以在命令执行后执行其他命令。

回过头来分析下列代码:

env命令定义了一个环境变量X,该变量的内容是'() { echo test over.;}; echo shellshock',之后执行bash -c 'X'命令。从执行的结果来看,“破壳”漏洞发生在Bash处理函数定义的时候,env命令首先执行了函数体之后本不应该执行的“echo shellshock”命令,然后执行bash -c 'X'命令执行X函数。

Bash脚本的函数定义遵循如下语法:

function function_name() { function_body; }

Bash在解析脚本的时候,语法分析器发现小括号和大括号时会将其解析成函数,例如:

用如下命令可以看到X函数在环境变量中的具体定义:

留意最后的declare -fx X,declare是Bash的内部命令,申明环境变量的属性,其中-f表示X被申明为函数,-x表示该变量通过export导出成环境变量,最后一句表明X被解析成全局有效的函数。

Bash中的函数是通过环境变量的名称来调用的。“破壳”漏洞导致以’() {’开头定义的环境变量在env命令中被解析成函数。在函数体结束后,Bash并未结束执行,而是继续执行函数体之后的Shell命令。

再来看看漏洞补丁的源码。补丁在/buildins/common.h头文件中增加了两个定义,并修改了Bash源码/builtins/evalstring.c中的parse_and_execute()函数,对函数定义和单个命令的处理逻辑进行了修订。

通过以上分析可见,“破壳”漏洞是由于Bash的env命令在执行过程中没有对输入字符串进行合法性边界检查造成的。漏洞补丁正是针对这一问题增加了对输入字符串的限制条件。

3 攻击方式

从“破壳”漏洞的检测过程可以看出,该漏洞可以被用来执行任意具有可执行权限的命令行脚本。利用“破壳”漏洞发起远程攻击虽然方便,但仍需要满足一定的条件。“破壳”漏洞本身存在于Bash的env命令代码中,攻击者需要构造携带有攻击载荷的数据,利用第三方服务软件作为传输媒介将攻击载荷提交给env执行,方能实现远程攻击。

作为发起远程攻击媒介的第三方服务软件需要满足三个条件:(1)支持远程访问方式调用Bash;(2)远程访问数据可被修改;(3)远程访问数据可通过Bash执行。如图1所示。

正常用户远程访问时,将正常数据提交给第三方服务软件。第三方服务软件解析访问数据,提取命令脚本给Bash执行。执行完毕后,第三方服务软件将执行结果发回给用户。

攻击者发起远程攻击时,首先构造含有攻击载荷的数据包提交给第三方服务软件。第三方服务软件解析后,将带有攻击载荷的命令脚本提交给Bash执行。根据上文分析的漏洞原理,Bash执行env命令时将自动执行攻击载荷中的命令脚本,并将执行结果经由第三方服务软件发回给攻击者。

可作为攻击媒介的第三方服务软件包括Apache、OpenSSL、DHCP等。利用Apache服务的cgi接口发起远程攻击是比较容易实现的,可按步骤测试攻击。

(1)编辑Apache服务的配置文件,配置好cgi接口。

(2)编写Web服务测试脚本,放到/var/www/cgi-bin/目录下。

(3)重启Apache服务,通过远程主机运行以下脚本,即可利用“破壳”漏洞远程执行命令,输出Apache服务器上passwd文件中的内容。

攻击者只需将‘a=`/bin/cat /etc/passwd`; echo $a’替换为其他攻击载荷,就可以发起各种攻击。例如著名的fork炸弹,攻击载荷会不断fork出新的Bash进程,直到耗尽系统资源,实现拒绝服务攻击。

4 漏洞影响

存在“破壳”漏洞的Bash版本已经使用了20年,在这么长的时间内是否已经被攻击者利用,我们不得而知。就目前的情况看,该漏洞造成的影响非常巨大。

首先,多种被广泛应用的服务软件存在被“破壳”漏洞利用的风险。利用该漏洞可以绕过OpenSSH服务的ForceCommand对命令限制的功能,而SSH作为安全远程访问的必备工具被普遍使用。DHCP客户端会调用Shell脚本接收远程服务器的参数,该漏洞可以被用来修改这些参数以达到后续攻击的目的。Apache服务若使用mod_cgi,就存在利用该漏洞执行远程脚本的风险,而作为全球Web应用的主要服务软件来说,这一漏洞对互联网世界来说,无异于一颗重磅炸弹。

其次,“破壳”漏洞比之前的“心脏出血”更容易实现自动化攻击。在漏洞公布后不久,已经出现多种利用该漏洞的自动攻击载荷。著名渗透测试平台Metasploit上已经出现利用这一系列漏洞的自动攻击载荷,可对Apache服务的mod_cgi接口、DHCP服务、OSX VMWare等发起自动攻击。

此外,“破壳”漏洞的影响范围还在持续扩大。由于“破壳”漏洞很容易被用来制造蠕虫,僵尸网络开始狂欢。已经出现了利用该漏洞攻击busybox的恶意软件,该软件会自动寻找busybox目标,然后尝试入侵和提权,一旦成功则可以利用肉鸡发起DDoS攻击。从现在的发展情况看,Web应用作为下一个攻击目标已经是板上钉钉。

最后,“破壳”漏洞的影响将会在未来很长时间内持续发酵。虽然警报已经拉响,但是大多数人并未及时打补丁,有的甚至因为各种其它原因而不打补丁。据不完全统计,全球至少150万台主机受“破壳”漏洞影响,而且这还不包括以类Unix系统为基础开发的各种网络设备和专用嵌入式设备。

5 结束语

“破壳”漏洞无疑是2014年信息安全领域最严重的漏洞,它的发生再一次敲响了信息安全的警种。虽然此次漏洞仅仅是Bash中的一个小Bug,但由此可见,即便是被使用多年并得到广泛认可的基础应用软件,也会存在不为人知的严重安全漏洞。随着信息技术的不断发展,越来越多基础软件的漏洞将会陆续挖出。面对这些影响巨大的漏洞我们是否已经做好了准备?现行的漏洞处理机制能否持续应对不断发展的信息安全威胁?相比起如何通过技术手段及时修复漏洞,这些深层次的问题更是值得业内人士反思。

参考文献

[1] CVE漏洞描述CVE-2014-6271.

http:///cgi-bin/cvename.cgi?name=CVE-2014-6271.

[2] Shellshocker - Repository of "Shellshock" Proof of Concept Code.

https:///mubix/shellshocker-pocs/blob/master/README.md.

[3] 安天CERT.“破壳”漏洞综合分析.2014.10.13.

[4] 余弦.为什么破壳漏洞会带来一场全球服务器的浩劫.2014.9.26.http:///topics/211035.

[5] 知道创宇.Bash 3.0-4.3命令执行漏洞分析.2014.9.25.

http:///2014/09/bash_3-0-4-3-command-exec-analysis/.

[6] 维基百科.Bash. http:///wiki/Bash.

[7] Sarath Lakshman著,门佳译.Linux Shell脚本攻略(第二版).人民邮政出版社,2014.1.1.

作者简介:

郭瑞(1981-),男,湖北武汉人,苏州大学物理系物理学专业,理学学士,本科,上海交通大学电子与通信工程专业,工程硕士,广州行政学院信息网络中心, 讲师/系统分析师,2009-2014年从事党校信息化项目建设;主要研究方向和关注领域:信息安全、开源软件。

上一篇:如何培养提高儿童的语言表达能力 下一篇:网络用户账号密码安全问题调查