安全通告
1
GoAhead Web Server是为嵌入式实时操作系统(RTOS)量身定制的开源Web服务器。很多国际一线大厂商,包括IBM、HP、Oracle、波音、D-link、摩托罗拉等,都在其产品中使用了GoAhead,使用GoAhead的设备包括智能手机、宽带接入路由器、数字电视机顶盒等。
近日,安全研究人员发现如果启用了CGI并且动态链接了CGI程序的话,GoAhead中的安全漏洞可能允许远程执行任意代码。漏洞的起因是cgi.c文件中的cgiHandler函数使用了不可信任的HTTP请求参数初始化已fork的CGI脚本的环境。结合glibc动态链接器,攻击者就可以使用特殊的环境变量(如LD_PRELOAD)导致执行任意代码。
安恒信息应急响应中心也将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。
漏洞信息
2
漏洞描述
近日GoAhead官方发出安全公告,服务器通过GET参数设置环境变量导致了恶意LD_PRELOAD环境变量设置,进而使得漏洞攻击者获得远程命令执行的权限,影响不容小觑。GoAhead官方发布了新版本3.6.5,对漏洞进行了补丁修复。
漏洞危害
攻击者可以直接在服务器上远程执行命令,获取服务器上所有数据。
影响版本
GoAhead 3.6.5之前版本
具体为:2.5.0 – 3.6.4
漏洞利用前置条件
服务器启用CGI且CGI需动态链接。
需要已知服务器的架构,从而上传相对应的动态链接库文件。
风险等级
安恒信息应急响应中心将此漏洞安全风险定级为:高危
漏洞分析
环境搭建
cgi测试成功
漏洞定位
goahead/src/cgi.c:cgihandler
定位代码153行,可以看到程序遍历了用户访问时所带的参数,验证如果参数不为REMOTE_HOST或HTTP_AUTHORIZATION,则将其存储至envp数组。该数组将作为接下来cgi调用的环境变量。可以看出正式这里对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。
漏洞复现
payload.c
将payload.c编译成动态链接库.so文件
查看编译好的文件
如果用该文件作为LD_PRELOAD动态链接库文件运行,运行任意程序则会有如下效果。
可以看到payload.so中的代码成功运行。
验证poc:
漏洞分析
我们修改payload以便于接下来的调试
重复poc的命令
由于在执行poc时CGI进入了sleep,我们可以方便地查看当前CGI的状态,ps查看其pid。
查看CGI程序中的0号fd文件,发现这是一个符号链接,指向一个tmp文件,我们再查看该tmp文件,最终确认该文件正是我们上传的恶意动态链接库文件。
查看源码可知(goahead/src/cgi.c:launchCgi):
执行CGI之前,程序通过dup2将CGI的标准输入(即fd为0的文件)指向了创建的tmp文件。
所以我们发送的
/proc/self/fd/0 à /tmp/cgi-xxx.tmp == payload.so
最终造成了任意代码执行。
漏洞自查
漏洞发布者已经提供了对应的测试工具,已包含多种架构的payload,下载地址如下:
https://github.com/elttam/advisories/tree/master/CVE-2017-17562
使用方法:
--server 指定服务器地址
--port 服务器端口
--payload 根据对方服务器的架构选择相应.so文件
修复建议
3
官方补丁
升级至最新版本
临时缓解措施
修改源码src/cgi.c
根据官方补丁修改161行左右的if内,除了过滤REMOTE_HOST和HTTP_AUTHORIZATION,添加过滤IFS、CDPATH、PATH和以LD_开头的字符串。
- END -
领取专属 10元无门槛券
私享最新 技术干货