将PROCESS_DUP_HANDLE授予服务

问题描述 投票:2回答:1

背景

我有2个Windows服务(在WinServer2016上运行)通过共享内存进行通信。映射通过DuplicateHandle Windows API从一种服务传播到另一种服务(这是首选方法的原因)。

虽然服务在本地系统帐户下运行,但一切正常,但是如果我们在专用的Admin帐户下运行服务,则映射传递失败:OpenProcess报告访问被拒绝。

在ProcessExplorer中查看接收器进程的Properties / Security / Permissions / Advanced面板,我确实看到PROCESS_DUP_HANLDE允许用于本地系统,而不允许用于Admin组。如果使用CppCheckSD

转储进程的安全描述符,我将看到完全相同的结果
O:BAG:SYD:(A;;0x1fffff;;;SY)(A;;0x121411;;;BA)S:AI(ML;;NWNR;;;SI)

问题

我想向接收方进程添加一个ACE,以允许PROCESS_DUP_HANDLE应用于创建者帐户运行的任何进程(两个服务都使用同一帐户运行)。我想在创建服务时执行此操作。

[sc具有用于获取和设置服务的安全描述符(SD)的选项,但是我无法真正解释sc sdshow的结果:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

此DACL有4个条目(与上面的2个相比),并且管理组的权限比系统的权限大。

  • 对我来说,似乎进程SD!=服务SD,对吗?
  • sc设置的SD对应什么?
  • 我可以通过sc sdset添加所需的权限吗?
windows-services windows-security
1个回答
0
投票

进程SD和服务SD是不同的东西。前者定义了对进程的权限(PROCESS_DUP_HANDLE在其中)。服务SD为服务定义了一组不同的权限,例如启动,停止,查询状态(请参阅:Setting Windows service permissions)。因此,它告诉谁可以使用您的服务做什么。无法使用sc sdset修改过程SD。

使此位令人困惑的是,ACE条目中访问掩码位的解释取决于我们正在检查其SD的对象的类型。例如,对于进程,0x0040表示PROCESS_DUP_HANLDE,但对于服务(Access rights for Windows objects)则表示SERVICE_PAUSE_CONTINUE。

在那之上,MS将SDDL定义为SD的易读(duh!)表示形式。 SDDL将每个访问掩码位映射为文件系统相关权限的2个字母的缩写,并且它根本不反映依赖于对象的解释。这就是sc sdshow显示诸如LIST_CHILDREN(LC)或DELETE_TREE(DT)之类的权限的原因,这些权限在服务上下文中没有任何意义。

关于原始问题(使用DuplicateHandle API),我最终使用GetSecurityInfo / SetEntriesInAcl / SetSecurityInfo API向服务器用户添加了客户端进程的权限。

© www.soinside.com 2019 - 2024. All rights reserved.