APP下载

破壳漏洞的分析与防范

2015-05-30鲁先志

鲁先志

摘 要:shell软件的bash的“破壳”漏洞从2014年被披露至今对全球上百万台服务器造成了非常严重的影响。文章首先分析了该漏洞的原理,并对该漏洞的可利用性并进行了验证,最后提出了修补该漏洞的方法。

关键词:破壳漏洞;Shell;Bash

破壳漏洞对应的CVE编号为CVE-2014-6271, 该漏洞是由法国的研究者最先发现的,此漏洞的影响范围包括大多数应用Bash的Unix、Linux、Mac OS X,而针对这些操作系统管理下的数据均存在高危威胁。“破壳”是Bash(GNU Bourne Again Shell) 中出现的允许攻击者通过环境变量执行任意命令的漏洞,该漏洞可使攻击者在受影响的系统上执行任意代码,影响到与Bash交互的多种应用系统,包括Apache、OpenSSH、DHCP等。

1 漏洞原理

Shell是一个交互性命令解释器,shell独立于操作系统,这种设计让用户可以灵活选择适合自己的Shell。Shell可以在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。

目前的Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。

在Bash解释命令行指令时,可以通过输入一些代码来检测该系统中是否存在出破壳漏洞:

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

如果系统存出该漏洞,会出现下图所示的执行结果:

图1 具有破壳漏洞的系统

上面的语句中env为一个系统命令,该命令让系统创建一个环境变量x='() { :;}; echo vulnerable'并且带着这个环境变量的值执行bash-c “echo this is a test”。第一行输出的“vulnerable”暴露了漏洞的存在,因为函数定义() { :;};之后的echo vulnerable指令本不该被执行却被执行。具体原因是由于bash在处理含有函数定义诸如”() { :;};”的环境变量赋值的代码上存在设计缺陷,错误地将函数定义后面的字符串作为命令执行。实事上真正的漏洞利用与env命令无关,只要设法让系统接受一个含有”[函数定义]+[任意命令]”的环境变量赋值则可触发”[任意命令]”部分所表示的代码执行。

2 利用破壳漏洞绕过通过授权秘钥的OpenSSH验证

通常情况下用户通过SSH远程登陆系统是需要使用用户名与密码登陆,但还有一种方式是配置授权登陆密钥(RSA算法非对称加密),使得登陆时无需输入用户名与密码,相对于用户密码的验证方式,使用公钥验证登录是更佳的安全方法。

SSH实现无密码访问的应用非常广泛的,比如在linux主机高可用的集群节点上配置SSH 实现节点间用户的无密码访问,由于主机高可用程序需要在各节点间进行信息传递,所以必须实现所有节点两两之间能无密码访问。节点间的无密码访问是通过配置ssh 公钥认证来实现的。

在很多情况,内网里的SSH密钥认证登陆只是为了完成程序自动化登陆操作的任务,比如实现主机高可用节点间的无密码访问,“SSH shelltest@serverip命令” 就可以完成任务的情况,所以为了安全起见,管理员通常会限制SSH密钥认证登陆后的操作权限,一般常见的限制方式是限制命令执行,将需要执行的命令加入白名单,限制后的SSH无法登陆shell。

通过输入下面的命令可用成果绕过系统白名单执行任意命令。

SSH username@serverip ‘() { :;}; cat /etc/passwd