gpt4 book ai didi

c# - System.Security.Principal.WindowsIdentity 的这种使用是否合理安全?

转载 作者:可可西里 更新时间:2023-11-01 07:47:04 25 4
gpt4 key购买 nike

System.Security.Principal.WindowsIdentity 合理地避免被黑客攻击,这样我从 Thread.CurrentPrincipal 得到的一个实例的 IdentityWindowsIdentity.GetCurrent()其中 trueIsAuthenticated 提供了我的程序集虚假身份信息?当然,没有什么是完全防篡改的,但考虑到 Microsoft 对 .Net 的 promise 和依赖,我预计像这样的关键 API 将被严格锁定并且难以篡改。这对我来说是一个有效的假设吗?

我的目标是在我的程序集中提供合理的最佳实践 SSO。如果 Windows 本身受到损害,那是我无法控制的,但如果(例如)与我的程序集链接的应用程序向我提供虚假信息是一件简单的事情,那将是我未能尽职调查的责任。这对我来说是一个很大的无知领域。

需要明确的是,我正在寻找可靠的信息,而不是即兴的意见。因此,发布了漏洞利用程序,或演示了以欺骗我的代码的方式使用 WindowsIdentity 构造函数等。或者在“这是一个有效的假设”方面,可靠的文章支持它,已知的用途依赖在上面,等等。我没有找到它们,但我已经将到目前为止发现的内容包括在下面的分隔符下。

下面是我打算如何使用 WindowsIdentity:

using System.Security.Principal;
using System.Threading;
// ...

// I only want Windows-authenticated users
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;
SecurityIdentifier sid;

// I can't imagine how an authenticated account would be anonymous, but...
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from thread identity
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
identity = WindowsIdentity.GetCurrent();
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// SSO success from current Windows user
sid = identity.User;
// ...check that that SID is allowed to use our system...
} else {
// SSO fail
}
}

这是一个 DLL 程序集 - 遗憾的是我们停留在 .Net 3.5 - 为可能受用户权限限制的资源提供公共(public) API。它可能用于桌面应用程序,或用于具有 Windows 身份验证的 ASP.Net IIS 应用程序(ASP.Net 在使用 Windows 时在 Thread.CurrentPrincipal.Identity 上设置一个 WindowsIdentity 实例auth;我们目前不支持其他类型的 IIS 身份验证)。

我是否可以合理地相信来自那些声称已通过身份验证的来源的 WindowsIdentity 实例的 SID?

直到 this question 之前,我都没有想过这是否可以(doh!)用户 lc.引起了人们的担忧,即程序集很容易被与其链接并“伪造”该信息的恶意应用程序所欺骗。不过,他没有任何具体证据可以说明为什么这可能是一个重大问题,因此提出了这个问题。


到目前为止我发现了什么(小):

  • This answer提出 claim

    You can trust that the current WindowsIdentity is who it says it is, insofar as you can trust any given piece of data in your application.

  • 这本书 Hacking the Code声称 ASP.Net 要求在进行文件授权检查时将 WindowsIdentity 与请求相关联,如果为真,这似乎是微软至少认为它足够好的一个相当坚实的基础。

  • 我可以找到很多示例,人们在他们的代码中愉快地使用 WindowsIdentity 信息,但他们中的大多数人不会问他们是否安全的问题。有一个暗示,但是......

最佳答案

您不能相信来自 Thread.CurrentPrincipal 的那个,不。没有什么可以阻止以完全信任的方式运行的代码进行欺骗。

我能够像这样在我的环境中欺骗它:

var admin = new WindowsIdentity(@"Administrator");
var princ = new WindowsPrincipal(admin);
System.Threading.Thread.CurrentPrincipal = princ;

...在调用您的代码之前。在我的机器上,创建的 WindowsIdentity 对象的 IsAuthenticatedtrueIsAnonymous false,所以,当然,您的代码提取我的域管理员的 SID。

这并不适用于所有环境,但只要运行代码有足够的权限使用反射,就应该可以:

var ident = WindowsIdentity.GetCurrent();
Thread.CurrentPrincipal = new WindowsPrincipal(ident);
var userSid = ident.User;

var fakeSid = new SecurityIdentifier("S-1-3-0");

typeof (WindowsIdentity).GetField("m_user",
BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ident, fakeSid);

(同样,在调用您的代码之前完成。)


基本上,没有什么可以阻止同一进程中在完全信任下运行的两段代码相互欺骗。

关于c# - System.Security.Principal.WindowsIdentity 的这种使用是否合理安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com