刘 安 张小梅 郭新海 丁 攀
中国联通研究院 北京 100048
Web应用和人们的生活紧密相关,承载着大量隐私信息,一旦被攻击者获取后用于违法活动,会造成巨大的损失。近年来,每天都有大量不法分子进行攻击活动,攻击的安全事件也越来越多。注入攻击、XSS、文件上传、反序列化等攻击手段层出不穷,攻击方式更为隐蔽,许多0day漏洞也不断曝出,给人们造成巨大损失。如何加强对Web应用的安全防护,成为人们普遍关心的问题[1]。
Web应用被攻击,究其根源是因为开发人员安全意识淡薄以及编码水平限制,在研发Web应用时无意中引入漏洞[2]。漏洞来自两个部分:一是源代码本身存在的编码缺陷,二是来自编码过程中引入的依赖库。超过六成的安全漏洞和代码缺陷相关,这种漏洞会在后期部署后逐一显露,代码引入的漏洞隐蔽性比较强,靠后期的防护手段成本较大,对于一些隐藏比较深的漏洞,传统的防护手段很难发现,容易产生一些0day漏洞,造成安全威胁。另一方面,为了给开发者提供方便,将一些公共函数封装成依赖包供开发者调用,提高了研发效率,但是依赖库一旦出现安全漏洞,对所有引用依赖库的应用都会产生影响,波及范围更广。现许多企业都以开源组件作为自身的代码架构基础,开源组件的可更改性和便利性,都可能成为攻击者首选的攻击点。开发人员在研发应用时有必要确保他们所使用的开源组件的安全性,并持续监控这些组件的安全漏洞。
在应用研发阶段,增强开发人员安全意识,及时发现编码中的缺陷,识别依赖库中的漏洞,能够从源头处及时阻断漏洞发生的可能性,减少后期安全防护的成本,从根本上保证Web应用的安全性。
根据Web应用项目代码的特点,防护方案从三个层面对项目代码进行整体防护,如图1所示。一是通过静态源码审计技术对项目源代码进行安全审计,分析代码中的编码缺陷。二是通过软件成分分析技术对项目代码中依赖的第三方库进行漏洞识别,消除开源代码中的漏洞。三是提供安全编码规范以及安全基础库SDK,研发人员在编写代码时以安全编码规范为指导,避免安全漏洞的引入,并通过调用安全基础库SDK中提供的安全函数,消除编码过程中的安全隐患。在使用静态源码审计技术对代码进行审计时,可以将安全基础库SDK中的安全函数添加白名单,减少审计源代码时的误报率,提高效率。
图1 Web应用代码整体防护方案
Web应用的开发人员安全经验不足,以完成功能点为导向的开发模式很容易忽视编码中的安全问题。此外,由于开发人员缺乏安全知识,很容易引入代码缺陷,项目一旦上线,其安全问题接踵而至,增加了防护成本[3]。因此,静态源码审计技术应运而生,识别代码缺陷,保证应用的安全性。
源代码审计技术的原理如图2所示。上传源代码后,防护方案首先进行词法分析,读取源代码的字符流,并将其分解成小的程序片段[4]。然后进行语义分析,根据词法分析的结果,生成抽象语法树,将生成的结果和漏洞安全规则库中的规则进行匹配,识别程序中的漏洞。至此阶段的分析,还不能完全理解软件中的语义,漏报率和误报率较高,需要进一步分析。根据词法和语义分析的结果,生成称为控制流图的有向图,分析语句之间的关系,提取代码中的控制流信息[5]。在此基础上进行数据流分析,遍历源代码生成的控制流图,收集程序执行中的数据信息,根据上下文理解指令的行为,推断程序中存在的安全漏洞。为了提高检测的准确度,对上述分析的结果进行深度分析,深度分析的方法包括区间分析、循环摘要、函数分析、指向分析和缺陷模式约束。最后对各阶段的结果进行分析整理,生成源代码漏洞检测报告。在整个漏洞识别的过程中,其判断依据主要来源于国外的GitLib、Github、NVD、CVE和国内的CNNVD等组织,根据这些组织提供的漏洞信息,建立漏洞库和漏洞模式库识别代码中相关漏洞。
图2 源代码审计方案
第三方依赖库的使用,大大缩短了开发周期,减少开发者的工作量。目前越来越多的Web项目都引用了第三方依赖库,由于开发人员安全经验不足,对安全漏洞关注度不够,很容易引入带漏洞的依赖库,所以其安全性应该引起足够重视。软件成分分析技术通过识别依赖库的版本和名称等信息,与后台的CNNVD和CVE漏洞库以及未公布的漏洞库等进行匹配,发现所引用依赖库的漏洞。下面详细说明防护方案中软件成分分析技术实施过程。
如图3所示,项目的jar包解压后,会发现lib目录下包含项目代码中所有的依赖包,pom.xml文件中通过包坐标的形式也定义了项目所需的依赖包,软件成分分析实施方案在分析依赖包时,主要依据pom.xml以及项目包中的lib文件进行鉴别。首先,将lib下的jar包进行MD5值计算,然后查询后台的漏洞库进行MD5值匹配,发现引用包中的漏洞。其次,通过pom.xml分析引用包中的依赖关系,根据分析得到所有依赖包的版本和包名等信息,和后台的漏洞库进行版本和包名的匹配。最后,将两个过程发现的漏洞取合集,识别出依赖库中的漏洞。如果提供的是源码,则只能通过对pom.xml的分析项目代码中所有的依赖包来识别漏洞。
图3 Web应用代码依赖包
从目前公开的漏洞来看,大部分安全漏洞很大程度上是由于代码编写不规范、缺少安全编码意识所致。编写安全漏洞的防护代码往往需要研发工程师具备一定的安全知识,否则很容易造成修复不当再次被绕过利用的风险。因此,将安全编码规范与安全基础库SDK两者进行融合,真正将安全编码规范落地到研发链条中,实现效果最大化。下面详细说明防护方案中安全编码规范与安全基础库SDK实施过程。
首先,进行漏洞统计分类。由于OWASP TOP10只定义了10个大类,通过对Web应用中普遍出现的漏洞进行分析,以及安全领域的经验,对10个大类进行了细分类,同时对OWASP TOP10没有涉及的漏洞也进行了总结,得到的结果如表1所示。然后,对这些小类漏洞进行安全编码规范和安全基础库SDK的开发,其中安全编码规范内容包含漏洞描述、安全编码方法、安全编码用例以及缺陷代码示例,安全基础库SDK中由专业安全人员进行开发,其中包含了避免这些漏洞的函数。最后,开发人员根据安全编码规范为指导进行安全编码,并且在编码过程中调用安全基础库SDK的函数,避免漏洞的产生。同时在静态源码审计时,将安全基础库SDK中函数设置白名单,减少误报,提高审计效率。
表1 不同UP演进版本定义的5G消息功能
代码安全是漏洞引入的源头,所以要足够重视,但是当前现状是只引入了静态源码审计技术或者软件成分分析技术,或者引入了两种技术但是没有一个有效的方法指导开发人员避免或者修补代码漏洞,所以目前已存在的方法不能有效对Web应用代码进行整体安全防护。通过分析代码安全防护的痛点,提出了一整套的Web应用代码安全防护方案。在Web应用代码安全防护方案整体建设中,既需要依赖静态源码审计技术对开发人员研发的代码做漏洞检测,及时发现代码中的漏洞[6],也需要对开发人员引入的组件进行漏洞检测,及时发现含有漏洞的开源组件,同时需要编码规范和安全基础库SDK对代码漏洞进行整改,并指导开发人员在Web项目的开发中避免引入代码漏洞。下面对Web应用代码安全防护方案中的主要技术进行实验效果分析。
1)静态源码审计技术实验效果分析
本文选用OWASP Benchmark作为测试靶场。
OWASP Benchmark测试集包含2740个漏洞,分为真漏洞和假漏洞,能够很好体现出源代码审计实施方案的效果,检测出其误报率和漏报率。将代码上传至源码审计系统进行审计,测试中会有以下几种结果:正确识别真实漏洞(True Positive-TP),真阳性;无法识别真实漏洞(False Negative-FN),假阴性,属于漏报;正确地识别假漏洞(True Negatvie-TN),真阴性;错误地报出假漏洞(False Positive-FP),假阳性,属于误报。表2是源代码审计检测结果的统计分析表。
通过表2的数据,进行计算可得如下结果:
表2 Benchmark检测结果
2)软件成分分析检测效果分析
开源依赖包的引入,给应用开发者带来了极大的便利,大大缩短了开发周期。很多公司默认为开源即安全,不重视开源依赖包的漏洞检测。随着开源软件漏洞的不断出现,SCA的重要性也凸显出来。目前市面上没有公开的漏洞靶场去检测SCA技术的优劣,下面采用Github和私有软件以及jar包和源码包相结合的方式来检测SCA方案的优劣,并通过查询NVD漏洞库,证实组件漏洞的真实性,证实过程如图4所示:首先利用软件成分分析技术查找含有包含漏洞的组件版本,本例中为MyBatis 3.5.3,属于包含高危漏洞的组件,为了证实结果的准确性,登录NVD官网,输入该组件的名称进行搜索,可以看到该组件在3.5.6版本之前都存在漏洞,并且根据V3.1评分标准该组件存在高危漏洞,所以就证实了分析结果的准确性,根据该步骤验证其他组件,便可以检验利用软件成分分析技术检测包含漏洞组件的准确性。
图4 NVD官网查找组件漏洞
表3是测试分析结果,通过对比分析NVD漏洞库,检查组件漏洞的准确率可以达到100%。
表3 SCA测试结果分析表
从检测结果来看,软件成分分析技术可以检测出项目中引入的开源软件,识别出含有漏洞的开源软件,帮助研发人员消除开源组件引入的安全风险。研发人员可以通过升级软件版本的方法消除这些漏洞。
通过静态源码审计和软件成分分析检测效果的分析可知,该方案不仅能够及时发现开发人员编写源码中存在的漏洞,而且能够发现引入含有漏洞的开源组件。此外安全编码规范和安全基础库SDK能够指导研发人员进行漏洞整改以及指导开发人员进行安全编码,形成从项目代码编写到项目安全测试全流程的安全防护,填补了当前对Web应用代码安全防护方案的空白。
Web应用提供了Web服务,为人们的衣食住行提供了便利。Web应用中包含个人大量的隐私信息,一旦被非法获取到,会给个人乃至国家造成巨大损失[7]。Web应用项目代码是漏洞产生的源头,从源头上消除安全隐患,才能节约成本,真正提升Web应用的安全性[8]。文中提出的Web应用代码防护方案,不仅从源代码和依赖库进行了漏洞识别,而且对安全编码规范和安全基础库SDK进行了研究,从写代码到识别漏洞,再到对开发人员进行安全编码指导,全方位消除Web应用代码可能产生漏洞的薄弱环节,保证了Web应用代码的安全性,从根本上对Web应用进行了安全防护。