用于有效部署整体多样化程序实例以抵抗差分攻击的系统和方法与流程

文档序号:12006232阅读:276来源:国知局
用于有效部署整体多样化程序实例以抵抗差分攻击的系统和方法与流程
本发明一般地涉及可抵抗未授权分析的软件。更特别地,本发明涉及用于产生软件代码的系统和方法,该软件代码通过构建不同的程序以抵抗攻击者通过差分攻击、串谋(collusion)和自动利用(exploit)的努力来增加构建时间多样性。

背景技术:
在计算领域中,软件通常展示出模块化特性而不是整体的特性。此外,常常存在在任何一块给定软件内采用的许多单独和不同算法。此类不同算法以这样的的方式进行组合以便提供软件所需的服务(即,功能性)。其常常是对于一个特定服务而言的情况,许多不同算法是可用的。一般而言,此方案中的算法是执行任务或一组任务的计算步骤序列。算法可以具有各种尺寸。其可能非常大,或者其可能小到一组的几个指令。算法可以包含更小算法,该更小算法又可以包含甚至更小的算法。此分级结构可以具有任何数目的层次。很好地理解的是此类软件可以被进行反向工程或被攻击者以其他方式篡改。此类篡改在许多商业应用中是不期望的,并且已产生密码术以对抗任何此类攻击。这在大规模服务器-客户端应用中是特别明显的。在此类应用中,用于部署新特征或修补安全漏洞的目的的客户端软件的频繁更新可能导致要求改进的密码技术的整体新类别的攻击。这是因为用新保护来更新软件可能具有将攻击者直接引导至受保护资产的非预期后果,由此,攻击者只需要与软件的先前版本相比较。此类附加攻击不限于用于资产识别的软件修订的差分攻击,而是还可以包括其本身可能导致秘钥共享方案的各方之间的串谋,或者还可以包括可能识别重要模块的代码提升攻击,所述重要模块诸如是用来生成设备秘钥或可信根的代码。代码提升可能通向流氓系统,其中,某些实际应用与攻击者的代码一起被重新使用。在这种情况下,损坏可能非常快速地传播,因为利用常常被发布在因特网上的各种位置处。在软件的保护中,常常将分层防御呈现为对系统的高进入障碍。然而,针对此类新类别的攻击应用分层保护常常是应用程序的性能和尺寸之间的权衡。减小利用由此权衡暴露的漏洞的机会窗口的现有努力包括从依靠用于构建时间多样性的能力。降低跨多个客户端的差分攻击的风险的一个方式是构成软件的个别不同实例。在另一情况下,可以使用构建时间多样性能力来将软件升级(例如,以支持新特征、增强性能或修补漏洞)以更新软件以及分发对有漏洞模块的新保护。这允许完全软件修订相对于前一修订是多样化的,防止明显的差分攻击。在又一情况下,多样性还可以在通过创建数据多样性能力来能够实现撤回方案中起作用。这对于如果例如客户端不遵守公司政策(例如不付费),则不允许客户端连接到服务器是有用的特征。然而,此类多样性方案由于对越来越迥异的程序的增加的需要而在更大的部署中遭遇规模问题,所述越来越迥异的程序必须全部由构建工具所构造,这在传统上要花费很长时间来执行。用以产生多样化程序的现有构建时间技术因不能以有效的方式并以高置信度水平产生不同实例的大规模部署而遭受影响。置信度水平方面的困难通过已知系统和方法不能测试多样化程序实例的大型集合而表现出来。特别地,如果存在大量实例,则测试所有多样化实例所需的时间可能高得不可行。用于生成关于测试能力的多样化实例的有效方法将从构建时间和确认两个角度改善部署的循环。因此,期望提供一种用以增加构建时间多样性的更普遍有用的系统和方法。

技术实现要素:
本发明的目的是消除或缓解构建时间多样性的先前方法的至少一个缺点。本发明提供了一种以软件体现以产生整体多样化程序实例以抵抗攻击的系统和方法。如所提到的,软件在特性上是模块化的。同样地,可以多次地且以多种变化来编写程序的代码部分(例如,函数定义、基本块、变量定义、函数体、指令集)。关于本发明,代码部分变化的每个实例被包括在条件编译命令中。根据此布置,可以通过改变条件编译定义并和重新调用目标编译器来快速地构造代码部分的组合。此外,可以构造完整程序的最小集,保证所有代码部分都被使用。这提供了所有代码部分的合理测试覆盖。此外,这是在不要求在所需测试时间方面不可行的所有代码部分组合的测试的情况下实现的。事实上,本发明增加了软件中的所有代码已被覆盖的置信度,同时使测试所有实例的时间最小化。在第一方面,本发明提供了一种提供计算机软件源代码中的构建时间多样性的方法,该方法包括:将代码划分成代码部分;识别代码部分的代码部分接口;生成代码部分和代码部分接口的多样化实例;创建测试实例,该测试实例表示代码部分和代码部分接口的所有多样化实例;并且使用代码部分和代码部分接口的多样化实例的变化的组合来形成部署实例,其中,通过确认测试实例的可操作性来保证所有部署实例的可操作性。在另一方面,本发明提供了一种用于提供计算机软件源代码中的构建时间多样性的系统,该系统包括:一组机器可执行代码段,其可操作成产生保证计算机软件源代码中的构建时间多样性的软件代码,该机器可执行代码可执行为执行如下步骤:将代码划分成代码部分;识别代码部分的代码部分接口;生成代码部分和代码部分接口的多样化实例;创建测试实例,该测试实例表示代码部分和代码部分接口的所有多样化实例;并且使用代码部分和代码部分接口的多样化实例的变化的组合来形成部署实例,其中,通过确认测试实例的可操作性来保证所有部署实例的可操作性。在又一方面,本发明提供了一种用于提供计算机软件源代码中的构建时间多样性的设备,该设备包括:用于将代码划分成代码部分的装置;用于识别代码部分的代码部分接口的装置;用于生成代码部分和代码部分接口的多样化实例的装置;用于创建测试实例的装置,该测试实例表示代码部分和代码部分接口的所有多样化实例;以及用于使用代码部分和代码部分接口的多样化实例的变化的组合来形成部署实例的装置,其中,通过确认测试实例的可操作性来保证所有部署实例的可操作性。在又一方面,本发明提供了一种存储计算机软件代码以便提供计算机软件源代码中的构建时间多样性的计算机可读存储介质,该计算机软件代码可执行为执行以下步骤:将代码划分成代码部分;识别代码部分的代码部分接口;生成代码部分和代码部分接口的多样化实例;创建测试实例,该测试实例表示代码部分和代码部分接口的所有多样化实例;并且使用代码部分和代码部分接口的多样化实例的变化的组合来形成部署实例,其中,通过确认测试实例的可操作性来保证所有部署实例的可操作性。在本发明的所有方面中,应理解的是为计算机软件源代码提供的构建时间多样性与现有技术机制相比是相当大地改善和增加的构建时间多样性。在结合附图来仔细阅读本发明的特定实施例的以下描述时,本发明的其他方面和特征将变得对于本领域普通技术人员而言显而易见。附图说明现在将参考附图仅以示例的方式来描述本发明的实施例。图1图示出其中可以体现本发明的已知计算机系统。图2图示出根据本发明的总体过程。图3是示出了根据图2中所图示的本发明的用于构建时间多样性的步骤的流程图。图4图示出根据图2中所图示的本发明的一个实施例的基于编译单元的物理划分成代码部分。图5图示出根据本发明的另一实施例的基于函数定义的物理划分成代码部分。图6图示出根据本发明的另一实施例的基于函数调用子图的程序流划分。图7图示出根据本发明的另一实施例的基于基本块的程序的程序流划分。图8图示出根据本发明的另一实施例的通过数据流将代码划分成一个代码部分的示例。图9图示出根据本发明的用于生成具有固定接口的多样化代码部分组合的一个示例性方法。图10图示出根据本发明的用于生成多样化代码部分接口以及多样化代码部分的一个示例性方法。图11图示出根据本发明的通过条件编译指令进行的代码部分实例的描绘。图12图示出根据本发明将程序实例聚合并将例示程序部署到目标群组。具体实施方式如上所述,算法一般地是执行任务或一组任务的计算步骤序列。在本发明中,应将算法定义理解为还涵盖算法的实现。因此,算法可以是在计算设备上执行任务或一组任务的一组计算机指令或一块高级软件程序。一般地,本发明提供了一种用于在源代码级处理现有算法以便产生可抵抗差分攻击、串谋和自动利用的算法的实施方式的方法和系统。应理解的是可以在任何给定计算机系统上实践本发明。可以在其上面执行本发明的计算机系统的简化示例在图1中被呈现为方框图。此计算机系统1100包括显示器1120、键盘1140、计算机1160和外部设备1180。计算机1160可以包含一个或多个处理器或微处理器,诸如中央处理单元(CPU)1200。CPU1200执行算数计算和控制功能以执行存储在内部存储器1220,优选地是随机存取存储器(RAM)和/或只读存储器(ROM)以及可能是附加存储器1240中的软件。附加存储器1240可以包括例如海量存储器储存装置、硬盘驱动器、软盘驱动器、磁带驱动器、光盘驱动器、诸如在视频游戏设备中找到的那些的程序盒和盒式接口、诸如EPROM或PROM的可移除存储器芯片、或如在本领域中已知的类似存储介质。此附加存储器1240可以在物理上在计算机1160内部,或者如在图1中那样在外部。计算机系统1100还可以包括用于允许加载计算机程序或其他指令的其他类似装置。此类装置可以包括例如通信接口1260,其允许在计算机系统1100与外部系统之间传输软件和数据。通信接口1260的示例可以包括调制解调器、诸如以太网卡的网络接口、串行或并行通信端口。经由通信接口1260传输的软件和数据是以信号的形式,其可以是能够被通信接口1260接收的电子、电磁或光学或其他信号。当然,可以在单个计算机系统1100上提供多个接口。由输入/输出(I/O)接口1280来管理去往和来自计算机1160的输入和输出。此I/O接口1280管理显示器1120、键盘1140、外部设备1180和计算机系统1100的其他此类部件的控制。仅仅出于方便的目的而以这些术语来描述本发明。对于本领域的技术人员而言将清楚的是可以将本发明应用于其他计算机或控制系统1100。此类系统将包括具有计算机或处理器控制的各式各样的器具,包括电话、蜂窝式电话、电视、电视机顶盒、销售点计算机、自动提款机、膝上型计算机、服务器、个人数字助理和汽车。遍及本发明的详细描述,将使用术语代码部分、代码部分实例以及代码部分接口。代码部分是实现功能性的粘聚块的程序的部分。应容易显而易见的是此类程序部分一般地包括能够以编程语言来编写的任何东西。例如,这可以包括编译单元、函数定义、说明语句、定义语句、运算、初始化、基本功能块或主体、类定义、对象说明、模板定义、模板特化、部分特化、阵列定义和说明、结构和聚合体定义和说明、系统调用、库调用、汇编码、预处理器指令等。代码部分实例是执行定义行为的代码部分的一个或多个构造。两个代码部分实例可以根据其外部接口来执行相同的行为。然而,代码部分的内部构成可以具有大的变化。代码部分接口是代码部分的内部依赖,其允许一个代码部分与一个或多个其他代码部分兼容。在优选实施例中,按照在计算机系统1100上运行的中间编译器程序来实现本发明。标准编译器技术在本领域中是众所周知的,并且在本文中将不会详细地评论。可以提供必要背景的两个标准参考是AlfredAho、RaviSethi和JeffreyUllman在1988年的“CompilersPrinciples,Techniques,andTools”(ISBN0-201-1008-6)和StevenMuchnick在1997年的“AdvancedCompilerDesign&Implementation”(ISBN1-55860-320-4)。一般地,将软件编译器划分成被描述为前端、中间和后端的三个部件。前端负责语言相关分析,而后端处理代码生成的机器相关部分。可选地,可以包括中间部件以执行独立于语言和机器的最优化。通常,每个编译器族将仅具有一个中间部分,具有用于每个高级语言的前端和用于每个机器级语言的后端。编译器族中的所有部件一般可以按照共同的中间语言来进行通信,因此其是可容易地互换的。此中间语言一般按照使控制流和数据流两者暴露的方式,使得控制流和数据流被容易地操纵。可以将此类中间形式称为流暴露形式。在本发明的优选实施例中,将被操纵以使得输入软件的期望区域防篡改的是中间代码。本发明能够最容易地应用于被软件编译器用作用于执行涉及标量变量的分析和最优化的代码表示的软件代码。类似地,本发明的方法可以按照其高级或低级形式来应用于软件,如果用必需的控制流或数据流信息来加强此类形式的话。根据在下文中描述的编码技术的描述,此灵活性将变得清楚。如前所述,本发明涉及不同地构建的程序实例的创建。多样性是能够实现不同构造的程序的创建的保护机制,并且本发明使用多样性来防止攻击者编写将对所有程序实例的全体其作用的利用。这产生对差分攻击、串谋和自动利用的高抵抗力。关于图2,简化方框图示出了根据本发明的用以提供改善的构建时间多样性的整体系统20。使用多个代码部分、代码部分接口和将代码部分组合的独特方法,本发明快速地且容易地产生非常大量的完整程序实例。此外,本发明还提供了一种机制,其允许创建非常大量的完整程序实例以用于分发,同时相比之下需要用于测试目的的最小数目的完整程序“覆盖”实例。构造此最小数目的实例以用于测试的方式提供了所创建代码部分的高覆盖率,并因此提供了多样化结果的高置信度。在图2中所示的整体系统20中,将以源形式的原始程序应用21输入到多样性引擎23中。在22处识别程序的代码部分。基于代码部分信息,在24处创建程序的多样化构造并将其封装在条件编译指令中。然后用适当的指令集来许多次调用本机编译器25(如以下本文中进一步描述的)以产生最后的多样化实例26、27。大量的多样化实例27a可用于部署,同时,需要更小数目的多样化实例26a以用于测试。下面更详细地描述这些步骤中的每一个。关于图3,示出了图示出根据图2中所图示的本发明的用于创建构建时间多样性的过程30的流程图。现在在一般方面描述过程30。过程30的第一步骤31是将程序分解成代码部分。此步骤31可以遵循若干不同方法,这稍后在以下本文中详细地进行描述。在步骤31处识别代码部分之后,在布置32处识别到每个代码部分的接口。此接口识别步骤32由于可以保持接口恒定、同时可以使代码部分多样化的事实而是显著的。在识别代码部分及其接口时,发生多样性创建步骤33。在这里,生成了用于代码部分的多样化实例。另外,在这时还生成代码部分接口的多样化实例。然后在步骤34处将代码部分和接口的多样化实例聚合。应理解的是兼容代码部分实例的聚合允许创建完整程序。继续参考图3,在35处发生测试实例创建步骤。这创建了用来覆盖测试下的所有代码部分的所有测试实例。然后在步骤36处测试这些测试实例中的每一个以保证活力。一旦令人满意地测试了测试实例,则步骤37提供所有部署实例的创建。由于测试实例仅仅是代表性的且用来覆盖所有代码部分,所以因此应容易认识到的是部署实例的数目通常比测试实例的数目大得多。最后,最终步骤38当然将部署在布置37处生成的多样化代码的所有实例。应理解的是大量的实例提供针对差分攻击、串谋以及自动利用的威胁的大大改善的防御。现在将更详细地描述如图3的步骤31所图示的将程序分解或划分成代码部分。在这方面,可以出于创建代码部分的目的以各种方式来划分程序。图4至8中的每一个是根据本发明的将程序划分成所使用的代码部分的特定方法的示例。一般地,下面在本文中描述导致不同类型的代码部分的用于划分的三个方法,涉及:1)程序的物理划分,2)程序的程序流划分,以及3)程序的数据流划分。一般地,类似于C、C++和Java的高级编程语言允许通过定义小块、将那些小块组合成更大块,并且然后将这些更大块组合在一起以创建完整程序来编写程序。此外,可以根据需要来重复该过程。程序的物理块的示例包括但不限于以下各项:a)变量说明和定义、变量初始化;b)运算、条件、基本块;c)函数说明和定义(即,主体);d)类、构造者初始化、模板、复合语句;以及e)编译单元、库、完整程序。将代码部分的粒度定义为程序的物理块提供了用于程序实例生成的有效基础。例如,如果编译单元被选择为基础代码部分,则该代码部分接口很容易被定义为在编译单元外面的所有全局数据和函数依赖。此外,能够通过改变编译单元的内部构造来容易地生成多个实例。以这种方式,图4图示出根据图2中所图示的本发明的一个实施例的基于编译单元的物理划分成代码部分。在这里,可以看到原始程序41包括两个编译单元42、43。应理解的是为了图示的清楚起见,仅示出了两个编译单元,但应容易认识到的是若干编译单元可以包括任何给定程序。每个编译单元42、43可以被用来生成给定编译单元的多样化实例,其中,编译单元42a、42b和42c是编译单元42的多样化实例,并且编译单元43a、43b和43c是编译单元43的多样化实例。以这种方式,可以由原始程序41形成多样化实例41a、41b至41n(其中,n是可能的编译单元组合的数目的函数)。还可以基于函数定义来获得对程序的物理划分。图5图示出根据本发明的基于函数定义的此类物理划分成代码部分,由此,函数定义53、54、55可以形成代码部分的粒度。在这种情况下,代码部分接口52变成函数的外部依赖,其包括函数签名本身,而且还包括任何全局变量51和该函数所依赖的子函数(例如,参数、返回值......等)。全局变量51和函数定义53、54、55之间的访问在借助于点线所示的第一路径中发生。函数定义53、54、55之中和之间的访问在借助于实线示出的第二路径中发生。代码部分接口52驻留于第一和第二路径两者中,并且允许例如代码部分53与代码部分54、55兼容。为了清楚起见,针对函数53,仅示出了一个代码部分接口53。然而,应理解的是将类似地提供对应于函数54和55的接口。如提到的,除物理划分之外,导致不同类型的代码部分的划分可以替换地涉及程序的程序流或数据流划分。下面关于图6和7示出并进一步描述程序流划分的两个类型,并且关于图8示出和描述程序的数据流划分。图6图示出根据本发明的基于函数调用子图的程序流划分。高级编程语言通常具有程序流的概念。在高粒度下,程序流是程序上的,并且包括函数调用和到函数定义的转移。在低粒度下,程序流包括块和块到块的有条件或无条件分支中的个别指令的执行。基于程序流,可以创建代码部分构造。例如,图6图示出具有正在被调用的若干个不同函数的程序流。在这里,61处的函数1包括两个调用61a和61b,其分别调用62处的函数2和65处的函数5。同样地,62处的函数2包括两个调用62a和62b,其分别调用64处的函数4和63处的函数3。同样地,63处的函数3包括调用65处的函数5的调用63a。调用图表表示通过诸如从61a至62b至63a至65的流程的程序所调用的函数流。可以将调用图表的子图视为代码部分。在这里,由包括流程63a至65的点线框来描绘此类子图67。因此应容易显而易见的是多个子图可以变成一组代码部分实例。图7图示出根据本发明的基于基本块的程序的程序流划分。如所提到的,这是将程序划分成代码部分的另一方式。在这里,基本块71至77及其相关条件可以形成用于代码部分的粒度。应容易理解的是条件是基本块之间的链接。正常地,基本块是将相继地执行的指令的列表。每当发生某些“条件”(例如“如果”)时,可以存在到另一基本块的跳跃。使跳跃所进行到的哪个基本块当然取决于条件。看到这一点的一个方式是用“分支”,由此,每个“分支”意指哪个基本块的选择取决于给定“条件”。可以将任何给定基本块构造为各种实例。可以容易地将程序构造设计成在块实例被放在一起时使用块实例的变化。在图7中,如所示的代码部分示例使用一起形成定义代码部分的两个基本块71和72(BB1和BB2)。从BB2出来的控制流是如上所述的有条件分支或跳跃的示例。在这里,在BB2中评估条件,其确定将采取哪个方向(即,至BB3或BB5)。进入代码部分中的程序流(即,向BB1中进行的进入跳跃)与从代码部分出来的程序流(即,从BB2向外进行的外出跳跃)基于程序流构成此特定代码部分接口70。关于图8示出并描述了将程序划分成代码部分的又一方式。在这里,图示出根据本发明的由数据流将代码划分成一个代码部分的示例。数据变量的概念及其使用在编程语言中是通用的。这包括局部变量、全局变量、静态变量、类/结构字段和可以仅被视为只读变量的常数。数据可以采取标量形式或诸如阵列或结构的聚合形式。数据通常通过负荷从存储器流到寄存器,然后借助于指令经历操作,并且流过存储而返回至存储器。因此,程序中的数据流具有与程序流略有不同的性质。还可以将数据流视为构造代码部分的基础。诸如在颁发给Chow等人且通过引用被结合到本文中的美国专利6,594,761中所示的已知数据编码是用于存储数据的替换形式的示例,包括变换对该数据进行操作的指令。出于本发明的目的,应容易显而易见的是可以将这些数据编码视为不同的代码部分实例。关于数据编码,代码部分接口比物理或程序流划分更加复杂。将存储数据形式隔离要求程序流的知识以及对数据位置的所有访问。此信息可以通过已知编译器分析阶段导出,诸如别名分析、控制流以及数据流分析。代码部分由形成数据访问所需的所有代码组成。也就是说,代码部分由访问数据位置所需的所有代码组成,包括通过别名来访问数据位置的所有代码。然后通过到程序的其余部分的所有连接来形成代码部分接口。这包括程序流和对所有外部数据的访问。参考图8,图示出数据流划分示例,其示出通过数据流将软件代码划分成一个代码部分。在这里,块83、84、85和86表示访问块88处的数据位置A所必要的所有代码。这包括可以通过别名来访问块88的代码。代码部分接口80以白色包含到所有这些代码块的所有程序和数据流。这包括在81处的程序段1中进入块83、84和85和从块83、84和85出来的程序和数据流、在块84中访问外部数据(即,87处的其他数据B)所需的代码、以及在82处的程序段2中进入块86和从块86出来的程序和数据流。出于说明清楚的目的,借助于点线来指示关于88处的数据位置A的数据流,同时借助于实线来指示关于87处的其他数据B的数据流。同样地,可以看到与访问88处的数据位置A有关的所有点线数据流被包含在代码部分接口80内,从而借助于数据流划分将软件代码有效地划分。一旦以上文所述和图4至8所图示的方式借助于物理划分、程序流划分或数据流划分来实现原始软件代码的划分,则然后可以生成如在图3的步骤33中看到的代码部分和代码部分接口的多样化实例。当然,应认识到的是在不偏离本发明的预期范围的情况下其他划分方法可以是可能的。关于图9和图10图示出并描述了生成多样化代码部分实例。在图9中示出了根据本发明的用于生成具有固定接口的多样化代码部分组合的一个示例性方法。可以根据已知方法或此类方法的组合来实现对代码部分中的此类变化的创建,包括在编号为6,594,761、6,779,114或6,842,862的美国专利中描述的那些,这些美国专利均被颁发给Chow等人并整体地通过引用结合到本文中。由代码部分的代码部分接口及代码部分的内部构造两者来表征代码部分中的变化。在已描述的每个划分情况下(即,物理、程序流、数据流),代码部分接口可以具有不同的构成。然而,一般概念是相同的,使得代码部分接口可以保持固定,同时使得代码部分的内部是多样化的。另外,还可以使得代码部分接口是多样化的。利用多个代码部分、代码部分接口和代码部分类型,创建多样化程序实例的能力能够非常快速地增长。参考图9,在子过程90、91中示出了固定代码部分接口A-B、94,其分别地包括生成代码实例部分和生成此类代码实例部分的组合。如在子过程90中看到的,可以将被示为代码部分A和代码部分B的代码部分92和93分别多次编写为代码部分A1、A2、...An和B1、B2、...Bm,其中,n和m是表示用于部分A和B、92、93的可能代码部分变化的整数。这些多个代码部分92a、92b、...92n和93a、93b、...93m均包括相同代码部分接口A-B、94。因此,在过程90内,当在保持接口94固定的同时生成代码部分92、93中的变化时,分别通过92a至92n和93a至93m且以至少两个形式来多次编写每个代码部分92和93。应理解的是可以生成在代码部分92a、92b、...92n和93a、93b、...93m中体现的变化一次,并且将其存储在例如库中以供在子过程91中的稍后使用。在子过程91中,使用先前生成的代码部分实例92a、92b、...92n和93a、93b、...93m来生成组合。在这里,所示的组合包括代码部分实例组合A1/B1(92a、93a)、代码部分实例组合A1/B2(92a、93b)以及代码部分实例组合A2/B2(92b、93b),其中,每个组合包括固定代码部分A-B接口94。总组合可以被构成为组合Ai/Bj(92i、93j),其中,i和j表示用于特定的一组代码部分的组合变化的数目。为了执行全部的完整程序实例,将条件编译变量如此定义,使得最终编译被解析。因此应容易显而易见的是此过程能够有利地创建大量潜在的多样化实例。作为对关于图9所示和所述的方法的替换,代码部分接口也可以改变而不是固定的,从而创建多样化接口以及多样化代码部分。此努力增加了可以创建的完整实例的数目并关于图10被示出。图10图示出根据本发明的用于生成多样化代码部分接口以及多样化代码部分的一个示例性方法。进一步关于图10,再次示出了两个子过程100、101,其分别地图示出代码部分变化和代码部分接口实例的生成及这些代码部分变化和接口实例的相关组合的生成两者。以与在图9中类似的方式示出了代码部分92和93及接口94,然而,该变化和组合略有不同,如以下在本文中进一步描述的。如在子过程100中可以看到的,可以分别将被示为代码部分A和代码部分B的代码部分92和93多次编写为第一组代码部分A1、A2、...Ak和B1、B2、...Bj,其中,k和j是表示用于部分A和B、92、93的可能第一组变化的整数。此外,代码部分92和93还被多次编写为第二组代码部分A7、A8、...An和B7、B8、...Bm,其中,n和m是表示用于部分A和B、92、93的可能第二组变化的整数。第一组的这些多个代码部分92a、92b、...92k和93a、93b、...93i及第二组的这些多个代码部分92a、92b、...92n和93a、93b、...93m均包括代码部分接口A-B的相应变化。如所示,第一组包括仅在第一组组合中可用的代码部分接口A-B1(94a),并且第二组包括仅在第二组组合中可用的代码部分接口A-B2(94b)。如在图9中,应理解的是可以生成在图10中所示的代码部分中体现的变化一次,并且将其存储在例如库中以供在子过程101中的稍后使用。在子过程100中,使用先前生成的第一组代码部分实例92a、92b、...92k和93a、93b、...93i及第二组代码部分实例92a、92b、...92n和93a、93b、...93m来生成组合。在这里,所示的代码部分/接口组合包括具有代码部分接口A-B1(94a)的代码部分/接口实例组合A1/B1(92a、93a)、具有代码部分接口A-B2(94b)的代码部分实例组合A8/B8(92f、93f)以及具有代码部分接口A-B2(94b)的代码部分实例组合A8/B7(92f、93e)。总组合可以被构成为具有代码部分接口A-Bk(94k)的组合Ai/Bj(92i、93j),其中,i和j表示用于代码部分的特定总集合的组合变化的数目,并且k表示用于代码部分接口的组合变化的数目。应容易认识到的是图10中的不同类型的代码部分在接口处具有不同的多样化性质。然而,可以使用包括在编号6,594,761、6,779,114或6,842,862的美国专利中描述的那些的大量方法或其组合来使特定代码部分的内部多样化,这些专利均被颁发给Chow等人并被整体地通过引用结合到本文中。例如,考虑特定代码部分的控制流,当与控制流平整化技术(诸如在颁发给Chow等人的编号为6,779,114的美国专利中所述)组合时,可以改变以下项目:块布局、块顺序、常数选择、块选择函数族、虚假块、或控制函数计算。作为另一示例,考虑特定代码部分的数据流变换技术(诸如在均颁发给Chow等人的编号为6,594,761和6,842,862的美国专利中),可以改变以下各项:变换函数族、常数选择、或变换所应用到的实体。一旦已实现了用于代码部分和接口的多样性(即,图3中所图示的步骤33),则可以实现将代码部分实例聚合成完整程序实例(即,图3中的步骤34),如关于图11进一步示出和描述的。通过将代码部分实例和代码部分接口聚合在一起来创建完整程序实例。完整程序实例的数目和种类高度取决于上文相对于图9和10详细地描述的生成代码部分实例的前一步骤(即,图3中所图示的步骤33)。聚合过程可能是耗费时间的任务,尤其是对于诸如数据流和程序流划分的某些类型的划分而言。这是因为要求编译器分析阶段。因此,在本发明中体现的方法将立刻提供许多多样化代码部分实例的生成,使得聚合的过程是简单的后处理。本发明使用具有以下步骤的方法来达到最终程序实例。步骤1)选择将在输入程序上使用的划分的类型。步骤2)出于步骤3的目的分析该程序。步骤3)选择用于程序的代码部分和接口。步骤4)创建代码部分和接口的多样化实例。步骤5)将适当代码部分聚合成完整程序实例。应理解的是给定以上步骤1至5,可以针对特定程序执行步骤2而不是采取该方法,由此重复步骤1和2。另外,本发明提出了用于步骤5的实施例,其中,所有多样化代码部分实例被收集在非常大的大型集合(mege-set)中,并且通过条件编译指令来描绘。这允许通过用一致的一组定义宏来调用目标编译器的直接方法进行的完整程序实例的聚合。这在图11中图示出,其中,由条件编译指令来描绘两组独立代码(在块110中看到的A1、A2和B1、B2),允许创建四个完整程序实例(111、112、113、114)。现在将关于图12来描述程序实例的聚合和此类实例化程序到目标群组的部署。当考虑攻击前景和所旨在的安全目标时,该聚合步骤是最有效的,这是得到的目的。例如,如果在系统的函数边界上存在高威胁,则选择函数接口处的代码部分接口不是优选的。在编译单元水平处物理地选择代码部分或在数据流水平处选择代码部分可能更好,因为此水平处的多样化抵抗函数接口处的比较。作为另一示例,如果特定应用程序已被攻击者逆向工程,则基于程序流来选择代码部分和聚合可能是很好的选择,因为控制流的比较受到多样化的阻碍,并且控制流信息是逆向工程所需的共同第一目标。还可以基于方法的组合来设立聚合,以产生针对特定受众为目标的完整程序实例。例如,如果存在应用的特定或区域性用户群组之间的串谋的威胁,则多样化努力可以以那些群组为目标以增加针对特定威胁的抵抗水平。这在图12的方框图中图示出,其中,两个不同组126和127的多样化程序实例以其中已知存在不同威胁的两个受众为目标。在这里,将原始应用121处理成多样化代码部分122以产生实例化代码部分的大型集合123。然后可以提供先前基于诸如但不限于攻击前景或安全目标的因素描述的聚合方法之间的选择性。在这里,在124处使用控制流和数据流划分,并且在125处使用数据流和物理划分以用于相应的目标受众—例如,其中在126处可获得已知逆向工程利用的大学群组并且在127处获得具有高盗版率且已发生已知函数调用利用的国家。当然,应容易显而易见的是图12仅仅是一个示例,并且给定不同的应用情况,可以使用本文所述方法的各种组合。应理解的是如上所述的许多多样化程序实例的创建只有在如果存在所有实例具有相同行为的置信度的情况下才有用。因此,测试此类多样化实例(如早先关于图3的步骤36所看到和描述的)是重要要求。然而,每个多样化实例的穷举测试迅速变得过于麻烦而不切实际。需要且本文所提供的是表示创建的多样化实例的全集的程序实例的相当小的集合。特别地,本发明保证每个代码部分实例被测试至少一次,并且此外,测试代码部分实例的组合,因为在代码部分接口处可能发生问题。在构造了代码部分时,形成输入/输出特性,使得可能创建至少j个完整程序实例,其中,j是有界数字,比代码部分组合的最大数目少得多。可以通过使用代码部分组合的覆盖阵列来达到程序实例的数目j。覆盖阵列是在系统的成对方式或“t方式”的测试中有用的已知组合设计,并且在本文中未进一步详细描述。由于穷举测试过于昂贵且随机测试未能保证覆盖的现实,覆盖阵列提供平衡的权衡。更具体地,覆盖阵列的使用将检测到来自参数值的所有成对方式或“t方式”的交互的错误,同时使测试的数目最小化。作为示例,考虑划分成五个代码部分(A、B、C、D和E)的程序,其中每个部分具有两个多样化实例(1和2)。代码部分组合的总数是25,或者三十二组合。以下的表1示出了如何能够用仅八个完整程序实例来测试代码部分实例的所有成对方式的组合。测试1A1B1C1D1E1测试2A2B1C1D2E2测试3A1B2C1D2E1测试4A1B1C2D1E2测试5A2B2C1D1E2测试6A2B1C2D2E1测试7A1B2C2D2E2测试8A2B2C2D1E1表1。此外,由于由代码部分的输入/输出特性来表征代码部分的构造,所以这给出了用于测试的其他机会。可以以隔离的方式针对代码部分建立自动生成的测试矢量,其实行规则和边界条件两者。这是本发明的另一益处,并且呈现用于有效实例测试的新机会。可以在以诸如对象代码或源代码的各种格式存储的可执行机器代码集中体现本发明的方法步骤。在本文中已将此类代码一般地描述为算法、替换算法、程序代码或计算机程序以用于简化。显然,可以将可执行机器代码与通过外部程序调用或通过在本领域已知的其他技术实现为子例程的其他程序的代码相集成。可以由以方法步骤的方式编程的计算机处理器或类似设备来执行本发明的实施例,或者可以由具备用于执行这些步骤的装置的电子系统来执行。类似地,可以对诸如计算机磁碟、CD-ROM、随机存取存储器(RAM)、只读存储器(ROM)或本领域中已知的类似计算机软件存储介质的电子存储器装置进行编程以执行此类方法步骤。同样地,还可以经由通信网络来发送表示这些方法步骤的电子信号。对于本领域的技术人员而言还将清楚的是,本发明不需要局限于计算机和计算机系统的现有范围。可以对信用卡、借记卡、银行卡和智能卡进行编码以将本发明应用于其相应的应用。以本发明的方式的电子商务系统可以例如应用于停车计时表、自动售货机、付费电话、库存控制或租车及使用磁条或电子电路来存储软件和口令。再次地,此类实施方式对于本领域的技术人员而言将是清楚的,并且不脱离本发明。本发明的上述实施例仅仅意图是示例性的。应同样显而易见的是许多不同类型的软件或软件块可以受益于借助本发明强化的安全性。此外,在不脱离仅仅由在此所附的权利要求所定义的本发明的范围的情况下,可以由本领域的技术人员对特定实施例实现变更、修改和变形。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1