Windows手柄安全机制

假设系统中有两个流程:流程A得等待流程B完成某些特定工作后才能继续执行。窗口提供的事件机制让流程B完成工作后可以发出讯号通知流程A,而流程A则进入等待状态直到进程间立即定好沟通的事件名称就可以轻松达成跨程序间的通讯(进程间通信:IPC),正因为简单好实现的特性,事件常被用在程序间的沟通与同步。

由于Windows创建了事件的全局事件,因此所有人都可以通过进程explorer(类似进阶工作管理员的工具)看到每个进程底下所拥有的事件及相关信息(句柄,事件名称,… )。而言而言,当外部透过这类工具看到程序之间进行沟通的事件,若没有任何的权限设定,就可以在外部重新开启,设定,甚至是关闭这个事件。以便避免使用者的外部操作导致程序产生预期的外部结果,我们得对事件做一些保护机制。

这篇文章想记录的保护机制有两种:

  • 避免事件被关闭
  • 设定事件存取权限

当设定好物件的保护机制后必须同时也设定好存取权限,才能避免物件的权限重新被外部程式修改。

[避免事件被关闭]
event是透过handle对事件物件做操作,窗口提供setHandleInformation()让我们可以设定handle的旗标达到简单的保护机制,避免外部将handle关闭间接导致程式中的事件被关闭。

安全描述符定义语言(SDDL)是窗口使用的设置DACL的一种语法,定义包含在安全描述符内部的消息字串。 ACE)字串,用于区隔不同使用者该授予的权限设定。

  D:dacl_flags(字串ace1)(字串ace2)...(字串acen) 

dacl_flags由0个或多个串联包含的标志串接组成:

ACE字串则由以下6个栏位组成,每个栏位以分号(;)做区隔

  • ACE类型
  • ACE标志
  • 权限
  • 对象类型(GUID)
  • 继承类型(GUID)
  • 受托人(SID)
  (ACE_Type; ACE_falgs; Permissions; Object_type; Inherited_type; SID) 

以下表格列出ACE栏位较常见的值与描述:

ACE类型
–指定存取要求是允许或拒绝

ACE标志
–指定ACE的继承选项

权限
–指定授予的权限,以两两字母表示的权限字串组成,可串接0或多个

对象类型,继承类型和受托者
–被授予存取权的使用者帐户或分组

底下范例简单的创建一个受保护的事件:

最后放上一篇我觉得讲的满详细的资讯连结:
http://www.selfadsi.org/deep-inside/ad-security-descriptors.htm