警示:本文需要你懂点儿 “技术”。
修改一个对象(例如一个文件)的所有者看起来不是很复杂:你只需要调用 SetNamedSecurityInfo 并传入一个新的安全描述符就可以了,是的,就是这么简单。
难点在于,你如何到达这个调用时间点。(在这里,我要感谢 Windows 安全团队 John 的对于这篇文章中某些部分的纠正)
如果你拥有一个对象的 WRITE_OWNER 权限,则可以修改对象的所有者为你自己(或者令牌中具有 SE_GROUP_OWNER 属性的任意 SID),也就是说:你可以成为对象的所有者。
但是,你无法修改对象的所有者到其他人,也即:你无法将对象的所有者给到另外一个人。如果这样做,就可能允许你违反配额限制(quota restrictions)。
我们做一个思想实验:假设上面的做法是可行的,就是说,你可以将对象的所有权更改为其非成员的内容: 你的账户已达到其磁盘配额。这没有问题,你只需找到一个没有超过配额的人(比如会计部门的弗雷德),然后拿走你的一些最大的文件,并将其所有者设置为弗雷德。
这导致磁盘空间被赋予给它的新主人弗雷德,弗雷德甚至不知道它已经发生在他身上。
如果你将文件放在弗雷德无权访问的目录中,可怜的弗雷德将开始收到”你已超出磁盘配额”消息,并且无法找到你放在这个目录中的这个邪恶文件。
这就像偷别人的借书证并用它借书一样。
为了将所有者设置为其他人,你需要使用 SeRestorePrivilege,默认情况下,该权限分配给管理员和备份操作员。备份操作员需要能够将所有者设置为其他人,因为还原其安全描述符是从备份还原文件的过程的重要组成部分。
但是 SeTakeOwnershipPrivilege 呢?该权限分配给管理员,它允许你像 WRITE_OWNER 访问(但不是 SeRestorePrivilege)一样行事。使用 SeTakeOwnershipPrivilege,你可以获得任何文件的所有权,但不能将其分配给其他人。
然后是神秘的 CREATOR_OWNER SID,在微软知识库文章以及 Larry Osterman 的博客文章中都有描述。要记住的重要一点是,在创建对象后向对象授予 CREATOR_OWNER SID 实际上不会向创建者或所有者授予任何权限,如需获取更多详细信息,请查看相关文章内容。
总结
在日常使用 Windows 的过程中,我们所触摸用户界面只是冰山上的一角。
水下的是各种庞然大物:虚存,对象管理,安全引用监视器,文件管理,进线程管理。
一个有追求的技术人,需要潜入水下,探寻那里隐藏的秘密。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What are the access rights and privileges that control changing ownership of an object?》