- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
TL;DR WindowsIdentity
的 Token
属性中是否包含用户 token (例如,someIdentity.Token
) 被欺骗:
var validated = new WindowsIdentity(someIdentity.Token);
...将返回一个实例,该实例声称代表一个用户,该用户实际上尚未通过身份验证,但已将 IsAuthenticated
设置为 true
,有效 .Name
和.User
属性等等?
下面我对此做了一些限制;大概不可能完全防欺骗。
完整的故事:
在this answer , Damien_The_Unbeliever巧妙地证明了我的某些代码可能会被欺骗,使其相信它在 WindowsIdentity
实例中拥有经过身份验证的有效用户,而实际上它并没有。长话短说,我的代码假设如果 Thread.CurrentPrincipal.Identity
是 WindowsIdentity
的实例并且 IsAuthorized
是 true
,它代表一个经过身份验证的用户,我可以依赖 .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 中的项目布局:
还要确保修改自动生成的 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 属性。
现在,当您运行测试时,您将看到:
好吧,在你的特定场景下,我可能无法使用假货,但它所依赖的底层技术只是重新路由了所有的API(它比.NET更低,实际上它被称为Detours)我相信并允许所有这些骇客。
总结一下:如果它在我的机器上运行,我可以破解它(除非我没有物理访问我的机器)。
关于c# - 是否有可能诱使此 WindowsIdentity 代码使用错误的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573773/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!