gpt4 book ai didi

c# - 是否有可能诱使此 WindowsIdentity 代码使用错误的用户?

转载 作者:IT王子 更新时间:2023-10-29 04:28:04 28 4
gpt4 key购买 nike

TL;DR WindowsIdentityToken 属性中是否包含用户 token (例如,someIdentity.Token) 被欺骗:

var validated = new WindowsIdentity(someIdentity.Token);

...将返回一个实例,该实例声称代表一个用户,该用户实际上尚未通过身份验证,但已将 IsAuthenticated 设置为 true,有效 .Name.User 属性等等?

下面我对此做了一些限制;大概不可能完全防欺骗。


完整的故事:

this answer , Damien_The_Unbeliever巧妙地证明了我的某些代码可能会被欺骗,使其相信它在 WindowsIdentity 实例中拥有经过身份验证的有效用户,而实际上它并没有。长话短说,我的代码假设如果 Thread.CurrentPrincipal.IdentityWindowsIdentity 的实例并且 IsAuthorizedtrue,它代表一个经过身份验证的用户,我可以依赖 .User 中的 SID:

WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;

if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
// ...use and trust the SID in identity.User, the
// username in identity.Name, etc....
}

(此代码使用线程而不是 WindowsIdentity.GetCurrent() 是有原因的。)

他用来欺骗的代码(稍作修改):

var ident = WindowsIdentity.GetCurrent();
Thread.CurrentPrincipal = new WindowsPrincipal(ident);
var fakeSid = new SecurityIdentifier("S-1-3-0"/* E.g., some SID you want to trick me into believing is the real user */);
typeof(WindowsIdentity).GetField("m_user", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(ident, fakeSid);

果然,如果你这样做然后调用我上面的代码,我的代码就会被愚弄。感谢达米安。

因此,以真正的军备竞赛方式,这是我修改后的代码,可以捕捉到恶搞并予以否认:

WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;

if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) {
var validated = new WindowsIdentity(identity.Token);
if (!validated.User.Equals(identity.User) || !validated.IsAuthenticated || validated.IsAnonymous) {
// Something fishy is going on, don't trust it
} else {
// Good! Use the validated one
identity = validated;
// ...use and trust the SID in identity.User, the
// username in identity.Name, etc....
}
}

如您所见,它从提供的身份中获取 Token 并使用该 token 创建一个 WindowsIdentity 实例。如果身份的 SID 匹配,我们将继续,并信任经过验证的身份。 (documentation for WindowsIdentity(IntPtr token) 表示 IsAuthenticated 的初始值将为 false,但假设我使用有效的用户 token 创建它,这在我的测试中是完全错误的。)

我认为可能被欺骗的唯一方法是使用欺骗性的用户 token ,该 token 仍然通过了 Windows 对其进行的验证。这对我来说似乎不太可能。但是,这对我来说是一个无知的领域。


边界:

我应该指出,我只是在尽我的努力,争取达到合理程度的单点登录安全性。如果恶意应用程序已成功开始拦截系统调用/破坏 Windows 本身,那么我对此无能为力。正如 Damien 在对另一个问题的评论中指出的那样,他可能会构建一个完全忽略强命名的主机容器(因此可以给我一个完全伪造的 WindowsIdentity 类型)。很公平。完美杀人。我只是不想像 Damien 善意示范的那样敞开大门。如果我发布了一个系统并且很容易在现场被黑客入侵,我会为此感到非常尴尬。 :-)

最佳答案

为了证明这是可行的,让我们使用一个名为“Microsoft Fakes”的很酷的 Visual Studio 插件(这个名字本身意义重大……)。

Fakes 本身与 Visual Studio 的测试功能相关联,但它将证明这一点。您可以按照标准教程设置项目,并为系统添加假程序集(实际上是 mscorlib + 系统)

这是您在库项目中的代码(我在所有地方都使用了异常,因为它在测试条件下更容易...)。

namespace ClassLibrary1
{
public class Class1
{
public static void MyCheck()
{
WindowsIdentity identity = Thread.CurrentPrincipal == null
? null
: Thread.CurrentPrincipal.Identity as WindowsIdentity;

if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous)
{
var validated = new WindowsIdentity(identity.Token);
if (!validated.User.Equals(identity.User) || !validated.IsAuthenticated || validated.IsAnonymous)
throw new Exception("Something fishy is going on, don't trust it");
else
throw new Exception("Good! Use the validated one. name is:" + validated.Name);
}
else
throw new Exception("not in");
}
}
}

这是测试项目中的测试代码:

namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
System.Security.Principal.Fakes.ShimWindowsIdentity.AllInstances.NameGet = (i) =>
{
return "Simon the hacker";
};

WindowsIdentity wi = WindowsIdentity.GetCurrent(); // this is the real one "Simon".
Thread.CurrentPrincipal = new WindowsPrincipal(wi);

Class1.MyCheck();
}
}
}
}

这是 Visual Studio 中的项目布局:

enter image description here

还要确保修改自动生成的 mscorlib.fakes 文件,如下所示:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true" TargetFrameworkVersion="v4.6">
<Assembly Name="mscorlib" />
<ShimGeneration>
<Clear />
<Add Namespace="System.Security.Principal" />
</ShimGeneration>
</Fakes>

这意味着我想要填充整个 System.Security.Principal 命名空间,我建议您对这两个项目使用框架 4.6 并添加相应的 TargetFrameworkVersion 属性。

现在,当您运行测试时,您将看到:

enter image description here

好吧,在你的特定场景下,我可能无法使用假货,但它所依赖的底层技术只是重新路由了所有的API(它比.NET更低,实际上它被称为Detours)我相信并允许所有这些骇客。

总结一下:如果它在我的机器上运行,我可以破解它(除非我没有物理访问我的机器)。

关于c# - 是否有可能诱使此 WindowsIdentity 代码使用错误的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573773/

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