Windows XP Service Pack 2 和 Windows Server 2003 Service Pack 1 中的 DCOM 安全增强功能

Windows Server XP Service Pack 2 (SP2) 和 Windows Server 2003 Service Pack 1 (SP1) 引入了分布式组件对象模型 (DCOM) 的增强默认安全设置。 具体而言,它们引入了更精细的权限,使管理员能够独立控制用于启动、激活和访问 COM 服务器的本地和远程权限。

DCOM 的作用是什么?

Microsoft 组件对象模型 (COM) 是一个独立于平台的面向对象的分布式系统,可用于创建可以交互的二进制软件组件。 分布式组件对象模型 (DCOM) 允许将应用程序分布在对您和应用程序最有意义的位置。 DCOM 线路协议以透明方式为 COM 组件之间的可靠、安全且高效的通信提供支持。

此功能适合哪些用户使用?

如果仅对进程内 COM 组件使用 COM,则不适合使用此功能。

如果 COM 服务器应用程序满足以下一个条件,则适合使用此功能:

  • 应用程序的访问权限比启动权限更严格,启动权限是运行应用程序所必需的。
  • 应用程序通常由远程 COM 客户端激活,而无需使用管理帐户。
  • 应用程序仅可供本地使用。 这意味着,可以限制 COM 服务器应用程序,使其不可供远程访问。

Windows XP Service Pack 2 和 Windows Server 2003 Service Pack 1 中在此功能中添加了哪些新功能?

计算机范围限制

在 COM 中进行了更改,现可提供计算机范围访问控制,以控制对计算机上所有调用、激活或启动请求的访问。 考虑这些访问控制的最简单方法是,在每次调用、激活或启动计算机上的任何 COM 服务器时,针对计算机范围访问控制列表 (ACL) 执行额外的 AccessCheck 调用。 如果 AccessCheck 失败,则调用、激活或启动请求将被拒绝。 这是针对服务器特定 ACL 运行的任何 AccessCheck 的有益补充。 实际上,它提供最低授权标准,必须达到此标准才能在计算机上访问任何 COM 服务器。 对于启动权限,有一个计算机范围 ACL,涵盖激活和启动权限;对于访问权限,也有一个计算机范围 ACL,涵盖调用权限。 这些可以通过组件服务 Microsoft 管理控制台 (MMC) 进行配置。

这些计算机范围 ACL 提供了一种方法,用于覆盖特定应用程序通过 CoInitializeSecurity 指定的弱安全设置,或特定于应用程序的安全设置。 这将提供必须满足的最低安全标准,而不考虑特定服务器的设置。

当访问 RPCSS 公开的接口时,将检查这些 ACL。 这提供了一种控制对此系统服务的访问的方法。

这些 ACL 提供了一个集中位置,管理员可以在其中设置适用于计算机上的所有 COM 服务器的常规授权策略。

注意

更改计算机范围安全设置将影响所有 COM 服务器应用程序,并且可能会阻止它们正常工作。 如果 COM 服务器应用程序的限制不如计算机范围严格,则减少计算机范围的限制可能会将这些应用程序公开给不必要的访问。 相反,如果增加计算机范围的限制,某些 COM 服务器应用程序可能无法再通过调用应用程序来访问。

默认情况下,Windows XP SP2 计算机限制设置为:

权限 管理员 任何人 匿名
启动
本地启动
本地激活
远程启动
远程激活
本地启动
本地激活
Access
本地访问
远程访问
本地访问

默认情况下,Windows Server 2003 SP 1 计算机限制设置如下所示。

权限 管理员 分布式 COM 用户(内置组) 任何人 匿名
启动
本地启动
本地激活
远程启动
远程激活
本地启动
本地激活
远程启动
远程激活
本地启动
本地激活
空值
Access
空值
本地访问
远程访问
本地访问
远程访问
本地访问
远程访问

注意

分布式 COM 用户是 Windows Server 2003 SP1 附带的新内置组,可加快将用户添加到 DCOM 计算机限制设置的过程。 此组是 MachineAccessRestrictionMachineLaunchRestriction 设置使用的 ACL 的一部分,因此从此组中删除用户会影响这些设置。

为什么此更改很重要? 它有助于缓解哪些威胁?

许多 COM 应用程序包括一些特定于安全的代码(例如调用 CoInitializeSecurity),但使用弱设置,通常允许未经身份验证就访问进程。 管理员目前无法覆盖这些设置来在早期版本的 Windows 中强制增强安全性。

COM 基础结构包括 RPCSS,这是在系统启动期间运行的系统服务,始终在系统启动之后运行。 它管理 COM 对象的激活和正在运行的对象表,并为 DCOM 远程处理提供帮助程序服务。 它会公开可远程调用的 RPC 接口。 由于某些 COM 服务器允许未经身份验证的远程访问,因此任何人都可以调用这些接口,包括未经身份验证的用户。 因此,未经身份验证的远程计算机上的恶意用户可以攻击 RPCSS。

在早期版本的 Windows 中,管理员无法了解计算机上的 COM 服务器的公开级别。 管理员以前是通过系统地检查计算机上所有已注册 COM 应用程序的配置安全设置来了解公开级别,但是,鉴于 Windows 的默认安装中大约有 150 台 COM 服务器,该任务会令人生畏。 除非查看软件的源代码,否则无法查看在该软件中纳入安全性的服务器设置。

DCOM 计算机范围限制可缓解这三个问题。 它还使管理员能够禁用传入的 DCOM 激活、启动和调用。

工作原理的不同之处是什么?

默认情况下,Everyone 组被授予本地启动、本地激活和本地访问调用权限。 这样,所有本地方案都可以在不修改软件或操作系统的情况下正常工作。

默认情况下,在 Windows XP SP2 中,Everyone 组被授予远程访问调用权限。 在 Windows Server 2003 SP1 中,Everyone 组和 Anonymous 组都被授予远程访问权限。 这会启用大多数 COM 客户端方案,包括 COM 客户端向远程服务器传递本地引用的常见情况,实际上会将客户端转换为服务器。 在 Windows XP SP2 中,这可能会禁用需要未经身份验证的远程访问调用的方案。

此外,默认情况下,仅向管理员组的成员授予远程激活和启动权限。 这会禁用非管理员对已安装 COM 服务器的远程激活。

我该如何解决这些问题?

如果实现 COM 服务器并期望支持非管理 COM 客户端的远程激活,则应考虑与启用此进程相关的风险是可接受的,或者是否应将实现修改为不需要通过非管理 COM 客户端或未经身份验证的远程调用进行远程激活。

如果风险可接受,并且想要通过非管理 COM 客户端或未经身份验证的远程调用启用远程激活,则必须更改此功能的默认配置。

注意

更改计算机范围安全设置将影响所有 COM 服务器应用程序,并且可能会阻止它们正常工作。 如果 COM 服务器应用程序的限制不如计算机范围严格,则减少计算机范围的限制可能会将这些应用程序公开给不必要的访问。 相反,如果增加计算机范围的限制,某些 COM 服务器应用程序可能无法再通过调用应用程序来访问。

可以使用组件服务 Microsoft 管理控制台 (MMC) 或 Windows 注册表更改配置设置。

如果使用组件服务 MMC 管理单元,则可以在所管理计算机的“属性”对话框的“COM 安全性”选项卡上配置这些设置。 已修改“访问权限”区域,从而除了 COM 服务器的标准默认设置之外,还可以设置计算机范围限制。 此外,还可以在限制和默认值下为本地和远程访问提供单独的 ACL 设置。

在“启动和激活权限”区域中,可以控制本地和远程权限,以及计算机范围限制和默认值。 可以单独指定本地和远程激活和启动权限。

或者,也可以使用注册表配置这些 ACL 设置。

这些 ACL 存储在注册表中的以下位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\MachineAccessRestriction=ACL
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\MachineLaunchRestriction=ACL

这些是类型为 REG_BINARY 的命名值,其中包含的数据描述可以访问计算机上的任何 COM 类或 COM 对象的主体 ACL。 ACL 中的访问权限包括:

COM_RIGHTS_EXECUTE 1
COM_RIGHTS_EXECUTE_LOCAL 2
COM_RIGHTS_EXECUTE_REMOTE 4
COM_RIGHTS_ACTIVATE_LOCAL 8
COM_RIGHTS_ACTIVATE_REMOTE 16

可以使用正常的安全函数创建这些 ACL。

注意

为了提供向后兼容性,ACL 可以采用 Windows XP SP2 和 Windows Server 2003 SP1 之前使用的格式,该格式仅使用访问权限 COM_RIGHTS_EXECUTE,也可以采用 Windows XP SP2 和 Windows Server 2003 SP1 中使用的新格式,该格式使用 COM_RIGHTS_EXECUTE,以及 COM_RIGHTS_EXECUTE_LOCAL、COM_RIGHTS_EXECUTE_REMOTE、COM_RIGHTS_ACTIVATE_LOCAL 和 COM_RIGHTS_ACTIVATE_REMOTE 的组合。 请注意,COM_RIGHTS_EXECUTE> 必须始终存在;缺少此权限会生成无效的安全描述符。 另请注意,不得在单个 ACL 中混用旧格式和新格式;要么所有访问控制项 (ACE) 只授予 COM_RIGHTS_EXECUTE 访问权限,要么所有访问控制项都必须授予 COM_RIGHTS_EXECUTE 以及 COM_RIGHTS_EXECUTE_LOCAL、COM_RIGHTS_EXECUTE_REMOTE、COM_RIGHTS_ACTIVATE_LOCAL 和 COM_RIGHTS_ACTIVATE_REMOTE 的组合访问权限。

注意

只有具有管理员权限的用户才能修改这些设置。

Windows XP Service Pack 2 和 Windows Server 2003 Service Pack 1 中的哪些现有功能将有所变化?

RPCSS 作为网络服务运行

RPCSS 是 RPC 终结点映射器和 DCOM 基础结构的关键服务。 此服务在早期版本的 Windows 中作为本地系统运行。 为了减少 Windows 的攻击面并提供深度防御,RPCSS 服务功能被拆分为了两个服务。 具有所有不需要本地系统特权的原始功能的 RPCSS 服务现在利用网络服务帐户运行。 包含需要本地系统特权的功能的新 DCOMLaunch 服务利用本地系统帐户运行。

为什么此更改很重要?

此更改可减少攻击面,并为 RPCSS 服务提供深度防御,因为 RPCSS 服务中的特权提升现在仅限于网络服务特权。

工作原理的不同之处是什么?

此更改对于用户而言应该是透明的,因为 RPCSS 和 DCOMLaunch 服务的组合等同于早期版本的 Windows 中提供的先前 RPCSS 服务。

更具体的 COM 权限

COM 服务器应用程序具有两种类型的权限:启动权限和访问权限。 启动权限控制授权,以在 COM 激活期间启动 COM 服务器(如果服务器尚未在运行)。 这些权限被定义为在注册表设置中指定的安全描述符。 访问权限控制调用正在运行的 COM 服务器的授权。 这些权限被定义为通过 CoInitializeSecurity API 或使用注册表设置提供给 COM 基础结构的安全描述符。 启动和访问权限都根据主体允许或拒绝访问,并且不区分调用方是服务器本地还是远程调用方。

第一项更改根据距离区分 COM 访问权限。 定义的两个距离是“本地”和“远程”。 本地 COM 消息通过本地远程过程调用 (LRPC) 协议到达,而远程 COM 消息通过远程过程调用 (RPC) 主机协议(例如传输控制协议 (TCP))到达。

COM 激活是通过调用 CoCreateInstance 或其变体之一在客户端上获取 COM 接口代理的行为。 作为此激活过程的副作用,有时必须启动 COM 服务器才能满足客户端的请求。 启动权限 ACL 断言可启动 COM 服务器的用户。 访问权限 ACL 断言 COM 服务器已在运行时可激活 COM 对象或调用该对象的用户。

第二个更改是调用和激活权限分开,以反映两个不同的操作,并将激活权限从访问权限 ACL 移到启动权限 ACL。 由于激活和启动都与获取接口指针相关,因此激活和启动访问权限在逻辑上都属于一个 ACL。 而且,由于始终通过配置指定启动权限(与通常以编程方式指定的访问权限相比),因此将激活权限置于启动权限 ACL 中时,将让管理员可控制激活。

启动权限访问控制条目 (ACE) 分为四个访问权限:

  • 本地启动 (LL)
  • 远程启动 (RL)
  • 本地激活 (LA)
  • 远程激活 (RA)

访问权限安全描述符被拆分为两种访问权限:

  • 本地访问调用 (LC)
  • 远程访问调用 (RC)

这允许管理员应用非常具体的安全配置。 例如,可以配置 COM 服务器,以便它接受来自每个人的本地访问调用,同时仅接受来自管理员的远程访问调用。 可以通过对 COM 权限安全描述符进行更改来指定这些区别。

为什么此更改很重要? 它有助于缓解哪些威胁?

早期版本的 COM 服务器应用程序无法限制应用程序,因此只能在本地使用,而无需通过 DCOM 在网络上公开应用程序。 当用户有权访问 COM 服务器应用程序时,他们就拥有本地和远程使用的访问权限。

COM 服务器应用程序可能会向未经身份验证的用户公开自己,以实现 COM 回调方案。 在此方案中,应用程序还必须将其激活公开给未经身份验证的用户,这可能并非理想情况。

精确的 COM 权限使管理员能够灵活地控制计算机的 COM 权限策略。 这些权限会为描述的方案启用安全性。

工作原理的不同之处是什么? 是否有依赖关系?

为了提供向后兼容性,将解释现有的 COM 安全描述符,以同时允许或拒绝本地和远程访问。 也就是说,访问控制条目 (ACE) 同时允许本地和远程,或者同时拒绝本地和远程。

调用或启动权限没有向后兼容性问题。 但是,存在激活权限兼容性问题。 如果在 COM 服务器的现有安全描述符中,配置的启动权限比访问权限更严格,并且比客户端激活方案所需的最低限制性更严格,则必须修改启动权限 ACL,才能为授权客户端提供适当的激活权限。

对于使用默认安全设置的 COM 应用程序,不存在任何兼容性问题。 对于使用 COM 激活动态启动的应用程序,大多数应用程序没有兼容性问题,因为启动权限必须已包含能够激活对象的任何人。 否则,当没有启动权限的调用方尝试激活对象并且 COM 服务器尚未在运行时,即使在应用 Windows XP SP2 或 Windows Server 2003 SP1 之前,此类应用程序也会导致激活失败。

最关心兼容性问题的应用程序是已通过某个其他机制(如 Windows 资源管理器或服务控制管理器)启动的 COM 应用程序。 还可以通过以前的 COM 激活来启动这些应用程序,该激活会覆盖默认访问和启动权限,并指定比调用权限更严格的启动权限。 有关解决此兼容性问题的更多详细信息,请参阅下一部分中的“我该如何解决这些问题?”。

如果将升级到 Windows XP SP2 或 Windows Server 2003 SP1 的系统回滚到早期状态,则已编辑以允许本地访问和/或远程访问的任何 ACE 都将被解释为允许本地和远程访问。 已编辑为拒绝本地访问和/或远程访问的任何 ACE 都被解释为拒绝本地访问和远程访问。 每当卸载 Service Pack 时,都应确保没有新设置的 ACE 导致应用程序停止工作。

我该如何解决这些问题?

如果实现 COM 服务器并覆盖默认安全设置,请确认特定于应用程序的启动权限 ACL 向相应用户授予激活权限。 如果没有这样做,则必须更改特定于应用程序的启动权限 ACL,以向相应用户授予激活权限,以便使用 DCOM 的应用程序和 Windows 组件不会失败。 这些特定于应用程序的启动权限存储在注册表中。

可以使用正常的安全函数创建或修改 COM ACL。

在 Windows XP Service Pack 2 中添加或更改了哪些设置?

注意

使用这些设置不当可能会导致使用 DCOM 的应用程序和 Windows 组件失败。

在下表中,使用以下缩写:

LL - 本地启动

LA - 本地激活

RL - 远程启动

RA - 远程激活

LC - 本地访问调用

RC - 远程访问调用

ACL - 访问控制列表

设置名 位置 之前的默认值 默认值 可能值
MachineLaunchRestriction
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
每个人 - LL、LA、RL、RA
匿名 -
LL、LA、RL、RA
(这是一个新的注册表项。根据现有行为,这些是有效值。)
管理员:LL、LA、RL、RA
ACL
MachineAccessRestriction
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
每个人 - LC、RC
匿名 - LC、RC
(这是一个新的注册表项。根据现有行为,这些是有效值。)
每个人:LC、RC
匿名:LC
ACL
CallFailureLoggingLevel
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
不适用。
此注册表项不存在;但是,缺少的键或值被解释为 2。
默认情况下不会记录此事件。 如果将此值更改为 1,以开始记录此信息来帮助排查问题,请务必监视事件日志的大小,因为这是会生成大量条目的事件。
1 - 在 COM 服务器进程中调用期间始终记录事件日志故障。
2 - 在调用服务器进程中调用期间从不记录事件日志故障。
InvalidSecurityDescriptorLoggingLevel
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
不适用。
此注册表项不存在;但是,缺少的键或值被解释为 1。
默认情况下会记录此事件。 它应很少发生。
1 - 当 COM 基础结构发现无效的安全描述符时,始终记录事件日志故障。
2 - 当 COM 基础结构发现无效的安全描述符时,从不记录事件日志故障。
DCOM:使用安全描述符定义语言 (SDDL) 语法的计算机启动限制
(组策略对象)计算机配置 \Windows 设置\本地策略\安全选项
不适用。
未定义
采用 SDDL 格式的访问控制列表。 以前,此策略的存在会覆盖 MachineLaunchRestriction 中的值。
DCOM:使用安全描述符定义语言(SDDL)语法的计算机访问限制
(组策略对象)计算机配置 \Windows 设置 \本地策略\安全选项
不适用。
未定义
采用 SDDL 格式的访问控制列表。 以前,此策略的存在会覆盖 MachineAccessRestriction 中的值。

在 Windows Server 2003 Service Pack 1 中添加或更改了哪些设置?

注意

使用这些设置不当可能会导致使用 DCOM 的应用程序和 Windows 组件失败。

在下表中,使用以下缩写:

LL - 本地启动

LA - 本地激活

RL - 远程启动

RA - 远程激活

LC - 本地访问调用

RC - 远程访问调用

ACL - 访问控制列表

设置名 位置 之前的默认值 默认值 可能值
MachineLaunchRestriction
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
每个人:LL、LA、RL、RA
匿名:LL、LA、RL、RA
(这是一个新的注册表项。根据现有行为,这些将是有效值。)
管理员:LL、LA、RL、RA
每个人:LL、LA
分布式 COM 用户:LL、LA、RL、RA
ACL
MachineAccessRestriction
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
每个人:LC、RC
匿名:LC、RC
(这是一个新的注册表项。根据现有行为,这些将是有效值。)
每个人:LC、RC
匿名:LC、RC
ACL
CallFailureLoggingLevel
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
不适用。
此注册表项不存在;但是,缺少的键或值被解释为 2。
默认情况下不会记录此事件。 如果将此值更改为 1,以开始记录此信息来帮助排查问题,请务必监视事件日志的大小,因为这是会生成大量条目的事件。
1 - 当 COM 基础结构发现无效的安全描述符时,始终记录事件日志故障。
2 - 当 COM 基础结构发现无效的安全描述符时,从不记录事件日志故障。
InvalidSecurityDescriptorLoggingLevel
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole
不适用。
此注册表项不存在;但是,缺少的键或值被解释为 1。
默认情况下会记录此事件。 它应很少发生。
1 - 当 COM 基础结构发现无效的安全描述符时,始终记录事件日志故障。
2 - 当 COM 基础结构发现无效的安全描述符时,从不记录事件日志故障。
DCOM:使用安全描述符定义语言 (SDDL) 语法的计算机启动限制
(组策略对象)计算机配置 \Windows 设置 \本地策略\安全选项
不适用。
未定义。
采用 SDDL 格式的访问控制列表。 以前,此策略的存在会覆盖 MachineLaunchRestriction 中的值。
DCOM:使用安全描述符定义语言(SDDL)语法的计算机访问限制
(组策略对象)计算机配置 \Windows 设置 \本地策略\安全选项
不适用。
未定义。
采用 SDDL 格式的访问控制列表。 以前,此策略的存在会覆盖 MachineAccessRestriction 中的值。

COM 中的安全性