- 快捷搜索
- 全站搜索
2014年4月和9月,信息安全领域爆出两个高危风险漏洞——Heart Bleed漏洞和Bash ShellShock漏洞,对金融应用、邮箱等HTTPS服务器和个人电脑信息安全造成严重威胁,一度引发经济社会的整体性恐慌,引起公众对信息基础技术漏洞与安全的极大关注。
本文对Heart Bleed和Bash ShellShock漏洞进行较为详细的技术分析,着重对漏洞产生的原因、威胁以及修复方法进行介绍,为企业相关服务器安全防护、个人敏感信息防护和金融交易安全提出建议。
一、Heart Bleed
1.简述
Heart Bleed漏洞首先被谷歌研究员Neel Mehta发现,OpenSSL于2014年4月7日发布安全公告称,在OpenSSL1.0.1版本中存在严重漏洞(CVE一2014—0160,见表1)。该漏洞可随机泄漏HTTPS服务器64k内存,内存中可能会含有程序源码、用户HTTP原始请求、用户cookie甚至明文账号口令等。网银、网购、网上支付、邮箱等众多网站均可能受其影响。

2.SSL与OpenSSL
(1)SSL协议
安全套接层协议(Secure Sockets Layer,SSL)可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,其目标是保障两个应用间通信的保密性和可靠性,可在眼务器端和用户端同时实现支持。目前,SSL已经成为Internet上保密通信的工业标准。
SSL协议要求建立在可靠的传输层协议(TCP)之上,其优势在于SSL协议与应用层协议独立,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后,应用层协议所传送的数据都会被加密,从而保障通信的机密性。
目前多数通过SSL协议加密的网站均使用OpenSSL开源软件包。
(2)OpenSSL OpenSSL是一个强大的安全套接字层密码库,包括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其他目的使用:
OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台特性。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。
OpenSSL软件包由Eric A.Young和Tim J.Hudson自1995年开始编写,这是一个没有太多限制的开放源代码的软件包。1998年,OpenSSL项目组接管了OpenSSL的开发工作,到目前为止已支持SSL2.0、SSL3.0以及TLS1.0等。
OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。
3.Heart Bleed漏洞
(1)Heart Bleed攻击
OpenSSL在处理TLS心跳扩展包时存在安全缺陷,让攻击者能够直接读取服务器的部分内存,进而可能导致用户名、口令等重要信息的泄露。
OpenSSL漏洞不仅影响以SSL开头的网站,黑客还可利用此漏洞直接对个人PC发起Heart Bleed攻击(如图1所示)。Windows上有大量软件使用了存在漏洞的OpenSSL代码库,可能被黑客攻击,抓取用户电脑上的内存数据。

(2)Heart Bleed漏洞原理
Heart Bleed漏洞产生的原因,是OpenSSL在处理TLS心跳扩展包时未进行字段长度有效性检查。
程序对心跳包的处理如下:
int dtlsl_process_heartbeat(SSL*s) { unsigned char*P=&s->s3->rrec.data[O],*pl;
unsigned short hbtype;
unsigned int payload;
unsigned int padding=16;
hbtype=*p++;
n2s(p,payload);
pl=p;
unsigned char*buffer,*bp;
int r;
buffer=OPENSSL—malloc(1+2+payload+padding);
bp=buffer;
*bp++=TLS1_HB_RESPONSE;
s2n(payload,bp);
memcpy(bp,pl,payload);
}
dtlsl—process—heartbeat函数处理过程如下。
①首先读取了数据包的长度payload;
②根据数据包长度(1+2+payload+padding)分配内存bp;
③从接收缓存p1中拷贝payload大小的数据到bp中。
由于dtlsl_process_heartbeat没有验证length字段值是否为数据包实际的大小,如果发送端伪造了一个畸形的length字段,使得length大于实际的数据包大小。那么在接收端拷贝payload时会越界访问相邻区域内存,从而导致内存泄漏。
(3)Heart Bleed漏洞修复
对Heart Bleed漏洞的修复方法,即是对length字段值的有效性进行验证,具体方法如下:
if(1+2+16>s一>s3->rrec.1ength)
return 0;/*silently discard*/
hbtype=*p++;
n2s(p,payload);if (l+2+payload+16>s一>s3一>rrec.1ength)
return 0;/*silently discard*/
pl=p;
(4)Heart Bleed漏洞检测
验证服务器是否存在Heart bleed漏洞以及升级是否成功修复该漏洞,可以通过http://possible.lv/tools/hb/进行在线检测。
二、Bash Shellshock漏洞
1.简述
2014年9月24日,Bash惊爆严重安全漏洞,编号为CVE一2014—6271,名称为“Bash ShellShock”,中译名“Bash破壳”(见表2)。该漏洞可能导致远程攻击者在受影响的服务器操作系统上执行任意命令。

2.Shell与Bash (1)shell
shell是一个交互性命令处理器(commandprocessor),独立于操作系统,用于读入并解释输入的命令。这种设计让用户可以灵活选择适合自己的shell,用户在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
除解释命令以外,shell还是一个程序设计语言,允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等,用户可以生成像其他应用程序一样复杂的shell程序。
(2)Bash
Bash,即Borne Again Shell,是shell的一种,为Linux上默认采用的shell,是任何Linux系统中最常见的安装组件。1980年诞生之初,bash只是一个简单的基于终端的命令解释器,经过不断演进,现在它已经应用于诸多其他用途之中。
与其他环境变量一样,在Linux中,Bash shell影响着系统软件,是由一个名称和对名称的赋值构成。在程序后台运行Bash shell很常见。通常用于向远程用户提供一个shell(例如通过SSH,Telnet),为CGI脚本提供解析器(例如Apache),甚至提供有限的命令执行支持(例如git)。
用户可以在调用Bash shell前使用特殊加工的值创建环境变量,这些变量可以包含代码,随着shell调用执行。这个过程暴露了系统的脆弱。
3.Bash破壳漏洞
Bash被曝出在调用环境变量设置命令或者接口时,可以任意执行Bash命令语句,绕过用户权限的限制:
env X=‘(){:;}echo hello’bash—c”echo test”,
如果输出“hello test”则说明系统存在这个漏洞。
Env命令使用如下格式:
env x=‘something’sh—c“some commands”
表示创建一个环境变量给sh子进程,子进程执行“some command”。
其中,X=‘something’表示定义变量x为something:sh—C“some commands”表示创建一个新的进程sh,使用这个进程执行“some commands”。
直接使用env x=‘(){:;};echo hello’创建一个X变量时,在shell中依然是一个变量,是不能执行的。但在增加一个子bash shell——bash—c“echo test”时,由于存在漏洞CVE一2014—6278,这个x变量在子shell中被“识别”成了一个函数。因此在子shell中被执行。
执行函数env的时候,不是检测完整的“{}”对,而是简单地执行“{}”之后的所有 Bash代码,也包括放进去的代码。
上述Bash弹本,本来只是定义一个环境变量x,但是其后面的内容全部都会被当作语句来执行,这也就是当以函数的形式来对环境变量进行赋值时,会导致函数后面的命令被执行的原因。即env命令在执行赋值语句时未检查函数的边界,导致函数之后的内容也被执行。运行如上代码,屏幕如果显示“hello test”,那么系统的Bash就存在该问题。
这个问题本身好像并没有多可怕,因为一般能拿到shell,那么就有了整个环境的操纵权限,也不需要去用命令注入的方式来攻击了。但是存在一些场景允许远程执行Bash命令,恰好又会在命令中调用环境变量设置函数,如使用mod_cgi或mod_cgid的Apache服务器、DHCP客户端等情况。
如果CGI脚本使用Bash或者产生大量的子shell,使用mod_cgi或mod_cgid的Apache服务器将受到影响,这些子shell可能被C语言的system/popen使用、可能被Python的os.system/os.popen使用、可能被运行在CGI模式下的PHP的system/exec使用、也可能被使用shell的Perl中的open/system使用等。
DHCP客户端调用shell脚本以配置系统,使用来自潜在的恶意服务器的值,这将允许任意的命令运行,尤其是作为DHCP客户机上的root命令。
不引入环境变量的shell脚本是安全的,即使它们处理不安全的内容并存储在(不引入的)shell变量里并打开子shell。
目前针对此问题发布的补丁已修复了该漏洞,确保bash函数的尾部不允许添加额外的代码。所以如果用成功打过补丁的bash版本运行上面这个例子,应该得到类似这样的输出: $ env x=‘ (){:;};echo hello’bash—c”echo test” bash:warning:x:ignoring function definition attempt bash:error importing function definition for‘x’test。
三、总结
OpenSSL被发现忘记检查缓冲区边界,导致“心脏出血”。基于Bash的常用远程服务被发现忘记检查脚本语法边界,导致Linux等服务器操作系统可能被远程执行任意命令。
这都是“越界”检测疏漏引发的安全风险,但“BashShellShock”的威胁要大于“心脏出血”:“心脏出血”属于软件风险、利用难度较高;“破壳”则属于系统风险、且利用难度极低,其威胁等级属于最高级。
应对“心脏出血”漏洞造成的威胁,除企业需要对SSL服务器及时更新升级补丁外,个人用户的邮箱、网银、网购等需要及时更新口令、定期更换口令,并避免在不同应用场景下使用相同的口令。
应对“Bash ShellShock”漏洞造成的威胁,因其所影响网络服务器据估计占据全球数量的大约三分之二,需要企业及时排除升级Bash版本。目前,部分安全软件已经可以发现并查杀恶意利用“破壳”漏洞的木马,个人用户可注意安装具备此功能的杀毒软件并及时升级病毒库。
随着互联网的超常规发展和普及,信息基础设施安全速来越受到关注,网络与信息安全已上升到国家安全的战略高度,成为影响社会稳定的重要因素之一。
而现在使用的互联网通信协议和服务,大部分继承自几十年前安全意识非常薄弱的时代,对海量的、正在运行的互联网基础结构代码的安全漏洞检测和防护,需要政府主管部门、科研机构和公司企业给予足够的重视和研究投入,为国家经济社会的信息化发展提供安全环境。
(文章来源:《中国金融电脑》杂志)
在银行业信息化新阶段,信息技术风险也自然成为金融机构操作风险的重要方面
华融湘江银行致力于服务地方经济、中小企业、广大客户,全力打造成为客户信