具体实施方式
综述
本发明提供了一种机制,由此,不同的数据类可被储存在不同的堆上。处理不同数据类的函数可被配置成将数据从每一类仅写到适当的堆(或将假定属于特定类的数据仅从特定的堆读出),并遵守在使用来自特定堆的数据时控制该堆的规则。例如,可创建两个堆分别用于储存机密和非机密数据。函数可被配置成在机密堆上储存所有的机密,而拒绝将数据从机密堆写出到任何非机密位置。作为另一示例,一个堆可被设计成储存服从某些非破坏标准的数据(如,可信数据),并且使用和依赖于这类数据的函数可被配置成仅从该堆接收数据,以防止其输入数据被破坏。相反,函数可被配置成拒绝将不可信数据(如,来自不可信来源的数据,或以不满足的信任适用标准的某一方式创建或获取的数据)写到可信堆上,由此保持了该堆上的数据的完整性。换言之,关于不同存储器区域(如,不同堆)的分隔的规则可用于防止机密数据泄漏,也防止坏数据进入。一般而言,不同的堆可用于储存服从关于数据的特定规则的数据,并且函数可被配置成通过仅以重视那些规则的方式使用(即,读和写)堆来遵守那些规则。
示例性计算装置
图1示出了可在其中实现本发明各方面的示例性计算环境。计算系统环境100仅为合适的计算环境的一个示例,并非暗示对本发明的使用范围或功能的局限。也不应将计算环境100解释为对示例性操作环境100中示出的任一组件或其组合具有任何依赖或需求。
本发明可以使用众多其它通用或专用计算系统环境或配置来操作。适合使用本发明的众所周知的计算系统、环境和/或配置的示例包括但不限于:个人计算机、服务器计算机、手持式或膝上设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费者电子设备、网络PC、小型机、大型机、嵌入式系统、包括任一上述系统或设备的分布式计算环境等等。
本发明可在诸如由计算机执行的程序模块等计算机可执行指令的一般上下文环境中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。本发明也可以在分布式计算环境中实践,其中,任务由通过通信网络或其它数据传输介质连接的远程处理设备来执行。在分布式计算环境中,程序模块和其它数据可以位于本地和远程计算机存储介质中,包括存储器存储设备。
参考图1,用于实现本发明的示例性系统包括计算机110形式的通用计算装置。计算机110的组件可包括,但不限于处理单元120、系统存储器130以及将包括系统存储器的各类系统组件耦合至处理单元120的系统总线121。处理单元120可表示诸如多线程处理器上支持的多逻辑处理单元。系统总线121可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线以及使用任何各类总线体系结构的局部总线。作为示例而非局限,这类体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线以及外围部件互连(PCI)总线(也称为Mezzanine总线)。系统总线121也可被实现为通信设备间的点对点连接、交换光纤等。
计算机110通常包括各种计算机可读介质。计算机可读介质可以是可由计算机110访问的任一可用介质,包括易失性和非易失性介质、可移动和不可移动介质。作为示例而非局限,计算机可读介质包括计算机存储介质和通信介质。计算机存储介质包括以用于储存诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任一方法或技术实现的易失性和非易失性,可移动和不可移动介质。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CDROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机110访问的任一其它介质。通信介质通常在诸如载波或其它传输机制的已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送介质。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信介质包括有线介质,如有线网络或直接连线连接,以及无线介质,如声学、RF、红外和其它无线介质。上述任一的组合也应当包括在计算机可读介质的范围之内。
系统存储器130包括以易失性和/或非易失性存储器形式的计算机存储介质,如只读存储器(ROM)131和随机存取存储器(RAM)132。基本输入/输出系统133(BIOS)包括如在启动时帮助在计算机110内的元件之间传输信息的基本例程,通常储存在ROM 131中。RAM 132通常包含处理单元120立即可访问和/或当前正在操作的数据和/或程序模块。作为示例而非局限,图1示出了操作系统134、应用程序135、其它程序模块136和程序数据137。
计算机110也可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。仅作示例,图1示出了对不可移动、非易失性磁介质进行读写的硬盘驱动器141、对可移动、非易失性磁盘152进行读写的磁盘驱动器151以及对可移动、非易失性光盘156,如CD ROM或其它光介质进行读写的光盘驱动器155。可以在示例性操作环境中使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器141通常通过不可移动存储器接口,如接口140连接到系统总线121,磁盘驱动器151和光盘驱动器155通常通过可移动存储器接口,如接口150连接到系统总线121。
图1讨论并示出的驱动器及其关联的计算机存储介质为计算机110提供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图1中,示出硬盘驱动器141储存操作系统144、应用程序145、其它程序模块146和程序数据147。注意,这些组件可以与操作系统134、应用程序135、其它程序模块136和程序数据137相同,也可以与它们不同。这里对操作系统144、应用程序145、其它程序模块146和程序数据147给予不同的标号来说明至少它们是不同的副本。用户可以通过输入设备,如键盘162和定位设备161(通常指鼠标、跟踪球或触摸板)向计算机110输入命令和信息。其它输入设备(未示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至系统总线的用户输入接口160连接至处理单元120,但是也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。监视器191或其它类型的显示设备也通过接口,如视频接口190连接至系统总线121。除监视器之外,计算机也可包括其它外围输出设备,如扬声器197和打印机196,通过输出外围接口195连接。
计算机110可以在使用到一个或多个远程计算机,如远程计算机180的逻辑连接的网络化环境中操作。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等设备或其它公用网络节点,并通常包括许多或所有上述与计算机110相关的元件,尽管在图1中仅示出了存储器存储设备181。图1描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。这类网络环境常见于办公室、企业范围计算机网络、内联网以及因特网。
当在LAN网络环境中使用时,计算机110通过网络接口或适配器170连接至LAN 171。当在WAN网络环境中使用时,计算机110通常包括调制解调器172或其它装置,用于通过WAN 173,如因特网建立通信。调制解调器172可以是内置或外置的,通过用户输入接口160或其它合适的机制连接至系统总线121。在网络化环境中,描述的与计算机110相关的程序模块或其部分可储存在远程存储器存储设备中。作为示例而非局限,图1示出了远程应用程序185驻留在存储器设备181中。可以理解,示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它装置。
堆
在执行程序期间,可能必须分配存储器用于数据存储。如本领域中已知的,“堆”是被指定为为了满足存储器分配请求而分配的一个或多个存储器的块。通常,程序使用库例程来请求一些存储器;库例程然后从堆中分配存储器,并返回被分配的存储器地址。图2示出了程序如何从堆中获取存储器分配。
程序204是在计算机环境中执行的程序。在其执行期间,程序204可能需要存储器来储存某一类型的数据。用于整个操作环境的存储器由操作系统分配,并且程序204可使用系统调用来向操作系统直接请求存储器分配。然而,对程序204更常见的是使用诸如存储器管理API 208等标准库函数来请求存储器。
当程序204需要存储器时,程序204向存储器管理API 208发出请求206,以请求所需的存储器量。请求206一般采取对由存储器管理API 208展示的函数(如,malloc(size))的调用的形式。存储器管理API 208然后在堆202内定位特定大小的未分配连续存储器块,并向程序204返回这一存储器块的基地址。
堆202是由存储器管理API 208管理的一个或多个存储器块-通常是大存储器块。存储器管理API 208通过向操作系统请求一个或多个分配来获取堆202的存储器。尽管如上所述,程序可能直接向操作系统请求每个分配,然而使用在按需的基础上获取大存储器块(即,堆202)分配给程序204的存储器管理API 208一般是更有效的,因为这一技术减少了(昂贵的)系统调用的数量。另外,存储器管理API 208可通过使用趋向于抵抗碎片的技术,并通过执行无用信息收集(garbagecollection)来有效地管理堆202中的存储器。此外,由于通过存储器管理API 208分配给程序204的所有存储器位于堆202中,因此所有这样的存储器被称为落入一个或多个定义良好的地址范围之内。如下文所讨论的,基于存储器是否落入特定的地址范围之内将存储器标识为在特定的堆上的能力有利地用于在需要以不同方式或依照不同规则处理的不同类型的数据之间进行区分。然而,应当注意,基于数据位于哪一堆来实施数据分隔的能力不限于这一实施仅由存储器管理API执行的情况;在一个较佳实施例中,管理存储器的所有函数-不论是存储器管理API的一部分、任何其它API还是操作系统(如,操作系统的底层存储器分配函数)-将被配置成实施将不同的数据类到不同的堆的分隔。
使用多个堆来管理不同类型的数据
图3示出了其中两个不同的堆202(1)和202(2)被维护成管理不同类型的数据的情形。在此示例中,堆202(1)用于管理“机密”数据,而堆202(2)用于管理其它数据。“机密”数据是一般应当不被散布,或应当仅在非常特殊的条件下散布的数据。密钥是机密数据的示例。
在一个示例中,堆202(1)和202(2)由两个不同的API来分配-一个在机密上执行操作,而另一个不是。(或者,可以有单个API,它使用两个堆,并在机密上执行某些操作,而在非机密上执行某些操作。)在图3的示例中,有一机密管理API 302,和一“其它”API 304。例如,机密管理API 302可展现生成密钥的函数,或使用这类密钥用于加密、解密、数字签名等的函数。“其它”API 304可执行不涉及机密管理的其它函数-如,输入/输出、排序、数学计算、或任何其它类型的函数。机密管理API 302维护堆202(1)来储存机密数据。“其它”API 304维护堆202(2)来储存非机密数据。例如,当机密管理API 302创建密钥并需要空间来储存该密钥时,它从堆202(1)获取储存该密钥的存储器。当“其它”API 304需要存储器时(如,I/O缓冲区),则它从堆202(2)获取存储器。在图3的示例中,API 302和304被示出为单独的API,尽管如上所述,机密管理也可以是执行机密管理和其它函数两者的单个API;这一API可维护两个堆202(1)和202(2),并可根据特定函数正在储存的数据类型来使用不同的堆。
程序204可通过调用任一API展现给程序204的函数来调用API 302或API304。如果调用的函数导致存储器分配,则调用的函数被配置成从适当的堆中分配存储器。
如上所述,当堆用于分配存储器时,可标识来自堆的存储器,因为它将落入已知将构成堆的地址范围之内。类似地,当使用两个堆时,构成每一堆的地址范围是已知的,因此可将给定的地址标识为来自一个堆或另一堆(或者在不从任一堆分配存储器的情况下,标识为不来自任何堆)。标识特定的存储器位置来自两个堆中的哪一个的能力本质上定义了两种不同的数据类,并且这一区分可有利地用于对不同的数据类应用不同的规则。例如,API 302和304都可被配置成理解机密一般应当不被发送到I/O设备。(例如,将机密密钥发送到网络端口可代表异常行为。)由此,构成API的函数可被配置成通过核查数据位于何处来识别机密堆上的数据何时正以异常方式使用,并且那些函数可被配置成适当地运作(例如,通过引发警告、呈现警告消息或拒绝执行所请求的任务)。例如,采用地址作为自变量,并向I/O设备写出该地址的内容的函数可被配置成将该地址与机密堆的已知地址范围进行比较;如果该地址是机密堆的一部分,则该函数可拒绝执行写。
应当注意,尽管API 302和304的函数可被配置成防止机密堆202(1)中的数据的滥用,然而程序员仍有可能将数据从一个堆传输到另一个。例如,如果a是机密堆202(1)上的地址,而b是非机密堆202(2)上的地址,则程序员总是可以执行以下指令:
*b=*a
(在此示例中,这是C编程语言)。这一指令具有将机密数据复制到非机密堆的效果。然而,即使这一指令可被发出,配置API使得它们不会共谋滥用机密堆上的数据迫使程序员令其将数据从机密堆传输出去的意向变得明确。要求程序员明确地传输数据通过迫使程序员公开地确认他或她将机密作为非机密处理的意向具有减少程序员错误的有益效果。
应当注意,尽管图3示出了两个堆的情况-一个堆用于储存机密,而另一个用于储存非机密-更一般地,系统可被配置成维护任意数量的堆,其中,不同的规则组被应用到储存在堆中的不同数据类。API可被配置成识别任何数据存储在哪一堆上,并遵循应用到该数据类的任何规则。
实施堆规则的示例API
图4示出了由API 302和304展示的函数的示例,它们可用于实施应用到不同堆的不同规则。在图4的示例中,API 302展示了在机密堆202(1)上操作的函数,而API 304展示了在其它数据(即,储存在非机密堆202(2)中,或储存在不是机密堆202(1)的一部分的其它位置上的数据)上操作的函数。
例如,API 302展示了涉及密钥的函数-如,createkey()、applysecert()和decrypt()。例如,createkey()函数可从机密堆202(1)中分配足够大以储存类型“SECRET”的数据的存储器部分、生成密钥、将密钥储存在分配的存储器中、并返回指向储存的机密的指针。sign()函数可采用指向机密的指针和指向散列的指针作为自变量、基于散列和机密计算数字签名、并将签名写到已知的位置。decrypt()函数可采用指向机密的指针、指向包含密文的字符的指针和指向将写入解密的密文(“明文”)的位置的指针作为自变量,并且然后可使用机密以将密文解密到提供给明文的位置。在一个实施例中,decrypt()函数可以不关注密文位于何处,但是可要求明文位于被指定为用于机密的堆上(由此防止明文被不加区别地使用)。所有这些函数适当地利用了机密-即,它们创建或使用机密,但是不通过I/O设备发送机密。(“适当”指“符合应用于堆的任何规则”;如上所述,本发明不限于特殊堆储存机密的情况,也不限于应用到该堆的规则是避免通过I/O设备发送机密的情况。)
相反,API 304展示了在一般数据上操作的函数-如,格式化数据并将其写到标准输出流的printf(),或者将任意数据发送到指定的IP(“互联网协议”)地址的transmit()。当向这些函数传递存储器地址作为自变量时,它们可被配置成确定该地址是否落入作为机密堆202(1)的一部分的范围之内。如果地址落入任何这样的范围之内,则函数可如上所述地被配置成适当运作(如,引发警告、拒绝执行请求的任务等等)。
如上所述,不必要将在机密上执行操作的函数以及不在机密上执行操作的函数归类成单独的API。在许多情况下,API将包含在机密上执行某些操作并在非机密上执行某些操作的函数;这些函数可依照它们正在操作的数据类型使用机密和非机密堆两者。
使用特殊堆的示例过程
图5示出了当使用特殊堆时可能发生的示例过程。图5示出了两个堆的示例-一个用于机密,另一个用于其它数据-尽管如上所述,本发明不限于两个堆的情况,或一个堆被指定为用于储存机密的情况。
最初,程序作出对管理机密的函数-如上述createkey()函数-的调用(502)。程序然后为机密堆上的数据分配位置,并将数据储存在分配的位置中(504)。在程序中的某一随后的点,程序以对机密不适当的方式将地址传递到使用该地址内容的函数(506)-例如,程序可将地址传递到printf()函数。被调用的函数然后核查该地址以确定该地址是否为机密堆的一部分。如果地址不是机密堆的一部分,则函数正常地执行请求的行动。如果该地址是机密堆的一部分,则函数采取适当的行动(508)-例如,向用户警告将要采取的行动、拒绝执行该函数等等。
示例情形和使用
在诸如微软的下一代安全计算基础(NGSCB)等安全计算系统中,明确地考虑程序中的哪些信息是敏感的,以及哪些信息来自不可信来源并必须被十分仔细地处理将是有益的,因为它可能具有不期望的内容(如,恶意利用的企图)。有至少两类问题期望被防止:1)传统的缓冲区溢出(overrun),其中,超尺寸的分组将破坏执行栈,并导致不正确的代码运行,以及2)程序员错误,其中,某些机密被复制到受保护的空间之外。这些问题可通过提供若干不同的堆以供应用程序从中分配,并仅允许某些类型的数据被传输到来自正确堆的分配中来防止。
通常,将数据移出进程空间的系统服务(写入文件或网络,进行进程间通信等)无法说出调用程序地址空间中的哪些数据地址能够以这一方式“合理”或“安全”地展示。如上所述,本发明提供了一种使程序能够隔离系统可标识的区域中尤其重要的机密数据的方法。由此,本发明允许系统(以及系统服务)能够“帮助”程序不泄漏机密,并也减少了机密由于程序员错误而被广播的机会。换言之,本发明令书写偶然泄漏机密的代码变得更难。
在一个较佳实施例中,存储器分配函数要求调用程序明确地指定其分配应当来自哪一堆。由于系统知道每一堆的虚拟地址范围,因此每一系统服务可拒绝在数据上执行不适当的行动。在一个实施例中,可在启动了NGSCB可信代理的时刻保存每一堆的虚拟地址范围;如有必要,可在启动时基于伴随可执行映像的信息来调整堆的大小。例如,诸如通过写入Windows文件系统的未加密文件来将数据传输到受保护空间之外的函数可拒绝将可能包含解密密钥的缓冲区复制出来;类似地,将数据传输到受保护的空间内的函数可拒绝将来自不可信来源的数据,或在无法保证数据将满足应用于受保护空间的任何标准的情况下创建的数据写入受保护空间内,由此保持了受保护空间中的数据的完整性。加密数据的函数可在提供的密钥不在被指定为储存可信数据的堆时拒绝运行。从安全存储检索加密钥资料的函数或密钥对生成器可坚持它们所写的值必须到被指定为储存机密的堆中。处理没有特定可信性保证的数据的函数可拒绝将该数据写入为可信数据所保留的堆中。这些示例中的公共主题是不同的函数可关于将出现在某些参数中的信息类型作出假设,并且程序不可能通过例如检索缓冲区的关键字然后通过套接字发送该缓冲区来泄漏信息,或通过将不可信数据写入受保护堆中来破坏该受保护的堆。如上所述,程序可有目的地这样做,但是上述机制防止这些行动由于错误或意外而被执行。
应当注意,上述示例仅为解释目的而提供,并不解释为局限本发明。尽管参考各实施例描述了本发明,然而可以理解,此处所使用的词语是描述和说明性词语,而非限制性词语。此外,尽管此处参考特定的装置、材料和实施例描述了本发明,然而本发明不限于此处所揭示的细节;相反,本发明延及落入所附权利要求书的范围内所有在功能上等效的结构、方法和使用。从本说明书的教导获益的本领域的技术人员可以在不脱离本发明各方面的范围和精神的情况下对其作出各种修改和变化。