文献标识码:A
DOI:10.16157/j.issn.0258-7998.180753
中文引用格式:陈一鸣,寇小强,王永利. 基于Docker的漏洞验证框架的设计与实现[J].电子技术应用,2018,44(11):99-101,106.
英文引用格式:Chen Yiming,Kou Xiaoqiang,Wang Yongli. Design and implementation of vulnerability verification framework based on Docker[J]. Application of Electronic Technique,2018,44(11):99-101,106.
0 引言
随着信息技术的发展,信息安全问题也愈演愈烈,漏洞的存在可以使攻击者在未授权的情况下访问或破坏系统[1]。每天都会有新的漏洞被挖掘出来,研究这些漏洞的成因或利用方法是安全人员必须完成的工作之一[2]。现阶段的漏洞种类繁多,按照产生漏洞的程序分类,包括Web漏洞、系统漏洞、应用程序漏洞、Web中间件漏洞等[3]。按照漏洞利用方式分类,包括远程利用漏洞、本地利用漏洞,再往下细分又可以分为命令执行、溢出、提权等漏洞[4]。不同的漏洞所依靠的运行环境也不相同,有些漏洞甚至需要多个软件或系统的组合才能顺利复现成功[5]。为简化漏洞复现过程,本文研究了使用Docker容器技术来进行漏洞场景的打包和发布技术,并且通过漏洞验证模块来验证此漏洞场景。
关于漏洞验证程序的编写格式,现阶段已经有数个漏洞验证框架:Beebeeto、Pocsuite、Bugscan、Tangscan等。Beebeeto是由众多安全研究人员所共同维护的一个规范化观点证明(Proof of Concept,POC)/漏洞利用(Exploit,EXP)平台,安全研究人员可以在互联网上获取漏洞信息,然后按照BB2开发标准编写出相应的POC或EXP提交到平台。Pocsuite是由知道创宇安全研究团队打造的一款开源的远程漏洞测试框架。BugScan是西安四叶草信息技术有限公司旗下BugScan社区出品的国内首款基于社区的分布式漏洞扫描框架。TangScan是一款在线安全漏洞检测服务,一个由众多安全研究人员维护的企业在线安全体检平台。上述框架都拥有一套自己的验证程序脚本的编写规范。对此,文中也研究了将这些不同的编写规范相兼容的方法,以达到快速编写验证程序的目的。
1 系统结构
系统整体结构分为Docker管理模块、POC验证模块和数据库。
如图1所示,Docker管理模块分为容器、镜像、仓库三个部分[6]。容器模块负责本地容器的创建、运行、终止和删除。镜像模块负责从仓库中获取镜像、添加标签、上传镜像和删除镜像。仓库模块负责存储制作好的镜像和提供镜像的下载服务。验证模块分为执行、框架和库三个部分,执行模块是验证过程的入口,所有的验证程序都由执行模块执行,为了兼容不同类型的POC,执行模块会根据不同类型的POC来调取相应的框架来解析执行,具体的验证代码则是存放在POC库中。最后如果验证通过,证明漏洞存在并且POC有效,就会将相应的镜像、容器启动的参数、仓库的地址和验证代码等具体信息存放到数据库中[7]。
系统的使用者需要提供给系统所需的资源来启动处理过程,包括搭建环境所需要的Docker镜像、漏洞的详细信息、漏洞利用程序等资源。
如图2所示,系统首先会加载漏洞所需要的资源,一个完整的漏洞资源包括Docker镜像或Dockerfile、漏洞的详细信息、漏洞的种类、漏洞的危害程度、漏洞的评分、漏洞的利用程序等资源。
判断资源完整性后,如果资源完整,说明可以产生一个Docker容器,并且提供了相应的验证程序。接下来,框架会根据提供的验证程序信息调用不同的验证框架来尝试验证Docker容器中运行的有漏洞的程序。在验证程序验证完成后,系统会根据验证的结果来判断漏洞提交者所提交的资源是否有效,若有效,则将相关的信息存入数据库中;否则终止验证过程,重新调整资源。
2 Docker容器虚拟化技术
Docker是PaaS提供商dotCloud开源的一个基于LXC(Linux Container)的应用容器引擎,让开发者可以将应用程序、依赖的运行库文件打包并移植到一个新的容器中,然后发布到任何系统为Linux的机器上,也可以实现虚拟化解决方案[8]。
Docker的三大核心概念是镜像、容器和仓库。Docker镜像类似于虚拟机镜像,可以理解为创建Docker容器的模板,它是创建容器的基础。Docker镜像是必须向此漏洞验证系统所提交的资源之一。
容器是完全沙箱机制的实现方式,任意容器之间不会有任何接口,具有安全访问资源的特性,而且容器的运行资源开销小,可以很容易地在机器和数据中心中运行。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除[9]。
Docker仓库是Docker集中存放镜像文件的场所,仓库可以分为共有仓库和私有仓库两种形式。漏洞验证框架验证后的Docker镜像就会存放在私有仓库中。
如图3所示,镜像是容器的前提,镜像可以通过Pull操作从Docker仓库中下载,完整制作的镜像也可以通过Push操作向Docker仓库中推送。下载镜像到本地后,就可以使用镜像来创建容器了,容器不同于镜像,容器拥有运行时需要的可读写层,而镜像只是静态的只读文件。通过run命令启动的容器处于运行状态,对于运行状态的容器可以使用stop来终止,终止状态的容器并没有消失,可以使用start操作来重新启动。如果希望容器暂停工作一段时间,可以使用pause操作将容器切换到暂停状态,处于暂停状态的容器不会占用CPU资源,直到通过unpause操作恢复运行。
2.1 Docker容器与传统虚拟化的不同
传统的服务器虚拟化解决的核心问题是计算资源的调配,而Docker容器解决的核心问题是应用开发、测试和部署。如图4所示,虚拟机技术通过Hypervisor层抽象底层基础设施资源提供相互隔离的虚拟机,通过统一配置、统一管理,计算资源的可运维性,资源利用率能够得到有效的提升。同时,虚拟机提供客户机操作系统,客户机变化不会影响宿主机,能够提供可控的测试环境,更能够屏蔽底层硬件甚至基础软件的差异性,让应用做到广泛兼容。然而虚拟化技术因为要多模拟出一层操作系统,都不可避免地出现计算、IO、网络性能的损失[10]。而容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等封装起来,以最简洁的方式支持应用运行,轻装上阵,性能更佳[11]。
Docker镜像特性则让这种方式简单易行。当然,因为Docker共享内核的特性,所以容器隔离性没有虚拟机那么好[12]。
2.2 获取Docker镜像
Docker镜像可以通过pull操作直接从仓库中下载,也可以通过Dockerfile来创建。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大地简化了部署工作。
如图5所示,Dockerfile从FROM命令开始,紧接着跟随者各种方法、命令和参数,其产出为一个新的可以用于创建容器的镜像。
3 POC验证模块
为了提高验证模块的兼容度、降低验证程序编写的学习成本,此系统采用插件式的验证框架设计,验证过程由验证引擎启动,根据验证程序的类型说明,由分类器来决定输入的参数和使用哪种框架来执行程序[13],Docker容器的启动所产生的属于漏洞环境的IP地址将作为参数输入到验证系统中[14],在经过相应的框架执行完成后,不同的框架会产生不同的返回值,甚至返回一个布尔值,这些返回值都将交给结果处理器来汇总处理。在验证程序验证成功后,在数据库中就会将相应的漏洞信息标记为有效。
4 框架测试
测试漏洞为已经公布的couchdb数据库漏洞,漏洞编号为CVE-2017-12635,漏洞于2017年11月15日被披露,任意用户通过此漏洞可以创建管理员账户,造成垂直权限提升。向此系统提交漏洞的相关信息,提交的Dockerfile主要内容为:(1)从镜像库中以Debian系统来作为基础镜像;(2)获得CouchDB相关的运行脚本;(3)更新软件源中的所有软件列表;(4)从软件源中安装cURL软件;(5)运行从第二步获得的脚本,设置参数来添加CouchDB普通权限用户;(6)运行CouchDB服务。
在以Dockerfile生成的镜像的基础上启动容器,启动容器时设置相关的端口映射使Docker容器中的CouchDB服务端口映射到本地主机上。
在容器启动后,就可以调用相关的验证程序进行验证。编写验证程序时,可以使用任何一种验证框架来实现。此漏洞的验证程序的内容为发送一个经过特殊构造的HTTP请求包,目的是创建一个管理员账户。请求包中包含JSON数据,而此漏洞的形成原因就是由于Erlang和JavaScript对JSON解析方式的不同,使得语句执行产生差异性导致的。在数据包发送之后,验证程序会自动以刚刚创建的管理员账户进行登录,如果登录成功,就会返回漏洞存在的结果。确认返回结果后,系统将相关的漏洞信息存放到了数据库中,并关闭了容器,漏洞验证完毕。
5 结论
本文通过对Docker系统和漏洞验证系统的研究和设计,利用Docker容器和多框架的漏洞验证系统,设计了一种提供Dockerfile文件或者镜像后,可以快速地对漏洞环境进行验证的漏洞验证框架。通过向系统提供具体的漏洞和验证程序的测试,结果表明,本框架大大简化了漏洞环境的搭建过程,同时也提升了漏洞验证的速度。综上所述,本框架为需要频繁验证不同的漏洞提供了较有参考价值的解决方案。
参考文献
[1] 陈春玲,张凡,余瀚.Web应用程序漏洞检测系统设计[J].计算机技术与发展,2017,27(8):101-105.
[2] 陈峰,罗养霞,陈晓江,等.网络攻击技术研究进展[J].西北大学学报(自然科学版),2007,37(2):208-212.
[3] 罗玉斌.网络安全漏洞扫描系统的设计与实现[D].长沙:国防科学技术大学,2007.
[4] 赵智勇.网络攻击过程剖析[J].计算机与现代化,2012,8(8):55-56.
[5] 窦文超.网络攻击模拟器及其关键技术研究[D].天津:天津理工大学,2011.
[6] 董博,王雪,索菲,等.基于Docker的虚拟化技术研究[J].辽宁大学学报(自然科学版),2016,43(4):327-330.
[7] 肖小芳,宋建新.Docker网络通信研究与实现[J].通讯世界,2017(22):1-2.
[8] 钟良侃.Docker技术在Web服务系统中的应用研究[J].电脑知识与技术,2016,12(26):123-126.
[9] 邹保平,黄文思,张文晋,等.基于Docker的应用部署管理平台研究[J].电子设计工程,2017,25(12):41-44,48.
[10] 陈清金,陈存香,张岩.Docker技术实现分析[J].信息通信技术,2015(2):37-40.
[11] 张遥,王森林.Docker安全性研究[J].网络安全技术与应用,2017(8):32-33.
[12] 伍阳.基于Docker的虚拟化技术研究[J].信息技术,2016(1):121-123.
[13] 吴倩倩.综合型漏洞扫描系统的研究与设计[D].北京:华北电力大学(北京),2015.
[14] 王良.基于插件技术的漏洞扫描系统设计与应用[D].上海:上海交通大学,2012.
作者信息:
陈一鸣,寇小强,王永利
(华北计算机系统工程研究所,北京100083)