谁可豁免?ASRC解析声名狼藉的Shellshock
ASRC 研究中心主任 高铭钟

2014年4月份爆出了一个OpenSSL的漏洞─Heartbleed,这个漏洞的威胁性在于只要启动了OpenSSL中Heartbeat这个提高联机效率的扩充程 序,就有机会遭到程序自动重复猜测,以获取内存中的机敏信息,由于许多Unix-like的服务器都存在这个问题,因此它算是一个范围相当大的信息安全问题。而在2014年9月被发现的Shellshock漏洞,比起Heartbleed是更加严重的!这个漏洞其实已经存在相当久时间,许多Unix-like的服务器普遍存在这个漏洞,或许,早有人在此漏洞揭露前即已长期利用!

漏洞原理

为什么会存在这样子的漏洞呢?原因在于其实bash可视为一种手稿语言(Script Language),可以描述简单的语言与计算机沟通,不经编译(compile)即可直接执行并看见结果,因此它也可以定义出新的指令功能,比方:

<!--[if !supportLists]-->n <!--[endif]-->ok() { echo ‘ASRC is good!’; }

如此定义后,输入「ok」,即会立即显示「ASRC is good!」的结果。但这个「ok」指令在另一个新开的bash环境就不再可以被执行,比方再次输入一个「bash」指令,接着再输入「ok」,则不会再出现「ASRC is good!」的结果。如果再新的bash也希望还能保留「ok」这个指令,那需要以「export -f ok」将「ok」导出到bash的执行环境。导出后,您可以「env」指令来查看目前bash执行的环境变量,会再最底下看见刚刚「export」的结果。

bash在初始化环境变量时,会扫瞄环境变量中是否有函数定义,它只要看见「() {」开头的字符串就会认定它是函式。这边存在一个Bug,就是环境变量若已存在一组「() { :;};」函数定义,并于其后接上指令时,再开一个新的bash初始化环境变量时,它会顺便执行上一层环境变量中,函数定义外面的指令。利用这个原理,您就可以在新的bash执行环境被执行前,预先注入一个你想执行的指令,比方:

<!--[if !supportLists]-->n <!--[endif]-->export x='() { echo "ASRC is good!"; }; echo "problem!";'

导出后,以「env」指令来查看目前bash执行的环境变量,会看见「x='() { echo "ASRC is good!"; }; echo "problem!";'」存在环境变量中。




此时再输入一次「bash」开一个新的bash环境,则「echo "problem!"」就会被顺便执行起来,然后再以「env」查看新的bash环境,只会存在「x=() { echo "ASRC is good!"}」。



我们用下面这个简单的流程来说明这情况:

根据这个原理,我们可以利用「() { :;};」这个神奇字符串,再搭配bash -c这个指令强迫开启一个新的bash,就可以顺便执行神奇字符串后的指令,比方:

<!--[if !supportLists]-->n <!--[endif]-->env x='() { :;}; echo problem!' bash -c 'echo test'

如果您在您的Unix-like系统执行上述指令,看见了「problem!」,则表示您的系统存在了Shellshock的问题,在执行bash –c时,「echo problem!」指令已经顺便被执行。

攻击方法

这个漏洞乍看之下,似乎仅影响登录本机的用户,可通过此漏洞绕过受限的shell功能;事实上,这个漏洞的影响层面十分广泛,凡是存在此漏洞的服务器所使用的程序语言、对外网络服务,只要服务或撰写的程序语言有呼叫bash指令,就有机会被利用。此漏洞爆发之初,最先大范围受害的为Web服务,若您为系统管理员,建议您可以检查各种对外服务的log文档,并搜寻其中是否存在「() { :;};」这个神奇字符串,或许您可在其中看到不少的攻击尝试。

邮件服务器亦存在被攻击的危险,qmail邮件服务器即为一例。只要假装对其发送邮件,并在输入发件人信息时,刻意输入「mail from:<() { :; };」,其后即可接上任何的攻击指令,比方常见用以建立后门的「nc」指令;并可通过「;」串接多个指令,要求受攻击的邮件服务器先下载一个复杂的Perl程序后,再执行它!

如何防范

多数知名的Unix-like操作系统 (CentOS、Debian、Fedora、Ubuntu、Gentoo在漏洞爆发前的版本) 都已经有针对此漏洞释出修补程序,建议您应尽速更新修补此漏洞。

若您的系统在更新修补前,已经存在这个漏洞,在您更新修补后,应详查各种log、暂存档及自动、定时服务的配置文件…等,确认系统未遭到任何非预期的植入或改写。除了自行架设的Unix-like系统外,容易被忽略的是外购的现成网络服务设备,比方各种Router与NAS,它们的操作系统所使用的Shell很可能也是bash,并且其上所提供的服务也受此漏洞影响,建议您务必尽速与这些设备的开发商寻求合宜的修补程序。

回到列表