(如果有帮助,请点个赞;如果有错误,请指出;如果转载,请注明出处)
背景:
刚好,这几天网上曝出BashShell的ShellShock漏洞。我们就凑一下热闹。有兴趣的话,可以先看一下下面这几篇文章:
中文的:《Bash Shellshock事件: CVE-2014-6271资料汇总》
英文的(带有汇编分析):《Linux ELF bash 0day: The fun has only just begun》
Bash源码级别的分析也可以看这个:《Bash 3.0-4.3命令执行漏洞分析》
另外,知乎上的讨论也说得比较详细:《Bash 漏洞是什么级别的漏洞,有什么危害,具体如何修复?》
正文:
下面将从以下几个问题谈一下ShellShock:
(1)什么是Bash?什么事ShellShock?
(2)ShellShock漏洞的原理。
(3)ShellShock漏洞的危害。
(4)如何修复ShellShock漏洞。
一、什么是Bash?什么是ShellShock?
(1)什么是Bash?
如果不知道什么是shell,这篇博客建议不要看下去了。实在想了解的话,贴个百科链接吧:百度百科:shell。 BashShell全称是Bourne Again Shell ,是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。估计用过Linux系统的童鞋都不会陌生,Mac用户估计也会接触到。
(2)什么是ShellShock?
1)ShellShock是刚刚曝光的一个BashShell漏洞(据说不仅仅是Bash,其他shell也可能有这个漏洞)。
2)按照一般情况来说,系统里面的Shell是有严格的权限控制的,如果没有相应的权限,是根本看不到某些命令的存在,更不要说执行这些命令。
3)但是,Bash在运行的过程中会调用操作系统的环境变量,并且会执行一些设置命令。通过ShellShock漏洞,入侵者可以把某些”本来没有权限执行的语句或者命令“,注入到环境变量里。当bash设置环境变量的时候,就会执行这些”被注入“命令。这样子便绕过用户权限的限制,把一些”没有权限执行的命令“,变成”具有执行权限的命令“了。从而可以在系统内任意执行Bash命令语句,胡作非为(相当于获得root超级用户权限)。
二、ShellShock漏洞的原理。
上面其实已经简单的描述了ShellShock的原理,下面详细说一下ShellShock漏洞的一些细节。
(1)如何测试自己的系统有没有ShellShock漏洞。
假设是Linux 系統的管理员,在 shell 中输入下面这条测试命令:
env x=’() { :;}; echo XXXXXX’ bash -c “echo This is a test code"
可能会出现两种情况:
1)「XXXXXX」就是表示系统有漏洞,需要马上更新。
2)「bash: warning: x: ignoring function definition attempt」表示不存在漏洞。
(2)为什么说出现XXXXXX就是有漏洞呢?
咱们先看看ShellShock漏洞的过程(引自Bash ShellShock漏洞简析)。
1)Linux WEB Server一般可以提供CGI接口,允许远程执行Bash命令;
2)对于HTTP头部,CGI脚本解析器会将其当作环境变量,调用bash的env相关函数设置到临时环境变量中;
3)HTTP协议允许发送任意客户端自定义的HTTP头部;
4)这样就产生了一个完整的可供Bash命令注入的场景,客户端故意发送构造好的带攻击命令的HTTP头部到服务端,服务端调用设置环境变量的函数,直接执行了客户端指定的头部里面的命令。并且还会将结果一并返回给客户端。
再回到刚才那个漏洞测试语句看一下:
1)env x=’() { :;}; echo XXXXXX’
这一整句是一条设置环境系统的语句,按理来说,它的功能只是执行系统环境变量的功能。
2)”echo XXXXXX“
这是一条shell打印语句,理论上不应该出现在环境变量设置里面,就算出现了也不应该执行的。表示打印“XXXXXX”这个字符串的意思。理论上,这句命令是不应该被执行的,如果被执行了,就意味着有漏洞。入侵者可以把”echo XXXXXX“ 这句命令,换成其他的shell命令,从而做一些不被允许的事情。
3)补充一句吧,我在上面那里提到的,通过这个漏洞就获取到超级用户root权限的说法不太准确。
知乎上@吴昊给出了更准确的表述:“有了bash不等于有一切,要看是什么权限运行的bash。cgi服务器进程一般不会是root权限。如果是的话,那个网站的网(yun)管(wei)就可以开了又开了。所以拿到的很大几率是一个像"www_data"这样的用户权限拿到www_data可以做什么呢?可以看网站的配置文件,里面可能有数据库密码,然后就可以进数据库了。”
好了,下面我来点个人干货,做一个形象一点的比喻:
1)Bash-->手机的主人
2)web访客-->借手机打电话的人
3)设置环境变量-->借手机打电话
4)权限管理-->手机主人监督借手机的人(只允许打电话,不允许他干其他事情包括发短息或者上QQ之类的)
5)shellshock漏洞-->手机主人没有好好的监督借手机的人(手机被他偷偷拿去看苍老师的教学视频了)
串起来讲就是,有一个人A问另外一个人B借手机来打一个电话,作为手机的主人B很爽快的答应 了。但是,手机除了打电话之外呢,还可以做好多的事情,包括偷看手机主人B和其它姑娘勾搭的信息。因此,手机主人B必须在A使用电话的时候监督好他,保证他只能拿手机来打电话。但是,突然间手机主人B看到一个美女所以分神了,没有好好的盯住A,然后A就趁机拿B的手机去看苍老师教学视频(免费流量啊,不看白不看)。
不知道这样子理解起来是否会简单一点呢?
三、ShellShock漏洞的危害。
关键词:蠕虫、DDOS
对攻击者而言,夺取了shell一般来说就已经很成功了,因为控制了它,就相当于控制了目标环境。你可以访问内部数据,重新配置环境,将他们的恶意代码发布上去,等等。它无所不能,而且是自动化的(自动传播自身拷贝的病毒一般称之为“蠕虫”)。(以上引自《ShellShock漏洞那些事儿》)
“蠕虫”大规模传播带来危害主要有:
(1)由于拥有了特殊的权限,大量的互联网服务器上面的保密数据被窃取。
(2)由于蠕虫的自身复制以及存在这个漏洞的主机数量庞大,病毒可以控制大量的主机,发起DDOS攻击,造成网络瘫痪等。(具体什么叫DDOS请上维基)
四、如何修复ShellShock漏洞。
这个问题好像很弱智,谁都知道更新软件就可以修复漏洞,毕竟开源社区的响应速度还是很快的。至于Bash的开发人员具体是怎么修复,那是他们的事情了。但是,作为一个程序猿,我觉得还是思考一下如何避免这种漏洞的。
回到刚才的比喻,如果由于手机主人B的监督不严,导致手机被A拿去胡作非为了。要解决这个问题,办法就只有两个:
(1)禁止A再借用他的手机
(2)提高手机的权限管理,譬如说借手机之前先在手机上加一个软件锁,保证A只能打电话,而无法使用其他手机的功能。
这两个办法对应到我们的web服务和Bash上面,就是:
(1)禁用CGI(但是可能会导致web服务功能出问题)
(2)完善权限管理机制,在设置环境变量的之前先做好检测,确保环境变量设置语句里面不会有一些越权的行为。
当然了,这里只是总结了一下。个人精力有限,具体的代码和实现我就不细说了。
############################################################################################
20140929更新:最新的说法是,Bash升级其实不能从根本上完全避免这个漏洞。这个漏洞的修复工作有点像“补了东墙轮到西墙漏水”(有人比喻成打地鼠,打了这个,另外那些接着出来,怎么都打不完)。具体的分析可以参考一下如下这两篇文章:
《为何修复Shellshock漏洞像打地鼠》
《Still more vulnerabilities in bash? Shellshock becomes whack-a-mole》