开源Web服务器GoAhead漏洞CVE-2017-17562分析
发布时间:2017-12-20来源:哈勃分析系统作者:腾讯御界
GoAhead Web Server是为嵌入式实时操作系统定制的开源Web服务器。根据腾讯反病毒实验室评估,全网有百万级别左右的设备运行该服务,鉴于嵌入式设备更新的滞后性,该漏洞影响的范围较广,后续mirai等恶意家族极有可能会利用该漏洞扩展僵尸主机,因此,腾讯反病毒实验室将对该漏洞进行持续关注,并将第一时间更新相关漏洞信息。
一.简介
GoAhead Web Server是为嵌入式实时操作系统定制的开源Web服务器。IBM、HP、Oracle、波音、D-link、摩托罗拉等厂商都曾在其产品中使用过GoAhead。根据腾讯反病毒实验室评估,全网有百万级别左右的设备运行该服务,鉴于嵌入式设备更新的滞后性,该漏洞影响的范围较广,后续mirai等恶意家族极有可能会利用该漏洞扩展僵尸主机,因此,腾讯反病毒实验室将对该漏洞进行持续关注,并将第一时间更新相关漏洞信息。
二.影响版本
GoAhead 3.6.5之前的版本(2.5.0 – 3.6.4)
三.漏洞成因
该漏洞的原因在于cgiHandler函数使用了不可信任的HTTP请求参数初始化已fork的CGI脚本的环境,当与glibc动态链接器结合使用时,可能会被使用特殊变量(如LD_PRELOAD)的导致远程代码执行。
从代码中可以看到,对于用户访问时所带的参数字段,只是对REMOTE_HOST和HTTP_AUTHORIZATION进行了过滤,所有其他参数都被认为是可信的而没有经过过滤。 正是由于对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。
而补丁后的版本,对参数首先跳过待定的参数名称,并使用静态字符串做为其前缀。补丁后代码如下:
四.漏洞利用
漏洞利用首先使用上面的参数过滤不严的漏洞,向服务器发送LD_PRELOAD的环境变量,在系统的动态链接库的入口函数dl_main 中,会首先调用 process_envvars处理参数,链接器在解析envp数组时,如果找到特殊的变量名称(如LD_PRELOAD),则执行不同的代码路径。这里对LD_PRELOAD的处理,其中preloadlist被初始化。
随后,如果 preloadlist 不为空的话,会调用 handle_ld_preload函数
通过上面这些内容,可以实现通过设置LD_PRELOAD变量,来达到加载代码的目的。那么,如果能够通过gohead服务程序,将恶意程序发送到服务器并保存在固定目录下,就可以完美实现漏洞利用。
launchCgi函数调用系统函数dup2()将stdin文件描述符指向了POST请求数据对应的临时文件。 这意味着对于可以用类似LD_PRELOAD = / tmp / cgi-XXXXXX的请求,总会在磁盘有一个包含对应内容的文件,在这种情况下,如果能够猜出临时文件名,就能达到漏洞利用。
下图显示了launchCgi函数最终会调用execve函数加载执行。
实际上,我们很难猜出这个临时文件的文件名,但Linux procfs文件系统的一个很有用的符号链接:/proc/self/fd/0,,它对应着文件的stdin描述符,在这里,它也就指向了临时文件路径。通过使用/proc/self/fd/0符号链接,就可以访问到post到服务端的代码数据,通过这一系列的组合,最终就达到远程代码执行目的。
将上面的过程串联起来后, 在本地搭建测试环境,测试效果如下:
五.修补建议
腾讯反病毒实验室建议使用GoAhead产品的用户,检查当前应用程序版本,如果版本小于3.6.5,请尽快升级至最新版本。
此外,企业用户也可以使用腾讯御界高级威胁检测系统对漏洞利用进行防御。此系统基于腾讯反病毒实验室的安全能力,依托腾讯在云和端的大数据,形成了强大且独特的威胁情报和恶意检测模型,凭借基于行为的防护和智能模型两大核心能力,高效检测未知威胁。通过对企业内外网边界处网络流量的分析,可以感知漏洞的利用和攻击。
六.参考
https://www.exploit-db.com/exploits/43360/
https://github.com/elttam/advisories/tree/master/CVE-2017-17562