具体实施方式
各实施例提供一安全基础结构,该安全基础结构可以被配置成在现有操作系统上运行以控制什么资源可以被应用程序访问,以及应用程序可以调用什么API。通过考虑当前线程的身份以及当前线程的调用链上下文来作出安全决定,以默认地启用最小特权。捕捉当前线程上下文,并创建其副本,以用于异步地执行安全检查。系统中的每一线程都具有相关联的身份。最初,从父进程导出此身份,但是,在线程生存期内,此身份可能基于线程执行的任何模仿而变化。
各实施例不仅分析什么调用或应用程序正在请求什么,而且还分析调用来自哪里。各实施例还可以为系统提供开放的安全基础结构,如此,最终用户或最终操作员可以安装可能不处于他们自己的控制之下的不同应用程序。如此,系统中的所有线程都可以默认地以最小的特权运行,以基于线程被从线程没有权限访问的资源不正确地访问来防止安全问题发生。相反地,分析对特定资源的访问、当前线程上的所有调用者,以确保每一调用者和线程可以访问该资源。只有在每一调用者和线程都可以访问该资源的情况下才给予调用者对该资源的访问。
本发明的各实施例可以使用提供安全基础结构的数据结构来实现,该安全基础结构用于控制哪些资源可以被应用程序访问以及应用程序可以调用什么API。该数据结构包括下列元素:安全标识符(SID)、安全令牌、安全描述符(SD)、访问控制列表(ACL),以及访问控制条目(ACE)。
图1示出了根据本发明的一个实施例的安全标识符(SID)100。SID 100是一可变长度数据结构110,其在系统内定义唯一ID,并指定特定线程正在在什么帐户上运行。SID 100也可以被视为看起来象一用户帐户。例如,当某人登录到计算机上时,可以使用适当的登录口令来访问各种用户帐户。用户帐户标识登录到计算机的人。SID 100只是标识线程或过程的帐户。SID 100只在特定设备内是唯一的。然而,本领域技术人员将在分析此处对本发明的各实施例的描述之后认识到,可以使用全局安全标识符。
在台式机上,可以向单个用户帐户、某些系统帐户、以及某些用户组指派SID 100。注意,例如,
CE操作系统中的帐户不一定与关于台式机
操作系统中所使用的有相同的定义。尽管如此,本领域的技术人员将理解什么构成帐户。此处,假设SID 100为映射到帐户数据库中的条目的跨整个操作系统——例如
CE操作系统——的唯一标识符。帐户数据库中的条目指定向特定帐户指派什么基本和扩展特权(也叫做SID)。
图2示出了根据本发明的一个实施例的安全令牌结构200的布局。使用安全令牌200来定义一组身份和指派给那些身份的特权集合。通常,安全令牌200与诸如进程、线程、同步之类的运行时对象相关联,并与消息队列中的单个消息相关联。安全令牌200包括用于标识结构的版本202、标记204、偏移量206,立即组207的数量和组ID的总数208的字段。安全令牌200的结构还可以存储主要拥有者SID 210、组SID 212、基本特权214和扩展特权216。
主要210和组212SID定义与具有此安全令牌200的对象相关联的身份。基本214和扩展216特权定义对于与此安全令牌200相关联的对象允许什么特权。基本特权214是对安全令牌200中指定的身份有效的一组特权。类似地,扩展特权216是为安全令牌200中的SID列表定义的自定义特权。
基本安全令牌结构200具有指向安全令牌200的扩展(可选)数据的偏移量指针206,如与此安全令牌200相关联的主要210和组212SID,以及与此安全令牌200相关联的扩展特权216。安全令牌200中的每一单个SID 210,212用于AccessCheck API(访问检查)调用中,以确定给定安全令牌200是否具有对已指定了其SD的对象的所需访问权。同样,安全令牌200中的基本[[212]]214和扩展[[214]]216特权用于PrivilegeCheck API调用中,以确定给定安全令牌200是否具有所需的特权。将参考对此处所描述的令牌API的讨论来比较详细地讨论API和安全令牌200的使用。
创建帐户的字符串表示,并将该字符串表示映射到用于安全令牌结构200中的双字。然后,安全令牌200是与系统中的读取线程相关联的对象。因此,每一线程都以特定安全令牌200为开始。安全令牌200包括具有身份列表的基本令牌结构220,这些身份表明此特定线程属于带有特定帐户ID的特定腔室(chamber),还表明该线程是某些组的成员。每一安全令牌200通过设置来表示。如此,安全令牌结构包括结构和多个设置。第一设置是拥有者设置。这意味着,唯一ID被给予系统中的每一腔室或系统中的每一帐户。然后,可以有零个或多个组成员资格,组帐户ID。这些都在扩展令牌数据222中给出。
台式机的安全令牌结构是类似的。例如,可以有为重置台式机而定义的特权或为安装驱动程序而定义的特权。如此,如果一特定调用者具有特定特权设置,那么,只有该调用者才可以进行该API调用,且只有该调用者才可以重置设备或安装驱动程序。这些是特定特权。基本特权可以只是一个双字,由此它连接到基本特权[[212]]214,于是,可以有任意数量的扩展特权[[214]]216,它们是扩展令牌数据222的一部分。
可以有许多特权214,216,但是,特权214,216工作的方式与对于资源进行访问检查的方式完全相同。如此,如果特定API要求特定特权或要求特定调用者具有特定特权,那么,联系链中的每一调用者都必须具有该特定特权。只有在所有调用者序都具有该特权的情况下才允许调用经过。每一令牌都应该具有至少与基本令牌结构220同样多的信息。
扩展令牌结构222是可选设置。如此,作为示例,帐户可以是一个或多个组的成员。因此,它具有可变大小,即,大小不是固定的,而基本令牌结构大小是固定的。安全令牌200与每一进程相关联,于是,进程中的每一线程都在开始时接收或复制该安全令牌200。随着安全令牌200迁移到不同服务器,安全令牌200可以改变。迁移的安全令牌200与服务器的安全令牌相交。实际数据结构不会改变。
图3示出了根据本发明的一个实施例的安全描述符布局300的简化视图。安全描述符300是用于将许可与资源相关联的数据结构。对于特定资源,安全描述符300定义什么帐户具有对该资源的什么访问权限,并定义涉及该特定对象的所有规则。通常,对象的安全描述符300定义拥有者SID 320、组SID 330,以及相关联的ACL 340。
由于所有这些都是可选条目,因此,SD 300被定义为具有在结构的末尾列出的拥有者SID 320、组SID 330,以及ACL 340的可变大小结构。在SD结构300中提供了版本字段310和标记字段312,以指定什么值被包括在SD 300中。还提供了字段314,用于定义SD结构300的总大小。
安全令牌(即,在图2中,200)和安全描述符300之间的关系确定对访问权限的控制。当一线程访问资源时(例如,创建照片,创建文件,例如,/windows/myphotos/),[[。]][[该]],该调用最终进入服务器,且服务器确定调用者是否具有访问此资源的权限。服务器构建定义从该调用访问资源的权限的安全描述符300。因此,一旦服务器具有标识谁可以访问此资源的安全描述符300,则,服务器就查看调用者的安全令牌(即,在图2中,200),并确定调用者的身份。然后,服务器试图确定在安全描述符中所定义的身份是否位于ACE中的一个里。如果在安全描述符中所定义的身份位于ACE中的一个里,则服务器确定对于该身份有什么访问权限。如果该身份的访问被拒绝,那么,该调用被拒绝。如果该身份的访问权限是读取,那么,只为此调用者给予读取权限。
因此,必须使用安全令牌来标识调用和接收该调用的特定资源之间的交集,并且必须确定该身份在安全描述符300中具有什么权限。在一个操作系统内,可以提供很多个帐户ID。开始在进程内运行的每一线程都将继承具有该进程的帐户ID的令牌。随着线程对服务的不同域进行调用,令牌被更新。
图4示出了根据本发明的一个实施例的访问控制列表(ACL)400。ACL 400是访问控制条目(ACE)集合,其中包括ACE头部420,422,以及与ACE相关联的SID430,432。ACE标识为给定SID定义了什么访问权限。在图4中,ACL 400包括修订版字段402、未使用的字段404,定义结构406的总大小的字段,定义ACL 408结尾处的ACE的数量的字段和第二未使用的字段410。由于ACE的数量未预先定义,因此,ACL 400是可变长度结构。
每一ACE都指定帐户ID以及该帐户ID对该对象具有什么权限。例如,一个特定ACE可以帐户ID获得,其中,权限是对于该特定对象进行只读。另一特定ACE可以是帐户ID管理员访问读/写,其提供所有不同ACE的集合,且这些ACE中的每一个为特定帐户定义为此资源指定了什么权限。
在台式机上,ACE为每一个条目提供不同访问权限。不同访问权限包括允许、拒绝,以及审核。在
CE操作系统中,对于给定ACE授予权限。当在ACL中没有带有所需访问屏蔽的ACE时,默认返回是“拒绝”。
图5示出了根据本发明的一个实施例的访问控制条目(ACE)500的结构。每一ACE 500都定义什么类型的权限被此ACE 510允许以及允许给哪一个身份(由SID给出)520。由于SID 520是可变长数据项,因此,ACE 500也是可变长度结构。与ACE 500相关联的SID数据520在ACE结构500的末尾处开始。ACE 500还包括标记530的字段、用于标识结构532的总大小的字段和屏蔽字段534。
图6示出了根据本发明的一个实施例的安全描述符(SD)600的结构布局。安全描述符(SD)600包括头部610。SD头部610标识SD 600的版本、标记和大小。接下来,SD 600包括拥有者安全标识符(SID)620和组安全标识符(SID)630。其余的数据构成访问控制列表(ACL)640。ACL 640包括ACL头部642和一个或多个访问控制条目(ACE)650。ACL头部642标识ACE 650的版本、大小和数量。每一ACE 650都包括ACE头部652和相关联的安全标识符(SID)654。
根据本发明的一个实施例的安全基础结构是当创建进程或线程时通过安全描述符、安全标识符、访问控制列表和访问控制条目来提供的。例如,进程令牌是不可改变的,是在创建进程时指派的。默认地,如果没有提供安全性,则所有进程都被平等地对待(对于令牌特权),且向进程指派预先定义的系统令牌。这是未启用安全性的系统上的默认行为。在这样的系统中,信任边界是用户模式和内核模式之间的过渡点。
进程令牌可以潜在地是多个数据点的组合,诸如:
·将映射到帐户数据库中的ID的Exe证据(路径、散列、证书)。
·帐户数据库中的给定帐户的基本特权
·帐户数据库中的给定帐户的扩展特权
·基于调用者令牌的组ID的列表
作为给定可执行程序的证据的第一信息段是由安全加载器组件确定的,且超出了本文档的范围。出于此特征的目的,假设证据映射到帐户数据库中的ID。由此,OS将从帐户数据库中的帐户信息创建令牌。当创建进程时,此令牌与进程对象相关联,并在进程的生存期内保持不变。
当创建线程时,创建线程令牌,并将其与线程对象相关联。默认地,线程令牌与同线程的拥有者进程相关联的令牌相同。进程令牌和线程令牌之间的主要区别是,线程令牌可以在线程的生存期内变化,而进程令牌在进程的生存期内保持不变。例如,线程令牌可以在下列情况下变化:
·对模仿给定令牌的调用:这将把调用线程的活动令牌改变为传入调用以进行模仿的安全令牌。
·对还原先前模仿的调用:这将把线程令牌更新为模仿调用之前的令牌。
·对模仿当前进程的调用:这将把当前线程令牌更新为当前活动进程的令牌。
·线程从API调用返回:在API调用返回时,内核将自动地删除与线程从其返回的PSL上下文相关联的所有线程令牌。在此情况下,与线程相关联的当前令牌也被更新到API调用之前的令牌。
图7示出了根据本发明的一个实施例的线程700的令牌列表布局。为管理给定线程的多个令牌,提供了令牌列表700。令牌列表700是与线程相关联的所有令牌的链接列表。线程的当前活动令牌710始终是在令牌列表700的前头的令牌节点。换言之,令牌列表700的行为就象LIFO(后进先出)队列(也叫做堆栈)一样,其中,列表中最后添加的令牌是线程的当前令牌。对当前线程的所有访问和特权检查是只使用该特定令牌和该线程的当前上下文来处理的。此外,当线程从API调用返回时,内核自动地删除由关于受保护的服务器库(PSL)712的上下文中的模仿调用来添加到此列表的任何令牌节点。此自动还原防止了API调用上的任何特权泄漏。
在操作系统中,例如,在
CE中,线程可以通过过渡到处理相对应的API调用的服务器进程来进行API调用。由于每一线程都具有相关联的令牌——该令牌带有为该令牌定义的一组身份/特权,API服务器需要考虑该线程的当前特权来决定在当前线程上是否允许API调用。API服务器可以用来完成API调用的可能的令牌有两个:
·调用者的令牌:在此情况下,API服务器调用CeAccessCheck(GetCurrentToken(),...)(Ce访问检查(获得当前令牌(),...)。如果API调用是从高特权腔室到低特权腔室,则这种情况将是潜在的安全风险。实际上,没有高或低特权的概念。然而,出于此讨论的目的,假设高特权腔室具有低特权腔室的所有特权以及某些附加特权。
·当前进程令牌:在此情况下,API服务器调用CeAccessCheck(ImpersonateCurrentProcess(),...)(Ce访问检查(模仿当前进程(),...),其中,当前线程的令牌被更新到当前进程(API服务器的令牌)。如果API调用是从低特权腔室到高特权腔室,则这种情况将是潜在的安全风险。
每一线程开始时都以拥有者进程令牌720为开始。因此,在图7的底部列出了拥有者进程令牌720,图7示出了线程700的令牌布局。线程可以从不同的调用者或从消息队列异步地接收令牌。然后,此时线程希望基于该令牌访问资源。线程不希望使用进程令牌,而是希望改变其身份。如此,线程可以调用和模仿API中的一个,这将令牌推到令牌列表的顶部。因此,每当线程调用和模仿令牌时,该令牌变为列表的顶部。在图7中,所模仿的令牌730被示为在拥有者进程令牌720的上面。在图7中,示出了一连串N个所模仿的令牌730-750。
对照顶部令牌750,即,在当前令牌710内,检查线程访问的任何资源。每当调用模仿时,模仿令牌750始终与拥有者进程令牌720相交。如此,每当线程访问资源时,拥有者进程令牌720必须在该资源上展现访问权限,且刚刚模仿的令牌750也必须具有对该资源的访问权限。以此方式,线程可以在它过渡到不同服务器时对不同服务器进行API调用。此外,如果在联系链上有任何服务器,则所有服务器都必须具有对该资源的访问权限。
如果验证了所有三个检查,则允许对线程的访问。重要的是,此进程不同于提供单个特权。例如,如果动作只基于当前令牌750,并且如果当前令牌750碰巧具有较高的特权,那么,这将是特权的提升。相反,如果动作只基于调用者的令牌720,那么它已经从高特权服务器迁移到低特权服务器。如此,在这两种情况下,当由于可能的特权提升而只使用单个特权时,会产生安全风险。
一旦完成API调用,并返回API调用,就利用在服务器中执行的任何模仿还原令牌,以防止任何特权迭代的泄漏。如此,当API调用返回时,即使服务器忘记还原它模仿的令牌,服务器也自动地还原。以此方式,当API调用返回该令牌时,客户机也将始终还原到它在API调用之前的任何模样。
正如您可以看到的,如果我们只使用调用者的线程令牌或只使用当前进程线程令牌,则会有安全问题。为解决此问题,我们建议,当检查给定线程对于一个资源的访问时,要考虑下列各项:
·与线程的当前令牌相关联的所有身份都应该具有对资源的访问权限。
·与当前线程调用堆栈(直到模仿边界)中的所有腔室相关联的所有身份都应该具有对资源的访问权限。
·与为该线程保存的上下文相关联的所有身份都应该具有对资源的访问权限。此检查主要是在代表除调用线程以外的不同线程中的调用者执行访问检查时使用。
此改变将影响如何对于给定线程和对象检查访问权限/特权。为使代码获得对任何对象的访问,线程的当前令牌750和API服务器的令牌(即,拥有者进程/线程令牌720)两者都应该具有对该对象的访问。为使代码获得任何特权,线程的当前令牌750和API服务器的令牌720(在此示例中)两者都应该设置该特权。结果,代码默认地将始终以设置的最小访问权限/特权运行,因为线程的当前令牌750始终与当前线程的调用堆栈链700相结合。当对当前线程执行访问权限/特权检查时,这提供了用于处理由于只使用调用者的令牌720或者只使用当前进程令牌750所产生的安全问题的安全进程。下文参考表1提供了对一些令牌API的讨论。
随后的描述是针对核心模仿和访问检查API的。表1中列出的第一令牌是提供指向令牌结构的指针以及标记的CeCreateToken(pToken,flags)字段。返回令牌的句柄。
CeImpersonate Token(Ce模仿令牌)可以被任何应用程序用来模仿给定令牌。这也被用于代表调用者执行异步调用。对于此API的实现是将此令牌推到当前线程的令牌列表的堆栈的顶部,并使此令牌成为线程的当前令牌。此API调用将始终把当前进程令牌与给此API调用的指定的令牌合并,且合并的令牌被视为当前线程的令牌。
此外,还将当前进程身份(由当前进程令牌给出)隐式地添加到传入的令牌身份。这样做的主要原因是防止调用者利用此API调用获得任何特权。换言之,此API将被局限于降级或至多具有与当前进程相同的特权。这允许代码默认地在最小特权级别下执行。其用途如下:在API调用时,当前线程的令牌被隐藏起来,稍后被API服务器中的异步线程用来在调用时利用调用者的上下文执行API调用。
如果当前线程的令牌被更新,CeImpersonateCurrentProcess(void)令牌返回真;否则,它返回假。使用CeRevertToSelfToken来“弹出”当前线程的令牌列表的令牌。通常,这被API服务器用来撤销经由CeImpersonateToken或CeImpersonateCurrentProcess API调用执行的任何令牌模仿。使用CeImpersonateCurrentProcess Token(Ce模仿当前进程令牌)来将当前线程的令牌列表截断到当前进程令牌。这有效地将当前进程令牌“推”到当前线程的令牌列表的前头。
CeAccessCheck Token(Ce访问检查令牌)包括三个自变量。第一自变量是表示为我们正请求访问的对象设置的许可的SD。第二自变量是请求访问对象的身份的令牌。第三自变量是对对象的所需访问权限。使用CeAccessCheckToken(Ce访问检查令牌)来检查对于给定令牌中的每一个帐户以及对于给定SD中列出的每一个ACE的给定访问权限。此API检查对于给定令牌中的每一个帐户以及对于给定SD中列出的每一个ACE的给定访问权限。
CePrivilegeCheck Token(Ce特权检查令牌)检查给定令牌中的给定特权访问。此API检查给定令牌中的给定特权访问。为使API成功,所有给定特权(在pPrivileges阵列中指定的)都必须存在于令牌的基本或扩展特权列表中。
CeGetProcessAccount(hProcess)令牌返回与给定进程相关联的拥有者帐户。CeGetThreadAccount(hThread)令牌返回与给定线程相关联的拥有者帐户。CeGetOwnerAccount(hToken)令牌返回与给定令牌相关联的拥有者帐户。CeGetGroupAccount(hToken,idx)令牌使用令牌的句柄和组帐户的索引来返回与给定令牌相关联的组帐户。GetCurrentToken(void)令牌提供线程的当前令牌的伪句柄。
图8示出了根据本发明的一个实施例的PSL调用800中的线程的调用堆栈列表。在操作中,内核维护了关于每一线程的调用堆栈结构列表。在每一PSL调用和返回上,更新线程的调用堆栈列表800。在图8中,示出了四个调用堆栈810,820,830,840。最后调用堆栈840在顶部,并是当前调用堆栈。在PSL调用进入之际,添加新的调用堆栈结构。在API调用返回时,删除最顶部的调用堆栈结构。调用堆栈结构800与线程已迁移至的一个PSL服务器相对应。
图9是示出了根据本发明的一个实施例的线程900的模仿列表和调用堆栈列表之间的链接的框图。类似于调用堆栈结构,在列表中维护了线程的令牌,且当前模仿位于令牌列表的顶部。在图9中,示出了四个调用堆栈910,920,930,940。最后调用堆栈940在顶部,并是当前调用堆栈。为确保跨PSL调用没有特权泄漏,内核在当前线程的模仿列表和当前线程的调用堆栈列表之间维护了链接。每一模仿节点都与其中发生了模仿调用的调用堆栈结构相关联。
如此,在图9中,属于一个应用程序的线程迁移到PSL服务器S1 910。PSL服务器S1调用模仿API,结果,模仿节点912被添加到模仿列表,并在模仿节点T1 912中标记相关联的调用堆栈结构S1。接下来,PSL服务器S1迁移到PSL服务器S2 920。S2不进行任何模仿调用。接下来,此时线程在同一个调用中迁移到S3 930,且S3服务器调用模仿令牌。新的模仿节点932被添加到令牌列表中,在T2 932中标注相关联的调用堆栈结构S3 930。
在线程生存期的不同阶段执行资源检查。例如,考虑来自S1 910的访问检查。在此情况下,当线程迁移到S1进程910时,针对访问权限检查资源。将执行下列检查:
·令牌T1中的所有身份都应该具有对资源的访问
·与进程S1相关联的令牌中的所有身份都应该具有对资源的访问
接下来,考虑从S2920的访问检查。在此情况下,当线程经由S1910进程迁移到S2920进程时,针对访问权限检查资源。在此情况下,将执行下列检查:
·令牌T1中的所有身份都应该具有对资源的访问
·与进程S2相关联的令牌中的所有身份都应该具有对资源的访问
·与进程S1相关联的令牌中的所有身份都应该具有对资源的访问
在从S3 930执行访问检查时,线程经由S1 910再经由S2 920迁移到进程S3 930。从S3 930调用访问检查。将执行下列检查:
·令牌T2中的所有身份都应该具有对资源的访问
·与进程S3相关联的令牌中的所有身份都应该具有对资源的访问
注意,在此情况下,尽管线程全上下文在其调用链中具有进程S2 920和S1 910,但是,不针对这些进程执行访问检查,因为S3 930模仿令牌,并且模仿有效地切断调用堆栈链。
在从当前进程(列为调用堆栈顶部940)执行访问检查时,在线程调用堆栈链900中的S3进程930和当前进程940之间没有更多令牌模仿。将执行下列检查:
·令牌T2中的所有身份都应该具有对资源的访问
·与调用堆栈链中的当前进程-进程S3相关联的令牌中的所有身份都应该具有对资源的访问权限。
如此,访问检查的基本规则包括当前令牌(在当前线程的令牌列表的前头的令牌)是否应该具有对资源的访问,以及从当前进程直到调用了模仿的最后进程(包括)的所有进程是否应该具有对资源的访问。
可以提供CeGetAccessMask API(Ce获得访问屏蔽API),以返回指派给给定SD的令牌的最大访问权限。可以使用三个自变量来实现这样的API:
·具有我们希望检查其访问权限的身份的列表的令牌
·列出与给定资源的不同ID相关联的ACE的安全描述符
·返回为给定SD和令牌组合设置的最大访问权限的[出(out)]参数。
对于此API的实现是直接的:对于令牌中的每一个ID,执行检查以确定SD中是否有Allow ACE(允许ACE)。如果有,则将与该ACE相关联的访问屏蔽添加到将返回的访问屏蔽值。对于当前线程上下文中的每一个令牌,重复此步骤,(直到最后一个模仿),并只返回在所有令牌中设置的那个访问屏蔽。注意,与CeAccessCheck不同,此API调用需要扫描SD中的所有ACE,以获得来自令牌的带有匹配的ID的所有访问屏蔽的并集。
此外,还可以通过计及下列自变量来提供CeDuplicateToken API(Ce复制令牌API):
·源令牌调用者的句柄正在尝试复制。
·指向新复制的令牌对象的句柄的[出(out)]指针在调用进程内复制令牌对象。
图10示出了根据本发明的一个实施例的消息队列系统1000。根据本发明的一个实施例,消息队列1010在客户端1020和服务器1030进程之间提供异步消息接发。消息队列1010允许客户端1020打开消息队列1010的写入端,并允许服务器1030打开消息队列1010的读取端。客户端1020和服务器1030可以将消息及其他数据张贴到消息队列1010中。可以提供多个消息队列1010,且这样的消息队列1010异步地操作。如此,随着客户端1020写入消息,然后离开,客户端1020不等待确认或任何类型的信号。然后,服务器1030可以拾取消息,并基于检索出的消息来执行动作。当服务器1030拾取消息时,服务器1030必须具有在写入该消息时实际拥有该消息的线程的安全凭证。到服务器1030读取该消息时联系会改变,如此,联系快照的副本必须已经制作,并与消息一起写入,以便当服务器1030读取消息时,服务器可以实际访问该快照,模仿该快照,然后,创作消息,并将结果发回。
除异步地将消息和发送该消息的发送者的身份传递到服务器1030以使得服务器1030可以代表它们进行操作的过程之外,消息和消息的张贴者的身份,以及在张贴消息时存在的消息的张贴者的整个安全联系,也是该过程的一部分。以此方式,在稍后的时间可以作出更安全的决定。然而,本领域技术人员将认识到,本发明不意味着仅限于使用如此处所描述的消息队列。相反地,用于给服务器提供线程的联系链的其他技术也是可能的。
当一个进程启动时,向它指派了某种身份,并向该进程中的每一个线程给定该身份。随着线程迁移到系统上的其他进程,这些线程累积那些其他进程的身份,以便当启动关于线程的安全决定时,可对所有这些身份求交集,以确定线程的访问特权。此外,进程并未意味着对于任何特定服务器是特定的。相反地,任何服务器都可以使用此模型。例如,在
操作系统上,如果将输入数据令牌,则必须存在特定特权,即,模仿特权。模仿是被允许的,因为在最坏情况下模仿导致权限降级。
在涉及多个调用者的情况下,例如,在台式机上,当应用程序调用创建文件或由操作系统导出的任何其他API时,在内核模式下,线程在用户的边界停止,且内核内的另一线程将甩出(spin off),并对于该API执行动作,然后将调用返回到线程。如此,线程实际从一个进程过渡到台式机上的另一个进程。而在
CE操作系统上,当应用程序进行API调用时,线程实际迁移到服务器进程。
通常,服务器进程的特权比客户机更高。因此,如果应用程序调用注册公开密钥来打开注册表,并且该特定注册表是低特权应用程序不能读取的受保护密钥,则线程上的调用和线程将迁移到实际实现注册表API的服务器进程。如果该服务器进程携带访问密钥,则这是该同一个类型的行为,因为调用者的安全联系不被考虑。然而,如果将调用者的安全联系与当前安全联系进行比较,那么,将拒绝对该受保护资源的访问。
台式机
操作系统和Windows
操作系统是不同的,因为Windows
操作系统的线程实际上迁移,且必须与线程一起维护安全联系信息。只有那时才可以基于请求对资源的访问时的整个联系来作出决定。对于台式机,当从用户模式过渡到内核模式时,当前线程联系必须被复制,并且随后在内核线程上,调用者被迁移,且动作被完成,就像代表调用者完成的那样。一旦完成了动作,执行迁移回原始安全联系,并将结果返回到调用者。
序列化和解序列化特定线程的安全联系。例如,在Windows
操作系统中,保护数据库记录,以使得谁可以更新以及谁可以编辑数据库记录是受限制的。为提供安全性,记录的安全联系与记录一起被保存。如此,例如,当一个调用到达以更新记录时,也可以传达记录的安全联系和调用者,以查看调用者是否具有足以执行所请求的数据库操作的权限。为实现此过程,安全联系必须能够在脱机数据库中被处理,因为数据库是永久性的。因此,运行Windows
操作系统的设备被设置,且当该设备复原时,就数据库记录是否仍保留了相同联系作出确定。当调用者被标识时,确定该联系链中的所有帐户,然后另存为文件。当新调用到达时,再次构建一个文件,并将其与保存的文件进行比较以确保调用者是联系链中的帐户的子集。
如果应用程序对服务器进行调用,则服务器执行线程中的动作。在不同的线程中,可以模仿调用者,以使得代表调用者访问所有资源。来自客户机的安全联系的快照基本上包括:读取发送者的名称,当前联系链中的所有调用者,什么帐户或不同帐户位于联系链中,以及是否发生了到不同服务器的迁移。例如,应用程序4RXE可以调用服务器,然后,该同一线程调用另一服务器。如此,联系链上可以有多个服务器。然而,它们中的每一个都必须具有适当的访问权限。因此,当获取联系快照时,必须捕捉当前处于联系中的所有帐户。
值得注意的是,随着线程跨系统迁移,其安全联系会变化,因为它穿过不同服务器并具有不同权限。必须确定它们的所有权限的交集。需要用于在一个时间点拍快照的能力,以作出安全决定。换言之,当将进行安全检查时,被验证的所有ID都需要保存,如此,可以异步地或稍后进行检查。
上文所描述的系统和组件可被实现为联网的,分布式的或其他计算机实现的环境的一部分。系统和组件可以经由有线、无线和/或通信网络的组合来进行通信。包括台式计算机、膝上型计算机、手持式设备的许多客户机计算设备,或其他智能设备可以与系统进行交互和/或作为系统的一部分被包括。在替换实施例中,可以根据所希望的实现,组合和/或配置各个组件。还有其他实施例和配置可用。
现在参考图11,下面的讨论旨在提供其中可以实现本发明的各实施例的合适的计算环境的简要的一般说明。尽管将在与在个人计算机上的操作系统上运行的程序模块一起执行的程序模块的一般上下文中来描述本发明,但是,本领域的技术人员将认识到,本发明也可以与其他类型的计算机系统和程序模块相结合地实现。
一般而言,程序模块包括执行特定任务和/或实现特定抽象数据类型的例程、程序、组件、数据结构以及其他类型的结构。此外,本领域技术人员将了解,可以利用其他计算机系统配置来实施本发明,包括手持式设备、多处理器系统、基于微处理器的或可编程消费电子产品、小型计算机、大型计算机,等等。本发明也可以在其中任务由通过通信网络链接的远程处理设备执行的分布式计算环境中实现。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。
现在参考图11,将描述本发明的各实施例的说明性操作环境。如图11所示,计算机1100包括能够执行一个或多个应用程序的通用台式机、膝上型计算机、手持式设备或其他类型的计算机。计算机1100包括至少一个中央处理单元1108(“CPU”)、系统存储器1112,包括随机存取存储器1118(“RAM”)和只读存储器(“ROM”),以及将存储器连接到CPU 1108的系统总线1110。基本输入/输出系统可以存储在ROM 1120中,包含例如在启动过程中帮助在计算机内的元件之间传输信息的基本例程。计算机1100还包括用于存储操作系统1132、应用程序,及其他程序模块的大容量存储设备1114。
大容量存储设备1114可以通过连接到总线1110的大容量存储控制器(未示出)连接到CPU 1108。大容量存储设备1114以及其相关联的计算机可读介质可以为计算机1100提供非易失性存储器。虽然此处包含的计算机可读介质的描述引用了诸如硬盘或CD-ROM驱动器之类的大容量存储设备,但是,本领域的技术人员应该了解,计算机可读介质可以是可以被计算机1100访问或利用的任何可用的介质。
作为示例而非限制,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据之类的信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不限于,RAM、ROM、EPROM、EEPROM、闪存或其它固态存储器技术、CD-ROM、数字多功能盘(“DVD”)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由计算机1100访问的任何其它介质。
根据本发明的各实施例,计算机2可以通过诸如例如局域网、因特网等等之类的网络1104使用到远程计算机的逻辑连接来在联网环境中操作。计算机1100可以通过连接到总线1110的网络接口单元1116来连接到网络1104。应该了解,网络接口单元1116还可以被用来连接到其他类型的网络和远程计算系统。计算机1100还可以包括输入/输出控制器1122,用于接收和处理来自包括键盘、鼠标等等(未示出)的许多其他设备的输入。类似地,输入/输出控制器1122可以向显示屏幕、打印机、或其他类型的输出设备提供输出。
如上文简要地提及的,许多程序模块和数据文件可以存储在计算机1100的大容量存储设备1114和RAM 1118中,包括适于控制联网的个人计算机的操作的操作系统1132,诸如位于华盛顿州雷德蒙市的微软公司的
操作系统。大容量存储设备1114和RAM 1118还可以存储一个或多个程序模块。具体而言,大容量存储设备1114和RAM 1118可以存储客户端应用程序1140及其他软件应用程序1142。如图11所示,计算机1100可以被配置成执行提供如图1-10所描述的根据本发明的各实施例的安全基础结构的指令。
应该了解,本发明的各实施例可以实现成(1)计算机实现的动作序列或在计算系统上运行的程序模块和/或(2)计算系统内的互连机器逻辑电路或电路模块。实现是取决于实现本发明的计算系统的性能要求的选择问题。因此,包括相关算法的逻辑操作可以被不同地称为操作、结构设备、动作、或模块。所属领域技术人员将认识到,在不偏离在此处所阐述的权利要求书内所列举的本发明的精神和范围的情况下,这些操作、结构设备、动作和模块可以以软件、固件、特殊用途数字逻辑,以及其任何组合来实现。
虽然结合各个示例性实施例描述了本发明,但是,本领域技术人员可以理解,在随后的权利要求书的范围内可以对本发明进行许多修改。因此,本发明的范围不以任何方式受上面的描述的限制,而是完全参考随后的权利要求书来确定。