具体实施方式
参考图1-7描述本公开的实施例。本文所描述的实施例可以包括未在附图中图示的一个或多个元件或组件。仅仅作为示例,可以利用在某个拓扑中的有限数目的元件来描述实施例。每个元件可以包括执行某些操作的结构。每个元件可以实现为硬件、软件或其任何组合。数据结构和软件代码以其整体或者以其部分可以存储在计算机可读介质中,所述计算机可读介质可以是能够存储供计算机系统使用的代码和/或数据的任何设备或介质。另外,可以经由通信网络来传输对可以嵌入在载波中的软件代码进行表示的计算机数据信号。
在描述中,术语“可加载”、“可交换”、“可更新”和“可换新”可以可互换地使用。在描述中,术语“组件”和“模块”可以可互换地使用。在描述中,术语“可编程组件”和“软件组件”可以可互换地使用。
本公开的实施例提供了用于支持软件组件更新的细粒度机制,以例如用于支持域中可换新的安全性和/或性能改进。粒度可以定义为可以由单个功能或多个功能的任何组合所组成的软件组件。对于每个可换新的软件组件,存在使内容多样化的机会,这意味着在保持功能性恒定的同时,软件的结构可以在每次更新时都不同,但是同样,功能性可以可选地在更新组件时是可变的。该细粒度机制提供了可以更新的片段(piece)的更大灵活性。
换新软件组件的基本能力可以与用于反回滚、反前滚和强制组件更新的能力相组合。这例如通过将加密散列链与数据表相组合的机制而实现。这些数据表不仅包含用于更新机制的数据,而且还包含应用中所使用的数据。这些多用途数据片段的组合使得更新机制的移除对于攻击者而言是繁重的。
根据本公开的实施例,原生程序的单个叶级功能可以动态加载到运行的程序中。这些“热可交换”程序组件为出于实现安全性特征的目的的可更新软件组件提供基础。用于交换程序组件的机制作为静态代码(即基本加载组件)封装在程序中(参见例如图1的102)。实现方式按照操作系统的类型而变化,但是应用于例如但不限于Windows、Mac OSX、Linux、Android和iOS。基本加载组件的任务是用新的外部版本来替换叶级组件。除加载代码之外,程序映像中的任何代码可以被定义为可加载动态组件,只要它可以定义为叶级功能。此外,如果在程序的静态功能性中包括扩展机制,则可以放宽叶级特性。
用于原生组件的加载机制例如但不限于没有控制流的直线代码的片段,其不具有浮动符号,并且没有除了参数和到代码块的返回值之外的范围外的引用。除ABI惯例(应用二进制接口)之外,该代码不需要链接到程序的其余部分。因此,只要在程序中存在空间并且不存在程序当前执行于其中的竞态条件,将该代码动态地“投到(drop)”程序中就位就是可能的。另外,将约束放宽到代码所可以引用的是可能的,如果引入解析这些引用的附加机制的话。例如,只要存在插入的重定向的跳转表,跳转到本地代码外的代码就是可能的。类似地,只要存在插入的地址重定向的表,对本地代码外的数据的引用就是可能的。该机制可以变成对于充分发展(full-blown)的运行时动态链接的等同物。通过将限制置于可加载组件被准许做的事上,允许高性能和高效的动态加载机制。
在非限制性示例中,加载机制被应用于诸如C和C++之类的语言所支持的原生应用。在另一非限制性示例中,加载机制被应用于脚本语言和web语言。例如,在如同python、TCL和Perl那样的脚本语言中,它们的求值(即eval())能力形成用于动态更新的内置能力。此外,如同Java、JavaScript、Ajax、ASP和PHP那样的web语言在程序正在运行时具有类似的动态可更新性。这些脚本类型语言的动态可更新性可以与本公开中的诸如反回滚、反前滚、强制更新等等之类的概念组合以便无论它们工作在什么系统上下文中都形成可换新的系统。例如,HTML5+CSS+JavaScript的web系统可以受益于本发明中的概念以提供具有JavaScript的动态可更新性的可换新系统,这进而向HTML5+CSS内容供应可换新的更新。
系统概述
与附加概念组合的可交换程序组件的定义提供了用于抵抗大量攻击的框架。这些附加概念中的一些包括例如但不限于:
1.防止差分攻击的多样程序组件的生成。
2.需要强制更新并且防止回滚攻击的加密散列链。
3.防止数据回滚和前滚攻击的散列数据与应用数据的交织。
在图1中示意性地图示了用于可换新系统的基本机制的一个示例。图1的程序映像102包括基本加载组件102和一个或多个动态加载的组件104和106。在非限制性示例中,动态加载的组件是运行时域可加载(field-loadable)、热可交换的可编程组件。例如,动态加载的组件104在程序的运行时利用新的外部组件114是可替换的;并且动态组件106在程序的运行时利用新的外部组件116是可替换的。用于交换程序组件104和106的机制作为基本加载组件102封装在程序中。
在非限制性示例中,动态加载的组件104和106是产生自C、C++、汇编码等等的原生功能。在非限制性示例中,动态加载的组件104和106是例如Perl python、TCL的脚本语言的部分。在非限制性示例中,动态加载的组件104和106是例如JavaScript、Java、Ajax、ASP、PHP的web语言的部分。
在图1中,仅仅出于说明目的而示出两个组件104和106。本领域普通技术人员将领会到在程序中可以存在一个或多于两个的动态加载的组件。
在图2中示意性地图示了从客户端视角的可换新系统的一个示例。存在用于构成如图2中所示的从客户端视角的可换新系统的三个部分:
1.基本加载组件(即执行加载的“基本组件”);
2.一个或多个加载的组件(即“可交换组件”);以及
3.外部或内部状态数据(即可以在基本组件和可交换组件之间共享的程序数据)。
在图2中,程序130的可交换区域中的可交换模块134被更新模块142替换;在程序130的可交换区域中的可交换模块136被更新模块144替换;并且提供基本模块132以用于加载。更新模块142和144可以在加载到程序中之前在外部被更新。
在图2中,仅仅出于说明目的而示出两个可交换组件。本领域普通技术人员将领会到在程序130中可以存在一个或多于两个可交换组件。
在图3中示意性地图示了从服务器视角的可换新系统的一个示例。在服务器侧150中存在三个部分,如图3中所示:
1.更新池152。更新池152包括可以在任何请求时被部署的软件更新154的集合;
2.策略控制(Policy control)156。策略控制156是用于部署软件更新的主控制点;以及
3.物理更新机制158。系统采取到受信服务器的连接性,示例包括:连接到PC、平板和来自互联网的设备;通过3G/4G网络的智能电话和设备;线缆系统头端到机顶盒(STB)的集合;等。
在图3中,服务器150通过分别使用更新模块164和166来更新客户端程序160和162。
参考图1-3,用于可换新系统的基本机制是热交换软件组件的能力。软件组件可以在程序的运行时动态交换。用于阻止的已知方法(包括互斥和信号量(semaphore)机制)可以用于确保处于交换之中的组件在交换期间不运行(这可能不合期望地导致非运转的程序)。
系统可以包括两种类型的动态加载:
1.完全动态。
2.部分动态
在完全动态加载中,系统总是在线(即拴系/连接到服务器)。在该设置中,要求软件更新组件在频繁的基础上来自服务器并且立即调用更新的组件。
在部分动态加载中,系统可以在某一百分比的时间内离线(即不连接到服务器)。在该设置中,软件组件可以被预加载并且在某一时间内保持休眠,直到更新使先前加载的组件运行为止。
这些完全动态和部分动态的系统具有关于软件更新的频率和大小的工程设计(engineering)权衡。此外,存在关于安全性的权衡。在一些情况中,部分动态的系统可能比完全动态的系统优选,因为设计者可以准备休眠代码以用于一旦已经检测到域中的威胁就激活。
用于写和测试状态数据这二者的代码被包括在可交换组件中。在图2中,可交换模块134(136)中的代码146(148)用于写和测试与更新相关联的状态数据138。在非限制性示例中,该状态数据138包含例如但不限于通过散列链所计算的加密散列值。链可以在时间上向前或向后运行并且在系统的部署之前被预计算。可交换组件134(136)中的代码146(148)中的一部分用于写散列数据,其对更新的状态进行编码。在执行时,代码将把该状态数据138写到内部或者外部存储装置中的未公开位置。此外,可交换组件中的代码的第二部分将测试状态数据138。如果状态数据138处于正确的配置中,则程序将照常继续操作。如果状态数据138被检测到由于回滚或前滚攻击而处于不正确的配置中,那么将使程序表现为异常操作。异常操作的类型取决于应用和上下文,但是可以包括:停止操作(即硬故障)、缓慢使程序的操作降级(即软故障)以及向服务器通知异常操作(即自动通报(call home))。
状态数据138用于验证所更新程序的正确性。在非限制性示例中,状态数据138与用于程序功能性的应用数据140混合。首先,状态数据138的位置是未公开的并且与应用数据140缠结,使得状态数据138可以不易于被攻击者定位。其次,用于状态数据138的位置在用于应用数据140的位置之中动态分配,这意味着随程序的运行将动态定位相当大量的状态数据。第三,状态数据138不仅仅是恒定数据而是被创建为取决于应用数据140中所包含的值的计算数据。这最后的措施抵抗其中修改状态数据而不改变应用数据的攻击。实际上,状态数据已经被扩展以包括对程序130中所使用的应用值的依赖性。
服务器侧构建和策略控制
图3的去往可换新系统的服务器侧150包括构建和部署系统。用于可更新组件的构建系统包含用于构建多样组件的工具,如下文所描述的那样。组件可以被预构建和组织成序列。另外,组件的结构和构成可以根据部署群体而多样化。例如,群体可以指向不同客户观众,以便降低对整个软件群体的“打破一次,打破处处”攻击的能力。
策略控制156监视和控制如何以及何时将更新部署到系统中的客户端。策略控制156确定例如:
•客户端应当运行直到需要软件更新为止的时间长度(例如,通过本文档中稍后描述的强制更新机制)。
•客户端群体当前操作在其上的特定更新链,以及群体何时/是否应当切换到另一链(参见例如图6)。
•完全动态与部分动态的更新被部署到如上所述群体所按的粒度。
策略控制156可以作为完全自动化系统运行或者通过系统管理员手动或半自动运行。在最低限度上,系统管理员通过与策略控制156一起操作的门户来监视系统的运行时操作。
多样性
多样性是将不同结构应用于软件组件或软件组件集合的概念。不同代码结构是抵抗攻击者对通过比较代码而获得认知的努力的有效手段。多样性可以应用在两个维度中:
1.不同的代码结构
2.不同的代码功能性
这些维度二者都具有应用于可换新系统的优点。
多样性可以应用于基本组件(例如图1的102,图2的132)和/或可交换组件(例如图1的104,图2的134、136)。当应用于基本组件时,多样性在部署的实例中起作用。例如,可以为得到程序组件的每个客户创建结构上不同的基本组件(使用来自上文的维度1)。该努力抵抗试图从比较由两个或更多不同客户拥有的程序中获得信息的攻击。此外,多样性还可以应用于包括整个程序映像的部署在内的主要升级。这将抵抗在初始程序的两个主要版本之间的攻击。
多样性可以独立地应用于可交换/可加载软件组件。这可以在空间上作为对不同客户的不同实例而被应用。同样,这可以在时间上当提供每个组件更新时被应用。另外,通过使用如上所描述的维度2,功能性可以在实例之间在空间和时间维度二者中变更。可以例如使用改变可交换组件中的功能行为的能力来将过程变更成与先前所使用的不同的散列链。像是这样的途径可以保持聪明的攻击者处于困境。这将在下一章节中进一步描述。
在图4中示意性地图示了被应用于基本组件和可加载组件二者的多样性的一个示例。在图4中,出于说明目的而示出用于第一客户P的程序映像180和用于第二客户Q的程序映像190。用于加载对可加载组件184进行替换的更新组件186的基本组件182封装在程序180中;并且用于加载对可加载组件194进行替换的更新组件196的基本组件192封装在程序190中。可加载(可交换)组件184被更新组件186替换;并且可加载(可交换)组件194被更新组件196替换。
对于基本组件182和192,其示出被指定用于不同客户P和Q的实例的不同代码结构。对于可加载组件184和194,其示出用于每个可更新组件的不同代码结构和不同代码功能性。
将来和过去状态的拒绝(反回滚和反前滚)
在非限制性示例中,通过使用存储器槽(memory slot)来验证软件更新的状态。在此软件更新被定义以将存储器中的预定义存储器槽设定成已知值。该机制可以用于拒绝将来状态。类似地,相同机制可以用于拒绝过去状态,使得可以不跳过软件更新。另外,当在循环中使用时,可以实施软件更新的任何期望的序列并且以具有任何预定周期的循环。
通过使用多个数据存储槽来验证状态,软件更新既可以向存储器槽指派状态并且还可以验证正确状态。在图5中示出简化示例。在图5中,出于说明目的而示出具有三个定义的槽(槽1、槽2、槽3)的数据存储器。软件更新A-D将向存储器槽1、槽2和槽3指派状态以及验证存储器的状态。在该示例中,软件更新A 202在它已经完成执行时将槽1设成值A(212),软件更新B 204将槽2设成值B(214),软件更新C 206将槽3设成值C(216),并且软件更新D 208将槽1设成值D(218)。值A-D仅仅用作示例。在非限制性示例中,随机选取的加密强度密钥(例如64/128-比特AES密钥或SHA-2散列值)可以用作这些值。
选取这些值A-D例如使得:
a)值看似随机并且与彼此不可区分,使得几乎不存在一个值可以具有与另一个无关的含义的指示。
b)值可以充当解锁程序中功能性的加密密钥。
软件更新遵循预定义的序列(例如A→B→C→D),其使得能够实现反回滚和反前滚措施。反回滚措施230可以验证数据存储器槽尚未达到在将来更新中的预期值。例如,在图4中,软件更新A验证(222)槽1不包含值D,因为预期它直到软件更新D时才被设置。对于软件更新B和C,分别对槽2和3做出类似验证(参见图5的224、226)。这些措施确保软件更新尚未独立于数据存储器而回滚。所做的验证检查可以通过在US 6842862中找到的技术被隐藏并且可以通过在PCT/CA2011/050157中找到的技术而绑定到程序中的行为,其通过引用并入于此,这抵抗攻击者简单地基于这些检查而改变条件的能力。
类似地,可以做出验证232以抵抗反前滚攻击,使得不跳过软件更新。例如,在图5中,软件更新C验证(226)槽2包含值B以确定软件更新B 204尚未被跳过。软件更新D 208在槽3上做相同类型的验证(228)以确定软件更新C 206尚未被绕过。例如,如果在软件更新A202之后槽2包含B并且槽3包含C,则检测到回滚234;如果在软件更新C之后没有值指派到槽3,则检测到前滚236。
验证检查232可以通过US 6,842,862和PCD/CA2011/050157中的技术被隐藏并且绑定到程序。可替换地,B或C的值可以被选取为解锁必要数据或功能性的编密码密钥。同样,加密地解锁数据的能力可以通过使用具有略微变化的现有对称或非对称算法而隐藏在更新的代码中。例如,如果AES算法的白盒实现略微变化(例如具有独立的轮密钥并且具有边界处的数据变换,如在US 6,842,862中那样)并且该代码被包含在软件更新中,则正是该仅有更新能够使用数据存储器中的预定密钥。该方法允许软件更新被锁定到存储器中的槽中的密钥。
在图5中,仅出于说明目的而图示了用于四个软件更新的三个槽。本领域普通技术人员将领会到该技术可以扩展到用于任何数目的软件更新的任何数目的存储器槽。存储器槽的数目与软件更新的数目的比可以灵活选取为1比1或1比N(即许多),其中权衡是需要的存储器的量相对于可以实现的回滚或前滚检测的细粒度。另一方面,选取N>1可以有助于在部署软件升级时隐藏存储器位置随时间的意向的目的。除了1到N映射之外,映射不需要在程序的寿命内固定。该映射可以动态改变,这可以进一步抵抗系统机构上的攻击。
另外,通过示例示出的反回滚和反前滚机制可以通过使更新系统中的模式循环而可互换地使用。更新链可以包含大于1的任何基本所选周期的循环。此外,任何数目的重复循环和循环内的循环可以以动态方式被使用和增加。该灵活性提供了随时间换新对域的安全性的能力。
使用计算链的强制更新
在非限制性示例中,加密散列链用于强制更新。用于强制更新的散列函数可以是标准散列函数(例如SHA-1、SHA-2、MD-5),或者散列函数的任何定制变型,或者是完全自产的(home-grown)散列函数。当以链式方式使用时,起始数据值通过函数,其进而变成对链中下一链接的输入。可以简单地通过借由其它有用的(即应用)计算来分离循环散列函数而使该周期性系统以任何期望的定时快速或缓慢地循环。图6描绘了从可以嵌入到软件更新中的随机选取的起始值开始的这些循环。“睡眠1000”表示被插入到链式计算中的延迟。任何延迟可以插入到链式计算中。
对于图6的软件更新A 300,起始数据值302通过散列函数A1 304;并且起始数据值308通过散列函数A2 310。对于图6的软件更新B 320,起始数据值322通过散列函数B1 324;并且从散列函数A2 310得到的散列链值312通过散列函数B2 330。对于图6的软件更新C340,从散列函数B1 324得到的散列链值326通过散列函数C1 344;并且起始数据值342通过散列函数C2 350。在图6中,如果散列值306是预定的标记值(例如“0x9236FF23”),则调用软件更新B(314),并且同样如果散列值332是预定的标记值(例如“0xEB876543”),则调用软件更新C(334)。
预定的标记值可以离线计算并且嵌入在软件中,使得当标记值被标识时,它引起强制软件更新发生的事件(314,334)。例如,可以创建允许不多于1000次调用的软件组件。这可以通过将散列函数链放置在组件的开端处并且将第1000个标记散列值(例如来自离线计算)嵌入在更新中来实现。当软件组件达到其第1000次调用时,它调用强制软件更新。强制行为可以以许多方式实现,其示例包括:
•对程序功能性的必需数据的恶化,所述程序功能性仅在调用软件更新时可以继续。
•删除允许必需功能性的编密码密钥,所述必需功能性除非调用软件更新否则将不继续
•调用与特许过程(即环(Ring)0,内核模式驱动器)通信的异常处置器,其停止应用的执行直到调用软件更新为止。
不需要保护标记值,因为实际值没有嵌入的含义;然而,在非限制性示例中,自任何潜在攻击者隐藏出于调用强制更新的目的而使用标记值的代码的行为。该程序代码可以通过抗篡改和混淆技术(诸如在US 6,842,862中描述的那些)来隐藏。此外,增加程序行为与数据值(包括标记值)集合的关联的模糊性的任何措施将必然对攻击者造成屏障。例如,标记值可以是其值触发对可能功能(其中之一引起强制更新)的大型集合的召用的大表的部分。
标记值和散列链可以用作对先前描述的通过使用存储器槽的回滚和前滚检测的补充。例如,替代于检查用于即时行为的存储器槽中的特定值,值的链式散列可以循环通过以最终触发回滚或前滚检测行为。
上述方法可以扩充有附加控制方法。方法可以应用于单个更新和单个更新链。方法可以扩充到集体行为中,其中多个更新和多个更新链一起反应和起作用。例如,一个强制更新可以使得三个相互依赖的更新链当中的两个反应,而留下一个链工作在不同周期上。
另一示例是创建软件组件更新的次序依赖性的能力。利用图3的策略控制156,可以创建对可更新软件组件的子链的预定次序。例如,可以使5个软件更新的链是强制性的而没有对更新的任何跳过。以上机制准许检测对次序的任何打破(其可以指示攻击)的能力。在此机制可以用作对系统完整性的检查,并且可以在所准许的之上创建策略。这是补救可以通过其而发生的安全性检查。
作为另一示例,从服务器的图3部分的策略控制156下推的策略可以产生必要的策略互锁。一个示例是除可交换组件的集合之外要求更新基本组件的策略。
强制更新的能力以及反回滚和反前滚特征为软件系统提供了具有对更新的更多控制的能力。本领域普通技术人员将领会到以上所描述的更新可以不仅用于安全性的目的,而且还用于性能改进、特征添加、错误(bug)修复等的目的。对定时和用于软件更新的触发的控制是用于任何软件系统的长期维护的有用效用,其在连接的系统环境中尤为重要。
状态数据与应用数据的交织
在非限制性示例中,内部数据(即状态数据,诸如图2的138)的使用可以通过良好定义的API而与应用数据混合,使得存储器槽的随机选取防止攻击者辨识数据所意图的使用。例如,应用使用存储器来存储有关应用的数据(例如用户信息、程序状态等),而散列数据用于实施软件更新系统的状态。如果攻击者不能辨识这两个意图,则当尝试暗中破坏软件更新系统时他可能不合期望地改变应用数据。数据的这种混合和交织提升了攻击者变更更新机制而没有关系到应用的正确功能的不合期望的副作用的难度。另外,可以使状态数据取决于应用数据,使得包括拷贝状态数据而没有相关应用数据的攻击将是无效的。
图7描绘了将状态数据与应用数据交织的概念的概述。公共API(应用程序接口)400被设计使得程序410中的应用402代码和状态验证404代码可以与数据420以公共方式交互。公共API 400把对数据的访问(即数据的读、写和修改)转换成类似的访问,但是控制以下特性:
•数据的位置:数据的静态位置和动态位置二者。
•数据的复制(duplication):API模块确定是否存在用于相同数据的复制位置以及哪些位置是“活的”(即在使用中)。
•数据到子位置中的拆分。
•数据之间的依赖性:API组件确定状态数据如何以及何时取决于其它状态数据,以及状态数据如何以及何时取决于应用数据。
用于状态或应用的目的的数据可以在静态意义或者动态意义上遍及用于存储的区域而定位。在静态意义上,数据在程序的寿命内驻留在恒定位置中。在动态意义上,数据可以在其寿命中驻留在取决于程序在哪里的不同位置处。
数据的复制是创建针对攻击者的诱骗或分散注意力的方法。例如,用于验证更新的当前状态的状态数据可以复制在存储装置中的2个或更多物理位置之中。然后,程序可以动态地决定仅依靠这些位置中的一个(或多个)并且在其它位置中创建诱骗数据。由于攻击者不知道哪些位置是正规(legitimate)的,他将被引导偏离于真实的状态数据。此外,当程序继续运行时可以使程序动态依赖于不同位置。这将使攻击者猜测关于哪些以及何时状态数据位置是正规的。
数据的拆分包括创建用于一个数据片段的多个位置。创建最终状态数据的子片段可以分布到分开的位置中,与其它不相关数据组合,和/或也被复制。用于访问数据的公共API控制数据如何在静态和动态意义二者上重组。重组数据的方式可以取决于在其寿命期间程序中的点而变化。
状态/状态数据和状态/应用数据之间的依赖性可以通过在PCT/CA2011/050157中找到的技术来实现。依赖性可以被创建用于恒定或可变数据,包括数据载体和数据绑定到程序中。在没有理解依赖性的情况下对数据的不利改变可以使得程序误运行。
除了该公共数据访问API之外,编译工具可以用于分析和混合数据访问API中的代码与应用和状态处置代码。这是在致力于自动化上文所描述的一些或所有步骤。
作为对状态数据的添加的措施,软件现在具有收集遥测数据的能力。例如,当通过更新追踪状态时,还可能追踪不被策略准许的状态。我们可以定义被完全禁止的状态并且不允许软件继续(如早先所描述的那样);然而,另一方面,如果我们将这些状态视为是被劝阻的,则我们可以创建对被劝阻的状态的数目进行计数以作为遥测数据的策略。然后可以将该遥测数据周期性地发送回服务器,其中策略控制(例如图3的156)可以采取行动以补救该情形。例如,如果被劝阻的状态的数目超过针对特定客户的某个阈值,则策略控制可以决定增加该客户上的主动更新换新的速率。
将领会到本发明还延伸到被适配用于将本发明付诸实践的计算机程序,特别是在载体上或载体中的计算机程序。程序可以以源代码、目标代码、源和目标代码中间诸如部分编译形式之类的代码的形式,或者以适于使用在根据本发明的方法的实现中的任何其它形式。载体可以是能够承载程序的任何实体或设备。例如,载体可以包括诸如ROM(例如CD ROM或半导体ROM)之类的存储介质,或者例如软盘或硬盘的磁性记录介质。另外载体可以是诸如电或光学信号之类的可传输载体,其可以经由电缆或光缆或者通过无线电或其它手段来传送。当程序以这样的信号体现时,载体可以由这样的线缆或者其它设备或装置构成。可替换地,载体可以是其中嵌入程序的集成电路,集成电路被适配用于执行相关方法或用于使用在相关方法的执行中。
已经通过示例描述了一个或多个当前优选的实施例。对本领域技术人员将显而易见的是可以做出许多变型和修改而不脱离于如权利要求中限定的本发明的范围。