RFC制导的SSL/TLS实现中数字证书验证模块的差异测试方法与流程

文档序号:15557688发布日期:2018-09-29 01:30阅读:272来源:国知局

本发明属于计算机软件分析技术领域,尤其涉及一种rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法。



背景技术:

目前,业内常用的现有技术是这样的:随着计算机网络技术的快速发展,互联网与人们的工作、生活和学习联系日益紧密,互联网安全的重要性也日益凸显。为增强安全性,互联网的超文本传输协议(hypertexttransferprotocol,http)升级为超文本传输安全协议(hypertexttransferprotocolsecure,https)。相对于http,https使用安全套接字层(securesocketslayer,ssl)/传输层安全协议(transportlayersecurity,tls)保障互联网通讯的安全性。ssl/tls在握手阶段通过验证服务器或客户端的数字证书以实现对服务器或客户端进行身份认证。对服务器进行身份认证时,服务器将其持有的数字证书发送给客户端,客户端通过验证接收到的数字证书来判断此服务器是否为真正的目标服务器。对客户端进行身份认证的过程与此类似。只有服务器或客户端通过了身份认证,后续的密钥形成和加密通讯才可以继续进行。身份认证能否正确执行非常重要:如果身份认证错误地接收恶意服务器或恶意客户端的非法证书,则会导致后续的通讯陷入不安全的境地;如果身份认证错误地拒绝正常服务器或正常客户端的合法证书,则会导致合法的通讯请求无法完成。因此,ssl/tls实现中数字证书验证模块的正确性对互联网的安全是至关重要的,对ssl/tls实现中数字证书验证模块进行有效测试是保障其正确性的必要手段。现有技术中frankencert方法对数字证书进行变异后用于ssl/tls实现中数字证书验证模块的差异测试。首先,frankencert方法从互联网上收集了243246个数字证书;然后,通过对这些数字证书的组件进行组合生成了8127600个数字证书并用于15个ssl/tls实现的差异测试,产生了208个差异,这些差异进一步规约为9个不同的差异。为提高差异测试的效率,mucert方法以代码覆盖率为导向,使用37个变异算子对1005个数字证书进行变异并对变异后的数字证书采用马尔可夫链蒙特卡洛(markovchainmontecarlo,mcmc)采样。变异后的数字证书用于9个ssl/tls实现的差异测试,得到了27个不同的差异。虽然frankencert和mucert方法对ssl/tls实现中的数字证书验证模块进行差异测试取得了一定的成功,但仍存在一些问题:首先,差异测试得到的差异本身既不能解释差异产生的原因也不能解释哪些ssl/tls实现存在缺陷;其次,某些变异后的证书不能被现有的工具所解析,造成分析其结构和内容的困难性;最后,差异测试得到的差异是否总是有效的仍是一个待解决的问题。因此,提出一种能解决这些问题并且更高效的测试方法是非常必要的。

综上所述,现有技术存在的问题是:

(1)差异测试得到的差异本身既不能解释差异产生的原因也不能解释哪些ssl/tls实现存在缺陷。

差异测试中用于测试的数字证书由变异得到,而如果变异的数字证书导致了差异,那么产生差异的原因是无法直接解释的。无论对于测试工程师还是ssl/tls开发工程师,只有对变异的数字证书的结构和内容进行进行充分的分析后,才能解释差异产生的原因,才能进一步判断哪些ssl/tls实现中存在缺陷。如果分析工作由人工完成,对变异的数字证书进行结构和内容的分析需要分析人员熟悉数字证书的结构和约束,具体的分析工作中容易出现分析错误;如果分析工作由程序完成,可减少人工分析中的错误,但这一方面的工作迄今未见公开成果,需要从头开始构造这种针对变异数字证书的分析程序。

(2)某些变异后的证书不能被现有的工具所解析,造成分析其结构和内容的困难性。

如果要分析这些变异证书的结构和内容,一种方法是改造既有的工具,另一种方法是构造新的工具。改造既有的工具需要熟悉其功能和代码并且不能影响其余的功能;构造新的工具则需要进行功能设计并编制相关代码。无论改造既有的工具还是构造新的工具都涉及数字证书结构的解析、加密、解密和签名算法,具有较大的困难性。如果不改造既有工具也不构造新的工具,则没有工具可分析这些数字证书。

(3)差异测试得到的差异不总是有效的。

由于差异测试中使用的数字证书是由变异得到的,不能保证变异后造成差异的原因是违背了数字证书必须遵守的规则。而对于具有一定灵活度的规则,不同的ssl/tls实现可能会有差异,这种差异是无效的。现有方法无法直接甄别无效差异,对无效差异的分析会造成人工的浪费、工作效率的降低。

解决上述技术问题的难度和意义:

如果通过对现有方法进行改造以解决上述技术问题,则具有较大的困难:一方面,如果对现有方法添加人工工作,会导致工作效率低下而且容易出错;另一方面,如果对现有方法添加自动化程序,则需要熟悉现有系统的功能与代码或设计并实现新的系统,还需要涉及复杂的加密、解密和签名算法,设计和实现的困难较大。

如果通过发明新的方法解决上述问题,通过自动化解释差异出现的原因及哪些ssl/tls实现中存在缺陷可以避免人工分析或分析程序的构造,帮助ssl/tls开发人员有效地甄别和解决ssl/tls中存在的缺陷;通过组装有效的数字证书以实现测试用例能被现有的工具所载入和分析,避免改造或构造新的分析工具所需的代价;通过自动甄别无效差异,避免相关的分析等工作,提高工作效率。



技术实现要素:

针对现有技术存在的问题,本发明提供了一种rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法。

本发明是这样实现的,一种rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法,所述rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法从rfc中提取并更新规则;对规则进行分类,进一步对消费者规则和共享规则分为可打破规则和不可打破规则,规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序;对符号化程序使用动态符号执行技术生成低级测试用例;根据低级测试用例组装高级测试用例即数字证书;使用组装的数字证书对ssl/tls实现中的数字证书验证模块进行差异测试。

进一步,所述rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法包括以下步骤:

步骤一,根据rfc2119规定的关键字集合从rfc5280和6818中提取数字证书的规则,根据rfc6818对rfc5280的规则进行更新;

步骤二,对更新后的规则分为3类即生产者规则、消费者规则和共享规则,对消费者规则和共享规则进一步分为可打破规则和不可打破规则,规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序;

步骤三,对符号化程序使用动态符号执行技术生成低级测试用例;根据低级测试用例组装高级测试用例即数字证书;

步骤四,使用组装的数字证书对ssl/tls实现中的数字证书验证模块进行差异测试,基于数字证书的信息计算测试结果中的差异数、不同差异数、缺陷数、rfc遵守率。

进一步,所述步骤一具体包括:

(1)根据rfc2119中规定的书写rfc所需遵守的关键字集合从rfc5280和6818中提取数字证书的规则。

把rfc5280或rfc6818文本即rfc5280.txt或rfc6818.txt中的换页符、页眉、页脚和空行删除得到的文本记为r;

把r根据一级标题分割为节;

对于rfc5280中的第4至第8节、rfc6818中第2至第8节中的每一节,首先置规则集合变量ruleset为空集、规则编号rulenum为0;然后对于rfc5280任意j级标题(1≤j≤5)、rfc6818任意j级标题(1≤j≤2)和下一个标题之间的内容根据“.\n”和“.”提取英文语句,根据“::=”、“::={ln。。。}ln”和“::={ln。。。}ln’”提取abstractsyntaxnotationone(asn.1)表示的结构,其中“::=”、“::={ln。。。}ln”和“::={ln。。。}ln’”分别表示asn.1结构定义中没有左右大括号、有左右大括号并且在同一行、有左右大括号并且不在同一行;

对于每个英文语句和asn.1结构判断其是否包含rfc2119中规定的关键字,如果包含则说明该语句或结构是一条规则记为s,此时rulenum增加1,由rulenum、第j级标题和该规则s形成3元组s′=(rulenum,titlej,s),将s′加入ruleset;最后把ruleset保存为文本文件;

(2)根据rfc6818对rfc5280的规则进行更新,根据rfc6818中“…says:”、“…replacedwith:”和“add(ed)…”分别指示废弃的、更新的和附加的段落的特点把该节中的规则分别添加到废弃的规则集合obruleset和更新的规则集合upruleset中;然后,对每条规则r计算构成该规则的单词集合wordsetr,计算任意2条规则r1和r2的单词集合之差即matrix[r1,r2]=|wordsetr1-wordsetr2|;最后,对于obruleset中的每条规则o做如下计算:对于upruleset中的每条规则u计算使得matrix[o,u]最小的u并赋给表示规则o更新后的规则记为updateo,如果不存在这样的matrix[o,u]则说明规则o被丢弃即updateo=discarded,否则如果matrix[o,u]=matrix[u,o]=0则说明规则o没有变化即updateo=unchanged,否则应该用规则u更新规则o即updateo=u,对rfc5280的规则o用updateo进行更新。

进一步,所述步骤二具体包括:

(1)把更新后的规则分为3类:生产者规则、消费者规则和共享规则;

把生产者规则集合producerruleset、消费者规则集合consumerruleset和共享规则集合sharedruleset分别设置为空集;

对于rfc5280更新后的规则集合updatedruleset中的每条规则r,对于生产者规则的模式集合中任意一个模式m,如果r匹配m则把r加入到producerruleset;对于消费者规则的模式集合中任意一个模式m′,如果r匹配m′则把r加入到consumerruleset;

共享规则集合为生产者规则集合与消费者规则集合的交集即sharedruleset=producerruleset∩consumerruleset;从生产者规则集合和消费者规则集合中分别去除共享规则集合即sharedruleset:producerruleset-=sharedruleset和consumerruleset-=sharedruleset;最后收集生产者规则和消费者规则外的规则即updatedruleset-producerruleset-consumerruleset作为共享规则;

(2)对消费者规则和共享规则进一步分为:可打破规则和不可打破规则;

把可打破规则集合breakableruleset、不可打破规则集合unbreakableruleset和不可打破规则的模式集合patternset分别设置为空集;

对于rfc2119规定的关键字集合中任何一个关键字m,对于任意一个不可打破规则模式u,把m+“凵”+u添加到patternset;

对于消费者规则和共享规则集合csrset中任意一个规则r,对于patternset中任意一个模式p,如果r匹配p则把r加入到unbreakableruleset中;

计算可打破规则集合breakableruleset=csrset-unbreakableruleset;

(3)把可打破规则和不可打破规则转换为规则变量;

设置响应集合responseset、其它保留字集合otherset和规则变量集合varset为空集;把rfc2119规定的关键字加入到关键字集合modalkeywordset,把表示句子结构的单词加入到句子结构模式集合sentencepatterns,把表示逻辑关系的单词加入到逻辑模式集合logicpatterns,把表示响应的单词加入到响应模式集合responsepatterns,把数字模式加入到其它保留字模式集合otherpatterns,把数字证书组件名称及其变化形式加入到组件名称集合componentset;

对于每一条不可打破规则和可打破规则r,对于modalkeywordset中任意一个关键字m和responsepatterns中任意一个响应模式rp把r中m+“凵”+rp后的单词加入到responseset;把r中与otherpatterns中任意模式p匹配的单词加入到otherset;

保留字集合reservedset是modalkeywordset、sentencepatterns、logicpatterns、componentset、responseset和otherset的并集;

对于每一条不可打破规则和可打破规则r,删除r中不属于reservedset的单词得到r′;

对于任意r′,如果r′是用自然语言表达的,则根据其语法结构得到该规则表达的所有情况;对于每种情况,首先得到条件condition=“c1,v1,...,ci,vi”,其中c1,...,ci是该条件中所涉及组件的名称,v1,...,vi是对应组件的取值,如果r′是不可打破规则,如果存在响应部分则得到响应response“consumer,actions”;把condition[+“:”+response]加入到υarset,其中括号表示当response存在时为condition+“:”+response,否则为condition;如果r′是可打破规则,如果存在结果部分则得到结果result=“c1,υ1,...,cj,υj”;把condition[+“:”+result]加入到varset,其中括号表示当result存在时为condition+“:”+result,否则为condition;

对于任意r′,如果r′是用asn.1表达的,对于每个可选的组件c,如果有嵌套的约束t则c的约束为constraintc={“c,absent”,t},如果没有嵌套约束则constraintc={“c,absent”,“c,present”};对于每个不可选的组件c′其约束为constraintc′={“c,validvalue”};组合r′的约束并加入到varset;

对于varset中每个约束,用单下划线和双下划线(“_”和“__”)分别替换逗号和冒号(“,”和“:”);

(4)把规则变量用于形成dse技术中的符号化程序;

生成“#include<stdio.h>”、“#include<klee/klee.h>”和“intmain(){”;

对规则变量生成变量声明;

对不可打破规则和可打破规则对应的规则变量分别进行符号化;

对不可打破规则对应的规则变量v生成“if(v>0)printf(“v>0”)else”;

对可打破规则对应的规则变量v′生成“if(v'<0)printf(“v'<0”)else”;

删除多余的“else”并添加“}”;

保存为c文件。

进一步,所述步骤三具体包括:

(1)使用dse技术处理符号化程序;

(2)把dse生成的低级测试用例通过重定向技术以文本文件形式保存;

(3)对于每个文本文件,只保留取值为非0的规则变量并分别用1和-1替换2147483647和-2147483648;删除内容为空的文本文件;

(4)对数字证书的基本组件设置合法的取值;

(5)如果正在组装的是认证机构ca证书,则为组件basicconstraints和keyusage设置合法的取值;

(6)对于出现在低级测试用例条件部分中的组件根据条件部分对应的取值要求为其设置取值;

(7)对于低级测试用例中的响应部分留待观察而不做处理;对于出现在低级测试用例结果部分中的组件设置违背结果部分要求的取值;

(8)如果signaturealgorithm还没有设置,则使用tbscertificate中signature的签名算法对tbscertificate进行签名;

(9)对证书进行编码并保存为数字证书文件。

进一步,所述步骤四具体包括;

(1)使用组装的数字证书对ssl/tls实现中数字证书验证模块进行差异测试;

(2)使用数字证书组装时所形成的信息计算测试结果中的差异数、不同差异数、缺陷数、rfc遵守率。在组装数字证书时明确了该数字证书遵守或违背的具体的rfc规则,因此可形成(m+3)维向量

其中,sn表示数字证书的序号;rfcreason表示数字证书所遵守或违背的rfc规则;rfcresult表示根据rfc规则应该接受还是拒绝该数字证书;resultii(1≤i≤m)表示被测试的第i个ssl/tls实现是应该接受还是拒绝该数字证书。基于该信息可计算测试结果中的差异数、不同差异数和缺陷数:

1)对于任意一个数字证书,如果存在被测试的ssl/tls实现ii和ij使得resultii≠resultij,则测试结果中存在一个差异;

2)对于产生差异的所有数字证书,如果其中的一个数字证书x的向量<resulti1,...,resultim>x与其它任意数字证书y的向量<resulti1,...,resultim>y均不同,则测试结果中存在一个不同的差异;

3)如果rfcresule表示接受或拒绝该数字证书都是符合rfc规则的,则该差异是无效的;

4)如果resultii(1≤i≤m)与rfcresult不一致,则发现了ssl/tls实现中的一个缺陷,并且rfcreason提供了该缺陷的rfc原因;

第i个ssl/tls实现的rfc遵守率(conformanceratio,cr)通过如下公式计算;

其中,|rfcresultmatchesresultii|是测试结果中与rfc一致的结果数量,|certs|是测试中向量的数量。

本发明的另一目的在于提供一种应用所述rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法的计算机软件分析系统。

综上所述,本发明的优点及积极效果为:本发明通过使用rfc规则引导测试用例的生成同时得到测试用例遵守或违背规则的相关信息,在测试结果分析阶段使用该信息指明差异出现的原因并用于计算缺陷数等信息;弥补了现有差异测试方法的不足,提高了测试效率并且发现了ssl/tls实现中存在的缺陷和安全漏洞。

与现有技术相比,本发明具有以下优点:

(1)当发现差异时,测试用例的相关信息可指出哪些ssl/tls实现存在缺陷及其违背的rfc规则,有助于修复ssl/tls中的缺陷。

(2)当只有一个ssl/tls实现被测试时,现有差异测试技术无法正常工作而本发明仍然可以正常工作。

(3)实验生成了89个数字证书用于14个不同版本ssl/tls实现的差异测试,在每个ssl/tls实现中平均发现29个软件缺陷。目前已经有1个安全漏洞(cve-2017-5066)被google确认和修复,8个缺陷被microsoft、gnutls和wolfssl确认。实验结果表明本发明显著地提高了测试效率,发现了ssl/tls实现中存在的缺陷和安全漏洞。

附图说明

图1是本发明实施例提供的rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法流程图。

图2是本发明实施例提供的数字证书的总体结构示意图。

图3是本发明实施例提供的数字证书中扩展项的详细结构示意图。

图4是本发明实施例提供的一个简单的数字证书链示意图。

图5是本发明实施例提供的rfc制导的ssl/tls中证书验证模块差异测试的总体过程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明涉及安全套接字层(securesocketslayer,ssl)/传输层安全协议(transportlayersecurity,tls)的实现和差异测试,具体是一种由互联网工程任务组(internetengineeringtaskforce,ietf)所发布的requestforcomments(rfc)制导的ssl/tls实现中数字证书验证模块的差异测试方法。主要应用于ssl/tls实现中数字证书验证模块的测试,发现潜在的软件缺陷或安全漏洞,提高ssl/tls实现的正确性和安全性。

如图1所示,本发明实施例提供的rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法包括以下步骤:

s101:根据requestforcomments(rfc)2119规定的关键字集合从rfc5280和6818中提取数字证书的规则,根据rfc6818对rfc5280的规则进行更新;

s102:对更新后的规则分为3类即生产者规则、消费者规则和共享规则,对消费者规则和共享规则进一步分为2类即可打破规则和不可打破规则,把这2类中的规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序;

s103:对符号化程序使用动态符号执行技术生成低级测试用例;根据低级测试用例组装高级测试用例即数字证书;

s104:使用组装的数字证书对ssl/tls实现中的数字证书验证模块进行差异测试,基于数字证书的信息计算测试结果中的差异数、不同差异数、缺陷数、rfc遵守率。

下面结合附图对本发明的应用原理作进一步的描述。

本发明基于数字证书的rfc标准,使用rfc规则引导数字证书的生成,数字证书及其遵守或违背rfc规则的信息分别用于ssl/tls实现中数字证书验证模块的差异测试及结果分析,解决了现有技术存在的问题并提高了测试效率。

如图2所示,是数字证书的总体结构。一个数字证书由待签名数字证书(tbscertificate)、签名算法(signaturealgorithm)和签名值(signaturevalue)三部分组成。tbscertificate由版本号(version)、序列号(serialnumber)、签名(signature)、有效期(validity)、颁发者(issuer)、颁发者唯一标识符(issueruniqueidentifier)、持有者(subject)、持有者唯一标识符(subjectuniqueidentifier)、持有者公钥信息(subjectpublickeyinfo)和扩展项(extensions)组成。

如图3所示,是数字证书中扩展项的详细结构。extensions由标准扩展项(standardextensions)和私有互联网扩展项(privateinternetextensions)组成。标准扩展项由机构密钥标识符(authoritykeyidentifier)、持有者密钥标识符(subjectkeyidentifier)、密钥用途(keyusage)、证书策略(certificatepolicies)、策略映射(policymappings)、持有者备选名称(subjectalternativename)、颁发者备选名称(issueralternativename)、持有者目录属性(subjectdirectoryattributes)、基本约束(basicconstraints)、名称约束(nameconstraints)、策略约束(policyconstraints)、扩展密钥用途(extendedkeyusage)、证书撤销列表分布点(crldistributionpoints)、禁止任意策略(inhibitanypolicy)和最新数字证书撤销列表(freshestcrl)组成。私有互联网扩展顶由机构信息访问(authorityinformationaccess)和持有者信息访问(subjectinformationaccess)组成。

如图4所示,是一个简单的数字证书链。为验证图4中左边的数字证书,需要从2个方面进行检查:一方面,基于该数字证书的signaturealgorithm和signaturevalue检查该数字证书的tbscertificate部分是否被篡改,如果tbscertificate未被篡改则检查该证书的有效期等约束;另一方面,根据该数字证书的issuer查找对应subject的数字证书(即图4中间的数字证书)并检查其合法性,以此类推直到找到一个合法的根数字证书(即图4中右边的数字证书)。如果这2个方面的检查都顺利通过,则被检查数字证书是合法的,否则是非法的。

如图5所示,本发明实施例提供的rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法具体包括以下步骤:

步骤一:根据rfc2119规定的关键字集合从rfc5280和6818中提取数字证书的规则,根据rfc6818对rfc5280的规则进行更新。具体的步骤如下:

(1)根据rfc2119中规定的书写rfc所需遵守的关键字集合从rfc5280和6818中提取数字证书的规则。

把rfc5280或rfc6818文本即rfc5280.txt或rfc6818.txt中的换页符、页眉、页脚和空行删除得到的文本记为r;

把r根据一级标题分割为节;

对于rfc5280中的第4至第8节、rfc6818中第2至第8节中的每一节,首先置规则集合变量ruleset为空集、规则编号rulenum为0;然后对于rfc5280任意j级标题(1≤j≤5)、rfc6818任意j级标题(1≤j≤2)和下一个标题之间的内容根据“.\n”和“.”提取英文语句,根据“::=”、“::={ln。。。}ln”和“::={ln。。。}ln’”提取abstractsyntaxnotationone(asn.1)表示的结构,其中“::=”、“::={ln。。。}ln”和“::={ln。。。}ln’”分别表示asn.1结构定义中没有左右大括号、有左右大括号并且在同一行、有左右大括号并且不在同一行;

对于每个英文语句和asn.1结构判断其是否包含rfc2119中规定的关键字,如果包含则说明该语句或结构是一条规则记为s,此时rulenum增加1,由rulenum、第j级标题和该规则s形成3元组s′=(rulenum,title,j,s),将s′加入ruleset;最后把ruleset保存为文本文件;

(2)根据rfc6818对rfc5280的规则进行更新,根据rfc6818中“…says:”、“…replacedwith:”和“add(ed)…”分别指示废弃的、更新的和附加的段落的特点把该节中的规则分别添加到废弃的规则集合obruleset和更新的规则集合upruleset中;然后,对每条规则r计算构成该规则的单词集合wordsetr,计算任意2条规则r1和r2的单词集合之差即matrix[r1,r2]=|wordsetr1-wordsetr2|;最后,对于obruleset中的每条规则o做如下计算:对于upruleset中的每条规则u计算使得matrix[o,u]最小的u并赋给表示规则o更新后的规则记为updateo,如果不存在这样的matrix[o,u]则说明规则o被丢弃即updateo=discarded,否则如果matrix[o,u]=matrix[u,o]=0则说明规则o没有变化即updateo=unchanged,否则应该用规则u更新规则o即updateo=u,对rfc5280的规则o用updateo进行更新。

步骤二:对更新后的规则分为3类即生产者规则、消费者规则和共享规则,对消费者规则和共享规则进一步分为可打破规则和不可打破规则,规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序。具体的步骤如下:

(1)把更新后的规则分为3类:生产者规则、消费者规则和共享规则;

把生产者规则集合producerruleset、消费者规则集合consumerruleset和共享规则集合sharedruleset分别设置为空集;

对于rfc5280更新后的规则集合updatedruleset中的每条规则r,对于生产者规则的模式集合中任意一个模式m,如果r匹配m则把r加入到producerruleset;对于消费者规则的模式集合中任意一个模式m′,如果r匹配m′则把r加入到consumerruleset;

共享规则集合为生产者规则集合与消费者规则集合的交集即sharedruleset=producerrulesset∩consumerrulset;从生产者规则集合和消费者规则集合中分别去除共享规则集合即sharedruleset:producerruleset-=sharedruleset和consumerruleset-=sharedruleset;最后收集生产者规则和消费者规则外的规则即updatatedruleset-producerruleset-consumerruleset作为共享规则;

(2)对消费者规则和共享规则进一步分为:可打破规则和不可打破规则;

把可打破规则集合breakableruleset、不可打破规则集合unbreakableruleset和不可打破规则的模式集合patternset分别设置为空集;

对于rfc2119规定的关键字集合中任何一个关键字m,对于任意一个不可打破规则模式u,把m+“凵”+u添加到patternset;

对于消费者规则和共享规则集合csrset中任意一个规则r,对于potternset中任意一个模式p,如果r匹配p则把r加入到unbreakableruleset中;

计算可打破规则集合breakableruleset=csrset-unbreakableruleset;

(3)把可打破规则和不可打破规则转换为规则变量;

设置响应集合responseset、其它保留字集合otherset和规则变量集合varset为空集;把rfc2119规定的关键字加入到关键字集合modalkeywordset,把表示句子结构的单词加入到句子结构模式集合sentencepatterns,把表示逻辑关系的单词加入到逻辑模式集合logicpatterns,把表示响应的单词加入到响应模式集合responsepatterns,把数字模式加入到其它保留字模式集合otherpatterns,把数字证书组件名称及其变化形式加入到组件名称集合componentset;

对于每一条不可打破规则和可打破规则r,对于modalkeywordset中任意一个关键字m和responsepatterns中任意一个响应模式rp把r中m+“凵”+rp后的单词加入到responseset;把r中与otherpatterns中任意模式p匹配的单词加入到otherset;

保留字集合reservedset是modalkeywordset、sentencepatterns、logicpatterns、componentset、responseset和otherset的并集;

对于每一条不可打破规则和可打破规则r,删除r中不属于reservedset的单词得到r′;

对于任意r′,如果r′是用自然语言表达的,则根据其语法结构得到该规则表达的所有情况;对于每种情况,首先得到条件condition=“c1,v1,...,ci,vi”,其中c1,...,ci是该条件中所涉及组件的名称,v1,...,vi是对应组件的取值,如果r′是不可打破规则,如果存在响应部分则得到响应response=“consumer,actions”;把condition[+“:”+response]加入到varset,其中括号表示当response存在时为condition+“:”+response,否则为condition;如果r′是可打破规则,如果存在结果部分则得到结果result=“c1,v1,...,cj,vj”;把condition[+“:”+result]加入到varset,其中括号表示当result存在时为condition+“:”+result,否则为condition;

对于任意r′,如果r′是用asn.1表达的,对于每个可选的组件c,如果有嵌套的约束t则c的约束为constraintc={“c,absent”,t},如果没有嵌套约束则constraintc={“c,absent”,“c,present”};对于每个不可选的组件c′其约束为constraintc′={“c,validvalue”};组合r′的约束并加入到varset;

对于varset中每个约束,用单下划线和双下划线(“_”和“__”)分别替换逗号和冒号(“,”和“:”);

(4)把规则变量用于形成dse技术中的符号化程序;

生成“#include<stdio.h>”、“#include<klee/klee.h>”和“intmain(){”;

对规则变量生成变量声明;

对不可打破规则和可打破规则对应的规则变量分别进行符号化;

对不可打破规则对应的规则变量v生成“if(v>0)printf(“v>0”)else”;

对可打破规则对应的规则变量v′生成“if(v'<0)printf(“v'<0”)else”;

删除多余的“else”并添加“}”;

保存为c文件。

步骤三:对符号化程序使用动态符号执行技术生成低级测试用例;根据低级测试用例组装高级测试用例即数字证书。具体的步骤如下:

(1)使用dse技术处理符号化程序;

(2)把dse生成的低级测试用例通过重定向技术以文本文件形式保存;

(3)对于每个文本文件,只保留取值为非0的规则变量并分别用1和-1替换2147483647和-2147483648;删除内容为空的文本文件;

(4)对数字证书的基本组件设置合法的取值;

(5)如果正在组装的是认证机构ca证书,则为组件basicconstraints和keyusage设置合法的取值;

(6)对于出现在低级测试用例条件部分中的组件根据条件部分对应的取值要求为其设置取值;

(7)对于低级测试用例中的响应部分留待观察而不做处理;对于出现在低级测试用例结果部分中的组件设置违背结果部分要求的取值;

(8)如果signaturealgorithm还没有设置,则使用tbscertificate中signature的签名算法对tbscertificate进行签名;

(9)对证书进行编码并保存为数字证书文件。

步骤四:使用组装的数字证书对ssl/tls实现中的数字证书验证模块进行差异测试,基于数字证书的信息计算测试结果中的差异数、不同差异数、缺陷数、rfc遵守率。

(1)使用组装的数字证书对ssl/tls实现中数字证书验证模块进行差异测试;

(2)使用数字证书组装时所形成的信息计算测试结果中的差异数、不同差异数、缺陷数、rfc遵守率。在组装数字证书时明确了该数字证书遵守或违背的具体的rfc规则,因此可形成(m+3)维向量

其中,sn表示数字证书的序号;rfcreason表示数字证书所遵守或违背的rfc规则;rfcresult表示根据rfc规则应该接受还是拒绝该数字证书;resultii(1≤i≤m)表示被测试的第i个ssl/tls实现是应该接受还是拒绝该数字证书。基于该信息可计算测试结果中的差异数、不同差异数和缺陷数:

1)对于任意一个数字证书,如果存在被测试的ssl/tls实现ii和ij使得resultii≠resultij,则测试结果中存在一个差异;

2)对于产生差异的所有数字证书,如果其中的一个数字证书x的向量<resulti1,...,resultim>x与其它任意数字证书y的向量<resulti1,...,resultim>y均不同,则测试结果中存在一个不同的差异;

3)如果rfcresult表示接受或拒绝该数字证书都是符合rfc规则的,则该差异是无效的;

4)如果resultii(1≤i≤m)与rfcresult不一致,则发现了ssl/tls实现中的一个缺陷,并且rfcreason提供了该缺陷的rfc原因;

第i个ssl/tls实现的rfc遵守率(conformanceratio,cr)通过如下公式计算;

其中,|rfcresultmatchesresultii|是测试结果中与rfc一致的结果数量,|certs|是测试中向量的数量。

下面结合具体实施例对本发明的应用效果作进一步的描述。

实施例1

以下通过由3条rfc规则制导的3个数字证书的生成及对ssl/tls实现的差异测试作为实施例阐述本发明的步骤。具体的步骤如下:

步骤一:首先根据rfc2119中规定的书写rfc所需遵守的关键字集合从rfc5280和6818中提取数字证书的规则;根据rfc6818对rfc5280的规则进行更新。具体实施如下:

(1)根据rfc2119中规定的书写rfc所需遵守的关键字集合modalkeywordset即{must,mustnot,shall,shallnot,required,should,shouldnot,recommended,notrecommended,may,optional}从rfc5280和6818中提取数字证书的规则。

把rfc5280(或rfc6818)文本即rfc5280.txt(或rfc6818.txt)中的换页符、页眉、页脚和空行删除得到的文本记为r。

把r根据一级标题分割为节,对于rfc5280分别是第1节至第11节、附录a至c,对于rfc6818分别是第1节至第10节。

对于rfc5280中的第4节,首先设置规则集合变量ruleset为空集、规则编号rulenum为0;然后对于第2级标题“4.2certificateextensions”和下一个标题“4.2.1standardextensions”之间的内容根据“.\n”和“.”提取英文语句。对于每个英文语句判断其是否包含rfc2119中规定的关键字,如果包含则说明该语句是一条规则。例如下述语句包含“should”关键词则该语句是一条规则。

规则1:“inaddition,applicationsconformingtothisprofileshouldrecognizetheauthorityandsubjectkeyidentifierandpolicymappingsextensions.”

此时rulenum增加1,由rulenum、第2级标题和该规则s形成3元组s′=(1,certificateextensions,s),将s′加入ruleset。

类似地,在第4级标题“4.2.1.4certificatepolicies”和下一个标题“4.2.1.5policymappings”之间提取到下述的规则2(记为s):

规则2:“therefore,certificateusersshouldgracefullyhandleexplicittextwithmorethan200characters.”

把s′=(2,certificatepolicies,s)加入ruleset,最后把ruleset保存为文本文件。

对于rfc5280中的第5节,可提取下述规则3。

规则3:“thisfieldmustcontainthesamealgorithmidentifierasthesignaturefieldinthesequencetbscertificate.”

(2)根据rfc6818对rfc5280的规则进行更新。

rfc6818第3节“…says:”指示废弃段落中的废弃规则集合obruleset如下:

规则o1:“conformingcasshouldusetheutf8stringencodingforexplicittext,butmayuseia5string.”

规则o2:“conformingcasmustnotencodeexplicittextasvisiblestringorbmpstring.”

规则o3:“theexplicittextstringshouldnotincludeanycontrolcharacters(e.g.,u+0000tou+001fandu+007ftou+009f).”

规则o4:“whentheutf8stringencodingisused,allcharactersequencesshouldbenormalizedaccordingtounicodenormalizationformc(nfc)[nfc].”

rfc6818第3节“…replacedwith:”指示更新段落中更新的规则集合upruleset如下:

规则u1:“conformingcasshouldusetheutf8stringencodingforexplicittext.”

规则u2:“conformingcasmustnotencodeexplicittextasia5string.”

规则u3:“theexplicittextstringshouldnotincludeanycontrolcharacters(e.g.,u+0000tou+001fandu+007ftou+009f).”

规则u4:“whentheutf8stringorbmpstringencodingisused,allcharactersequencesshouldbenormalizedaccordingtounicodenormalizationformc(nfc)[nfc].”

对每条规则的单词集合计算以规则o1的wordseto1为例进行说明。wordseto1为集合{conforming,cas,should,use,the,utf8string,encoding,for,explicittext,but,may,ia5string}。对任意2条规则r1和r2的matrix[r1,r2]=|wordsetr1-wordsetr2|的计算以规则o1和u1为例进行说明,matrix[o1,u1]=|wordseto1-wordsetu1|为集合{but,may,ia5string}中元素数量即3,而且是{matrix[o1,u1],matrix[o1,u2],matrix[o1,u3],matrix[o1,u4]}中最小的,则updateo1=u1。同理可得updateo2=u2和updateo4=u4。由于matrix[o3,u3]=matrix[u3,o3]=0,所以updateo3=unchanged。

对于rfc6818的第5节和第6节进行同样的处理。需要说明的是第4节不包含rfc规则,因此不需要进行处理。

对rfc5280的规则o用updateo进行更新。由于规则1、规则2和规则3没有被更新,因此保持不变。

步骤二:对更新后的规则分为3类即生产者规则、消费者规则和共享规则,对消费者规则和共享规则进一步分为可打破规则和不可打破规则,规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序。具体实施如下:

(1)把更新后的规则分为3类:生产者规则、消费者规则和共享规则。

把生产者规则集合producerruleset、消费者规则集合consumerruleset和共享规则集合sharedruleset分别设置为空集;

规则1匹配消费者规则的模式集合中“applicationsconformingtothisprofile”,因而加入到consumerruleset;规则2匹配消费者规则的模式集合中“certificateusers”,因而加入到consumerruleset;规则3因不匹配任意模式,所以既不加入到producerruleset也不加入到consumerruleset。

在此实施例中,共享规则集合为生产者规则集合与消费者规则集合的交集即空集。从生产者规则集合和消费者规则集合中分别去除共享规则集合后仍然是原集合。最后收集生产者规则和消费者规则以外的规则即updatedruleset-producerruleset-consumerruleset作为共享规则:{规则1,规则2,规则3}-空集-{规则1,规则2}得到共享规则集合{规则3}。

(2)对消费者和共享规则进一步分为2类:可打破规则和不可打破规则。

把可打破规则集合breakableruleset、不可打破规则集合unbreakableruleset和不可打破规则的模式集合patternset分别设置为空集。

对于rfc2119规定的关键字集合中任何一个关键字m,对于任意一个不可打破规则模式u,把m+“凵”+u添加到patternset。

规则1与模式“shouldrecognize”匹配,规则2与模式“shouldgracefullyhandle”匹配,因此规则1和规则2加入到unbreakableruleset中;而规则3与任何模式不匹配,因此加入breakableruleset。

计算可打破规则集合:{规则1,规则2,规则3}-{规则1,规则2}={规则3}。

(3)把可打破规则和不可打破规则转换为规则变量。

设置响应集合responseset、其它保留字集合otherset和规则变量集合varset为空集。得到rfc2119规定的关键字集合modalkeywordset,把表示句子结构的单词加入到句子结构模式集合sentencepatterns,把表示逻辑关系的单词加入到逻辑模式集合logicpatterns,把表示响应的单词加入到响应模式集合responsepatterns,把数字模式等加入到其它保留字模式集合otherpatterns,把数字证书组件名称及其变化形式加入到组件名称集合componentset。

对于规则1、规则2和规则3,把“recognize”、“handle”和“contain”加入到responseset,把与otherpatterns中数字模式匹配的“200”加入到otherset。

保留字集合reservedset是modalkeywordset、sentencepatterns、logicpatterns、componentset、responseset和otherset的并集。

对于规则1、规则2和规则3删除不属于reservedset的单词后分别得到下述规则。

规则1':“applicationsshouldrecognizeauthorityandsubjectkeyidentifierandpolicymappings.”

规则2':“certificateusersshouldhandleexplicittextwithmorethan200characters.”

规则3':“signaturealgorithmmustsameassignatureintbscertificate.”

需要指出的是规则3中代词“this”由其所在的标题“signaturealgorithm”的变化形式“signaturealgorithm”所替换。

规则1'、规则2'和规则3'分别只表达一种情况。对于规则1',条件是“authoritykeyidentifier,present,subjectkeyidentifier,present,policymappings,present”。由于规则1'是不可打破规则,其响应存在并且是“applications,shouldrecognize”。把“authoritykeyidentifier,present,subjectkeyidentifier,present,policymappings,present:applications,shouldrecognize”加入到varset。对于规则2,条件是“explicittext,morthan200chars”。由于规则2'是不可打破规则,其响应存在并且是“certusers,shouldhandle”。把“explicittext,morthan200chars:certusers,shouldhandle”加入到varset。对于规则3',条件是“tbscertsignature,present”,规则3'是可打破规则,其结果存在并且是“signaturealgorithm,mustsame”。把“tbscertsignature,present:signaturealgorithm,mustsame”加入到varset。

由于规则1、规则2和规则3不是用asn.1表达的,因此此步骤不执行。

对于varset中3个约束,用单下划线和双下划线(“_”和“__”)分别替换逗号和冒号(“,”和“:”)得到下述规则变量。

规则变量1:“authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize”。

规则变量2:“explicittext_morthan200chars__certusers_shouldhandle”。

规则变量3:“tbscertsignature_present__signaturealgorithm_mustsame”。

(4)把规则变量用于形成dse技术中的符号化程序。

生成“#include<stdio.h>”、“#include<klee/klee.h>”和“intmain(){”。

对3个规则变量生成变量声明。

“intauthoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize,explicittext_morthan200chars__certusers_shouldhandle,tbscertsignature_present__signaturealgorithm_mustsame;”

对不可打破规则(规则1和规则2)和可打破规则(规则3)对应的规则变量分别进行符号化。

“klee_make_symbolic(&authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize,sizeof(authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize),“authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize”;”

“klee_make_symbolic(&explicittext_morthan200chars__certusers_shouldhandle,sizeof(explicittext_morthan200chars__certusers_shouldhandle),“explicittext_morthan200chars__certusers_shouldhandle”;”

“klee_make_symbolic(&tbscertsignature_present__signaturealgorithm_mustsame,sizeof(tbscertsignature_present__signaturealgorithm_mustsame),“tbscertsignature_present__signaturealgorithm_mustsame”;”

对不可打破规则对应的规则变量1和2生成下述语句。

“if(authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize>0)printf(“authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present__applications_shouldrecognize>0”);

else

if(explicittext_morthan200chars__certusers_shouldhandle>0)

printf(“explicittext_morthan200chars__certusers_shouldhandle>0”)

else”

对可打破规则对应的规则变量3生成下述语句。

“if(tbscertsignature_present__signaturealgorithm_mustsame<0)

printf(“tbscertsignature_present__signaturealgorithm_mustsame<0”)

else”

删除多余的“else”并添加“}”。

把该符号化程序保存为.c文件。

步骤三:对该符号化程序使用dse技术生成低级测试用例共4个,每个低级测试用例指明一个数字证书中若干组件的取值是否遵守rfc规则;根据其中的3个低级测试用例组装3个高级测试用例即数字证书。具体的步骤如下:

(1)使用dse技术处理该符号化程序并得到4个低级测试用例;

(2)为便于后续处理,把dse生成的4个低级测试用例通过重定向技术分别以文本文件形式保存;

(3)对于每个低级测试用例,只保留取值为非0的规则变量并且分别用1和-1替换2147483647和-2147483648。因为一个低级测试用例的规则变量取值全为0,所以删除此低级测试用例,只保留3个有内容的低级测试用例;

(4)对基本组件version、serialnumber、validity、issuer、subject设置合法的取值;

(5)规则1、规则2和规则3所对应的低级测试用例不是针对ca的规定,所以此步骤不执行;

(6)对于出现在低级测试用例条件部分中的组件根据条件部分对应的取值要求为其设置取值。对于规则1对应的低级测试用例的条件部分,根据“authoritykeyidentifier_present_subjectkeyidentifier_present_policymappings_present”需要为authoritykeyidentifer、subjectkeyidentifier和policymappings设置合法值;对于规则2对应的低级测试用例的条件部分,根据“explicittext_morthan200chars”需要为explicittext设置超过200个字符的内容;对于规则3对应的低级测试用例的条件部分,根据“tbscertsignature_present”需要为tbscertificate中的signature设置一个签名算法名称例如“sha256rsa”;

(7)对于低级测试用例中的响应部分留待观察而不做处理,即规则1对应的低级测试用例的响应部分“applications_shouldrecognize”和规则2对应的低级测试用例的响应部分“certusers_shouldhandle”留待观察;对于出现在低级测试用例结果部分中的组件设置违背结果部分要求的取值,即对于规则3对应的低级测试用例的结果部分“signaturealgorithm_mustsame”需要为signaturealgorithm设置一个不同的签名算法例如“sha1rsa”;

(8)对于规则1和规则2对应的低级测试用例,signaturealgorithm还没有设置,则设置其与tbscertificate中的signature保持一致;对于规则3对应的低级测试用例,不执行此步骤;

(9)对证书进行base64编码并保存为.pem格式证书。

步骤四:使用组装的数字证书对14个不同版本的ssl/tls中的数字证书验证模块进行差异测试。3个数字证书对应的3个向量分别为:

<1,r1,2,1,1,1,1,1,1,1,0,0,0,1,1,1,1>;

<2,r2,2,1,1,1,1,1,1,1,1,1,0,1,1,1,1>;

<3,r3,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1>;

需要说明的是:r1、r2和r3分别表示规则1、规则2和规则3;rfcresult接受某个数字证书记为1,拒绝某个数字证书记为0,授受和拒绝都是合理行为则记为2;ssl/tls接受某个数字证书记为1,拒绝某个数字证书记为0。

1)数字证书1中第8、9、10个结果即0与别的结果即1不同;数字证书2中第10个结果即0与别的结果即1不同;数字证书3中第8、13、14个结果即1与别的结果即0不同。因此,这3个数字证书都导致了差异。

2)这3个数字证书的测试结果向量分别是:

<1,1,1,1,1,1,1,0,0,0,1,1,1,1>;

<1,1,1,1,1,1,1,1,1,0,1,1,1,1>;

<0,0,0,0,0,0,0,1,0,0,0,0,1,1>;

互不相同,所以存在3个不同的差异。

由于数字证书1和2的rfcresult都是2,则差异1和2无效。

对于数字证书3的测试结果,第8、13、14个ssl/tls实现的测试结果即1与rfcresult即0不同,说明这3个ssl/tls实现中数字证书验证模块存在缺陷,而且rfcreason提供了此缺陷的原因即违背了规则3。第8个、13个、14个ssl/tls实现分别是nss、googlechrome和microsoftie。根据分别向这3个ssl/tls实现所在公司或组织报告缺陷的反馈,google确认这个缺陷为安全漏洞并进行了修复,microsoft确认了这个缺陷。

以第13个ssl/tls实现即chrome的rfc遵守率cr的计算为例。

其中,chrome测试结果中与rfc一致的结果数量为2,chrome被测试了3次。

综上所述,本发明属于计算机软件分析技术领域,公开了一种rfc制导的ssl/tls实现中数字证书验证模块的差异测试方法,从rfc中提取并更新规则;对规则进行分类,规则转换为规则变量并生成动态符号执行技术中的输入即符号化程序;对符号化程序使用动态符号执行技术生成低级测试用例;根据低级测试用例组装高级测试用例即数字证书;使用组装的数字证书对ssl/tls实现中的数字证书验证模块进行差异测试。本发明通过生成面向差异的数字证书,对被测试程序进行高效的差异测试;应用于ssl/tls实现中数字证书验证模块的测试,发现潜在的软件缺陷或安全漏洞,提高ssl/tls实现的正确性和安全性。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1