POSIX permission mapping to Windows DACL(2)

上篇是通过修改文件的安全信息来实现。那么首先一个坑就是,如果文件本身没有写权限,麻烦就大了。虽然可以通过修改DCAL权限得到写权限,根据“代码多就是bug多”的原则,很容易夜长梦多,节外生枝。所以要在创建文件时直接指定权限。

总的过程:先喘一口气,然后根据sid和对应的权限创建Explicit Access,根据Explicit Access创建ACL,用ACL创建security descriptor,用security descriptor创建security attributes ,现在可以用security attributes 进行createfile了。有没有感受到Windows深深的恶意?

回过头来咱们细聊。

上篇中的CREATOR并不是posix中的owner。根据https://docs.microsoft.com/en-us/windows/win32/secauthz/searching-for-a-sid-in-an-access-token-in-c–,可以创建一个token来得到TokenOwner和TokenPrimaryGroup,进一步可以得到Owner和PrimaryGroup的sid。

再说权限的转换。根据https://docs.microsoft.com/en-us/windows/win32/secauthz/dacls-and-aces,若把GRP比OWN多权限,或者OTH比GRP多权限称为exception的话,只能支持最多一个exception:不管deny和grant是按什么顺序添加,最终的结果都是deny添加在前,grant添加在后,这样的话只能处理一个例外。总之,Windows最多能处理一个有效的deny。

所以Windows支持的文件权限组合很多,但是没有办法实现posix的某些特定组合(如0421)。理解了这个问题,就可以给感叹“全世界有三十多亿的异性,却没有一个合适的她/他”的文艺青年开导人生了。

由于OTH的deny并无实际意义–OTH作为最大的GROUP,显式的grant不会给不存在的后续GROUP添加不必要的权限。因此最后创建ea的时候,最多只会有一个deny。

刚才说的是创建文件,若是创建文件夹略有区别:后续在文件夹内创建文件涉及到继承,没有设置好的话,文件夹是能够创建成功,后续使用就有麻烦了。

这里我们再根据“少既是多”的原则,先CreateDirectoryW生成一个文件夹(继承权限全弄好了),再根据RWX进行修改,任务完美完成。

全文完。代码是更好的注释。

 

This entry was posted in tittle tattle. Bookmark the permalink.

2 Responses to POSIX permission mapping to Windows DACL(2)

  1. Yi Cheng says:

    很厉害啊!写了这么多blog

Leave a Reply

Your email address will not be published. Required fields are marked *