一种漏洞代码语义描述语言的设计与实现

2020-06-17 01:36陈锦富陈书杰张庆晨周敏敏
关键词:源代码示例漏洞

陈锦富,陈书杰,张庆晨,周敏敏,张 磊

(1.江苏大学 计算机科学与通信工程学院,江苏 镇江 212013;2.中国信息安全测评中心,北京100085)

漏洞是在系统硬件、软件的设计和实现时或在安全策略的制定配置上的错误而引起的缺陷[1].恶意用户可以利用安全漏洞进行非法访问系统或破坏系统的正常使用,所以需要综合使用各种安全工具来防御入侵以及分析漏洞,如:反病毒软件、入侵检测系统、防火墙、安全漏洞源、漏洞评估工具[2]等.由于这些安全工具通常自定义各自的输出格式规范,因此用不同的安全工具检测同一个安全漏洞得到的输出结果形式就会出现不同.不同的安全漏洞源中对该安全漏洞的描述也会出现不同,尤其当这些安全漏洞在不同漏洞源中的命名方式也不同时,这些不同的描述就很难关联起来[3].显然,由于缺乏一种统一而有效的漏洞模式信息描述的规范,使得不同安全工具间的协同工作变得极其困难,同时也使得对漏洞信息的深入研究受到一定的限制和影响[4].所以,制定一种通用而有效的描述方法来描述安全漏洞信息是必要的.

为此,研究人员提出了用一种形式化的语言或者编程语言代替自然语言来描述漏洞属性信息[5],从而实现漏洞信息的自动获取以及漏洞的自动检测和分析.形式化描述语言可分为基于BNF (backus-naur form)范式[6]和基于XML (eXtensible markup language)[7]的描述语言.基于BNF范式的描述语言具有效率较高、描述能力较强等优点,但比较难以设计与维护,另外由于在BNF范式设计中不同语言有着不同的语法规则和符号集合,所以它们之间的信息交互变得困难.基于XML的描述语言的优势在于它具有相对成熟完善的技术体系,同时还具备了良好的灵活性和扩展性,为不同语言之间的信息交互提供了极大的便利,并且可以解决跨平台的问题[8].但XML效率相对较低,且描述能力有限,但是发现其描述能力和效率问题在漏洞的相关研究方面几乎没有影响[9].

笔者从漏洞源代码角度出发设计一种漏洞代码语义描述语言VCSDL (vulnerability code semantic description language),结合漏洞模式基本信息以及漏洞源代码信息设计框架结构,试图在对漏洞信息描述的内容规格、全面性以及通用性等方面带来一定的提高和改善,以实际案例详细阐述VCSDL的描述与发布,讨论其应用模式,最后将其与安全领域其他描述语言在性能上进行定性对比分析.

1 相关研究

目前存在诸多研究计算机漏洞的组织,每个组织都有自己对计算机漏洞的研究成果,并且针对研究成果有自己的记录形式[10].在这种情况下,这些计算机漏洞的详细信息如何表示、如何与其他组织进行交流、如何在网络上供公众浏览就成了问题[11].因此,如果能够开发一种相对统一的对漏洞信息进行描述、交流和展示的语言,具有统一的标准和格式,并且可以扩展,可以随时添加新的漏洞和信息,则成了很有意义的事[12].这种语言就是漏洞描述语言.

漏洞描述语言的主要功能是实现对漏洞信息描述的格式和标准进行限定,具有扩展性、普适性,能完成漏洞信息的交流和展示.现存的比较通用的漏洞描述语言主要有OVAL(open vulnerability and assessment language)[13]和CVDL(XML-based computer vulnerability formal description language)[14].文中主要研究这2种漏洞描述语言并进行比较分析.

1.1 OVAL

OVAL由美国国土安全部的通信办公室和网络安全办公室共同支持,是一个国际化的信息安全相关的语言标准,主要用于促进安全内容的公开和开放,并且规范了从所有安全工具和服务中转化的安全信息[15].OVAL包含用于对安全系统以及所有的安全漏洞库进行编码的语言,该语言对安全评估过程的3个主要步骤进行了标准化:测试系统的配置信息;特殊机器状态(漏洞,配置,补丁状态等)的系统分析;评估结果的报告[16].OVAL组织开发了3种使用XML编写的作为OVAL语言的框架和词汇表.这3种Schema对应于评估过程的3个步骤:“系统特点Schema”代表系统信息;“定义Schema”表达特定的机器状态;“结果Schema”用于评估结果的报告.每次要建立一个使用OVAL描述的漏洞文件时,需要引用一个OVAL Schema作为该文件的内容结构,生成的文件也遵循XML语法.

1.2 CVDL

CVDL也是一种基于XML的形式化漏洞描述语言,由张永铮等[14]提出.CVDL漏洞描述语言具有通用性、全面性以及内容严谨规范等优点,特别是在描述漏洞检测、安全性影响、漏洞属性特征等方面表现突出.并且CVDL还具有良好的结构化描述能力,可以支持漏洞信息的收集以及漏洞检测等工作的自动化.CVDL架构主要包含5个部分:Brief,Detection,Security,Character和Remedy.每个部分对应了一种应用.

2 VCSDL的设计

上述2种描述语言虽然在对漏洞模式描述的全面性、通用性以及结构化方面做得较好,但这2种描述语言都只针对漏洞模式的基本信息,没有针对漏洞源代码的描述.而漏洞源代码包含了许多重要信息,例如触发漏洞的主要函数、漏洞的触发方式等信息,同时,同种编程语言的不同安全漏洞往往会表现出一些相同的特征,所以笔者从漏洞源代码的角度出发,提出一种漏洞代码语义描述语言VCSDL.

Web标准化组织W3C推出了一种可扩展标记语言XML.XML具有较高的可扩展性、良好的数据格式以及高度结构化等优点,为数据描述和数据交换提供了一种有效的手段和通用方法,其在信息交换和整合领域具有重要的意义.由于XML模式机制在约束元素的内容规格方面具有较大的优势,所以考虑采用XML模式机制来设计VCSDL.

为了使VCSDL的应用更加广泛,更易于被用户接受,VCSDL将使用关键字和标签对XML文档赋予特定的语义信息来描述漏洞源代码.设计原则:① 具有通用性,可以描述不同种类的漏洞源代码;② 具有精准的描述能力,可以描述漏洞模式和漏洞触发条件;③ 具有较强的可扩展性,可用于描述内容多变,新增类型的漏洞模式;④ 具有易用性,用户可以很方便地使用该语言编写规则文件;⑤ 具有清晰的形式化语义以及相对简单的结构化语法.

2.1 框架结构

VCSDL的设计主要基于XML采用树形结构,VCSDL的框架结构如图1所示,一个漏洞描述文件的根元素为,可以包含多个漏洞模式语义的描述元素.VCSDL主要包含4个子元素,即基本信息Description、源代码语义信息Analy-sisinfo、源代码上下文信息Context、漏洞触发条件Condition,每个子元素对应了一个属性类,用来描述漏洞代码属性的不同方面.

图1 VCSDL的框架结构图

2.2 Description元素

Description元素用来描述漏洞代码的基本信息,主要包含漏洞代码标识号ID、名称Name、CWE ID、漏洞模式建立的时间Time、危险程度Severity、种类Category和其他对漏洞模式的相关描述信息Summary这7个元素.Description的结构如图2所示.该结构具有良好的可扩展性和灵活性.设计CWE ID是为了使VCSDL能够与国外主流数据库兼容,方便漏洞信息在国际上进行交流,实现CWE ID作为主键的搜索,增强其可扩展性.Summary元素的设计是为了兼容网络上公开发布的对漏洞信息的自然语言形式的描述.

图2 Description元素的结构图

2.3 Analysisinfo元素

Analysisinfo元素用来描述漏洞代码提炼出的语义信息,主要包括漏洞代码的描述语言Language、分析范围Domain、分析模式Mode和敏感性说明Sensitive这4个元素.其内容结构如图3所示,每个元素分别自定义了枚举数据类型.

图3 Analysisinfo元素的结构图

2.4 Context元素

Context元素的结构如图4所示.Context元素用来描述漏洞代码的上下文信息,主要包括全局变量名信息Var、函数信息Function、命名空间Namespace和类名Classname.其中:Var又包含变量名称Va-lue、变量类型Type;Function包含了函数相关信息描述Identifier、函数参数描述Inarg.

图4 Context元素的结构图

2.5 Condition元素

Condition元素主要使用逻辑运算表达式和必要的算术运算表达式来表示漏洞的触发条件.主要包括漏洞触发的逻辑表达式Trigger、漏洞触发条件的相关性Type和漏洞触发条件的有序性Seq这3个元素.其内容结构如图5所示.

图5 Condition元素的结构图

2.6 VCSDL的Schema

VCSDL的Schema主要定义了语言中包含了哪些元素类、哪些子元素、这些元素的数据结构和属性、是否是必选、是否允许值为空、取值范围以及元素相互之间的结构和从属关系等.VCSDL的部分Schema结构如下:最外层声明根元素名称Vulns;第2层声明子元素Vuln;第3层声明4个描述元素的名称;第4层声明元素包含的属性名称以及属性的数据类型.

建立该XML Schema 文件后就可以依据该 Schema 文件创建相应的 XML 文件,可以在 XMLSpy 中创建XML,在新建一个 XML 文档后选择相应的 Schema 文件就创建了一个 XML 文档,该 XML 文档包含对应的 Schema 中定义的主要元素.然后利用 XMLSpy在视图中填入相应的数据就可以创建一个XML文档.

2.7 增强关键字

为了增强VCSDL的描述能力,引入增强关键字.这些关键字有效提高了VCSDL的抽象描述能力,能对常见的漏洞代码模式进行更加灵活的描述.定义的关键字以字符“#”开头,例如:#ifblock(a)表示变量a的值经过了检测;#deref(p)表示对指针p的各种解引用;#free(t)表示释放内存t索引的内存;#&a表示取变量a的地址;#def(a,b)表示变量a由变量b的值来定义等.为了省略与要描述的漏洞模式无关的信息,引入了通配符 “*”和占位符“-”,它们和这些关键字可以在Context和Condition部分更加详细地描述漏洞源代码变量以及函数的关系,增强VCSDL的描述能力.此外,为了更为精准地描述漏洞触发条件,同时避免漏洞模式的文档结构过于复杂,VCSDL使用逻辑表达式描述该漏洞触发条件.

2.8 与类结构相关的描述

VCSDL还考虑了与类结构相关的漏洞代码的描述.在Context元素中引入了Base,Son,Union,Part这4个子元素,用来说明类与类之间的继承关系.为了说明函数多态性引发的漏洞,VCSDL在Function中引入Applyto元素,该元素具有2个布尔属性override和extend,分别说明该漏洞模式是否适用于子类中对该函数的重载或者继承的实现.通过使用VCSDL可以将存在漏洞的源程序在代码层面上建立统一的语义表达.

2.9 与特定工程相关的描述

VCSDL考虑了与特定工程有关的软件漏洞代码的描述.发现许多与工程相关的漏洞是通过修改不同版本的漏洞代码获得,这些漏洞模式往往表现为纯粹的漏洞代码块,很难规范化来描述.VCSDL采用的描述方法是将Analysisinfo元素的子元素Mode的属性值设为pure-code,表示漏洞模式为纯代码块.同时在Context元素中说明代码块中与漏洞模式相关的变量信息,最后将该漏洞代码块中与漏洞模式相关的代码语句直接存储在Condition中.

3 VCSDL的应用

一种漏洞描述语言的实用性决定了它是否能够被广泛地认可和应用,所以完全有必要针对VCSDL的应用进行讨论.从目前对漏洞研究的需求来看,VCSDL的应用主要包含漏洞源代码信息的描述、漏洞描述信息的发布以及不同漏洞数据源之间的交流等方面,其中漏洞源代码信息描述和漏洞描述信息的发布是其他应用的基础,同时也最具有应用价值,所以主要针对这2种应用展开讨论.

3.1 案例描述

软件漏洞源代码在本质上是用特定的语言编写的一段程序,所以软件漏洞源代码具备了类声明、变量声明、函数定义、数据操作和流程控制等程序语言所具备的要素.本研究的对象为Juliet漏洞集,该漏洞集示例来自NIST网站[17],对漏洞类型达到了全面的覆盖.主要以JAVA语言为例,其他的语言可以此为参照进行相关的标注.虽然VCSDL描述的漏洞代码类型不同,但是VCSDL文档具有一个固定的文档架构,架构如下:

xsi:SchemaLocation="D:VCSDLVCSDL.xsd">

其中:第1行指示XML文档的版本和编码;第2-4行指示VCSDL的版本号、命名空间和文档的存储位置.元素实现对不同类型漏洞代码的具体描述,每个元素可以包含多个模式语义的描述元素.

以漏洞CWE614-Sensitive-Cookie-Without-Secure--Servlet-01为示例[17].其中:CWE614为该用例对应的CWE编号;Sensitive-Cookie为该用例的类型简称;Secure--Servlet为问题的描述;01为其复杂度.

该示例的Description元素所描述的基本信息收集自CWE(common weakness enumeration)官网,为了便于存储和读取漏洞信息,需进入CWE官网下载XML版本的漏洞数据版本并将其转化为关系型数据库存储,通过读取关系型数据库直接获取基本信息.在此例中,Description共包含了7条有效的非空信息.该实例的ID为VCSDL-614,CWEID为CWE-614,漏洞名称为CWE614-Sensitive-Cookie-Without-Secure--Servlet-01,建立的时间是2008-09-23,严重程度为1,漏洞类型为Sensitive-Cookie,从其他描述可以看出:由于未设置HTTPS会话中敏感cookie的Secure属性,这可能导致用户代理通过HTTP会话以纯文本格式发送这些cookie,从而出现该漏洞.

通过对示例漏洞源代码的基本语义分析,得到该示例的Analysisinfo元素,共包含4条有效的非空信息,即:该示例所使用的语言为JAVA语言,分析范围为全局范围,漏洞触发模式是函数相关,敏感性说明主要包含了路径敏感和上下文敏感.

通过对示例漏洞源代码的基本语义分析,可以得到该示例的Context元素,共包含4条有效的非空信息,分别是1个全局变量cookie,3个带参函数并且参数列表都相同,同时描述good函数时使用了增强关键字#call(good,good1),表明good函数中调用了good1函数.

通过Analysisinfo元素描述得知,该漏洞代码漏洞触发模式函数相关,而从Context元素对漏洞代码包含的3个函数描述分析得出漏洞代码的触发条件.该示例的Condition元素的具体描述共包含3条有效的非空信息.其中:当Condition的元素type属性值取positive时,表明该条件是触发该漏洞需要满足的条件;当type属性取negative时表明违反该条件时会触发该漏洞,即该表达式是程序应当遵守的规则,违反该规则的代码段即表现为一个漏洞.Seq取false表明触发条件不需要强制有序.可以看出:该示例由于没有设置HTTPS会话中敏感cookie的安全属性,所以可能会导致用户代理通过HTTPS会话以明文方式发送这些cookie,从而导致信息的泄漏.

3.2 VCSDL的发布

目前,漏洞资源信息主要来自于漏洞数据库以及网页资源,但这些漏洞资源信息的描述往往并没有按照统一的语言标准,所以它们之间的整合需要先转换成VCSDL文档的第1个部分Description元素,Description元素主要用来描述漏洞的基本信息.漏洞数据库中存储的漏洞信息以及网页展示的信息具有较高的结构化,所以可以使用XSLT (eXtensible stylesheet language transformations)语言或者简单的编程完成转换,VCSDL文档的第2部分主要是对漏洞源代码信息的描述,需要借助抽象语法树分析漏洞的源代码提取出相关属性,然而VCSDL中的一些属性是抽象语法树无法获取的,所以需要借助人工分析来完成.

发布VCSDL的主要目的是为用户提供一个可视化的漏洞信息展示.目前,大多数的漏洞资源信息都是以网页的形式发布,但这只方便了用户对漏洞信息的浏览,并不方便对漏洞的进一步分析以及识别,VCSDL以文档形式对漏洞基本信息以及源代码信息进行了结构化的描述,为漏洞的后续工作提供了支持.但文档形式的VCSDL的可读性远远不如网页形式,所以为了提高VCSDL的可读性,采用XSLT将文档中的漏洞信息转换为统一风格的网页形式.因此,采用VCSDL发布漏洞信息不仅方便了对漏洞的进一步分析,同时方便了对用户的直观展示,具有较高的应用价值.

4 描述语言对比分析

为了更好地说明VCSDL语言的优势和特点,在相关漏洞研究领域选取了5种比较具有代表性的描述语言,在通用性、全面性、自动化支持、兼容性、灵活性、规格严谨性、可扩展性、易操作性以及交互转换支持等方面与VCSDL进行详细的对比,对比分析结果如表1所示.其中:OVAL主要侧重于漏洞检测方面的属性;CVDL针对漏洞的检测、评估以及预防做出较为详尽的描述,但缺少漏洞代码属性方面的描述;VDL是一种自行设计的基于BNF范式的安全脆弱点描述语言,其仅仅解决了漏洞命名不规范的问题;AVDL主要针对的是Web应用程序漏洞,并且其文档架构优化较差;WAS是一种非通用的漏洞描述语言.使用3种代表不同程度的符号(好/一般/差)来定性评价各方面的属性,程度符号则代表6种描述语言在属性方面相互比较的一种相对程度,从表1可以看出:VCSDL具有通用性、全面性和高度结构化等特点,相比于其他描述语言,优势主要体现在全面性、兼容性以及扩展性等方面.

表1 描述语言对比分析

注:√表示好;○表示一般;×表示差.

5 结 论

1) 同种编程语言条件下,不同的安全漏洞可能会表现出相同的特征,从漏洞源代码角度触发,基于XML提出了一种形式化漏洞代码描述语言VCSDL,该描述语言主要针对漏洞基本信息以及漏洞源代码信息进行了结构化的描述.

2) 讨论了VCSDL的应用模式,以Juliet漏洞集中的漏洞代码为案例详细阐述了VCSDL对漏洞信息的描述,同时分析了VCSDL的转换以及VCSDL的发布,采用VCSDL发布有助于对漏洞信息的自动化分析以及后续工作.

3) 与其他领域相关的描述语言相比,VCSDL主要具有通用性、全面性以及高结构化等优点,尤其是能够详尽地描述漏洞代码属性.

4) 由于漏洞集过于庞大,通过人工逐条手动标注明显不可取,所以下一步工作将研究如何实现对庞大的漏洞集进行自动化标注并生成VCSDL文件.

猜你喜欢
源代码示例漏洞
漏洞
基于TXL的源代码插桩技术研究
2019年高考上海卷作文示例
“全等三角形”错解示例
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
三明:“两票制”堵住加价漏洞
飞吧,云宝
漏洞在哪儿
高铁急救应补齐三漏洞