- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 Unix 中,当代表某个用户执行某些操作时,系统程序通常调用 seteuid(UID)(附带 setegid())首先切换到该用户,执行该操作,并在完成时切换回 super 用户使用 seteuid(0)。我对 seteuid() 计时,它的时间大约为一到几微秒(这意味着,相对于需要完成的操作(如操作文件或运行 CGI 程序),它非常便宜)。
我不熟悉 Windows API。我们是否在 Windows 上做同样的事情(但使用 ImpersonateLoggedOnUser() + RevertToSelf() API 函数)?一般来说,这些功能有多快?
最佳答案
它大部分是相同的,但要记住一个重要的区别:您提到的 Windows API 需要一个有效 token 的句柄。
换句话说,即使以 SYSTEM 身份运行(或任何具有 SeTcbPrivilege 的进程),您也需要模拟一个登录用户。
用户可以通过多种方式登录:
在大多数情况下,创建进程将使其继承当前 token 。
无论您在 IIS 中使用 Kerberos、NTLM 还是 HTTP BASIC 身份验证都无关紧要。它全部由 Windows 进行身份验证,因此您将获得一个 token 。另一方面,Tomcat 中的 HTTP BASIC 身份验证不会为您提供 Windows token ,因此无法进行模拟。
现在是棘手的部分。
仔细想想, token 实际上只是一个内存结构,带有用于授权 (DACL) 和审计 (SACL) 的访问控制列表。它是由 Authentication Package 创建的(美联社)。它是创建 token 的 AP。有点像 Unix 中的 PAM,AP 可以用自定义代码代替。
事实上,开源的setuid Authentication Package是存在的。将 CVS 移植到 Windows NT 的人们完成了编写 AP 的工作 creates a token out of thin air ,只要您拥有 SeTcbPrivilege(相当于 root)。我从未尝试过,但它可以在本地机器上为不存在的用户提供 token 。该代码相当旧(它只会创建提升的 token )但除此之外,它是 LGTM。不涉及身份验证、密码或智能卡,因此使用该 token 运行的进程将无法使用它来对另一台计算机进行身份验证。
总结:
一个建议:我的Programming Windows Security的副本全是咖啡的黄色,上面挂着便利贴和撕破的纸页。关于该主题的最佳文本,如果您想了解 Windows 安全性,则必须阅读。
关于windows - Windows 的 ImpersonateLoggedOnUser() + RevertToSelf() 与 Unix 的 seteuid() + setegid() 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299455/
晚上好我正在尝试用 C 编写一个 suid-root 二进制文件,但我偶然发现了以下问题:我以非特权用户 user1 的身份执行它,我可以使用 setuid/seteuid 更改为我想要的任何用户 I
在 Unix 中,当代表某个用户执行某些操作时,系统程序通常调用 seteuid(UID)(附带 setegid())首先切换到该用户,执行该操作,并在完成时切换回 super 用户使用 seteui
我是一名优秀的程序员,十分优秀!