使用不受信任的类型名称调用Type.GetType是否安全?

Mic*_*Liu 28 .net c# asp.net security

我在代码审查中遇到了以下内容:

Type type = Type.GetType(typeName);
if (type == typeof(SomeKnownType))
    DoSomething(...); // does not use type or typeName
Run Code Online (Sandbox Code Playgroud)

typeName源自AJAX请求,未经过验证.这是否会带来任何潜在的安全问题?例如,作为从任意程序集加载任意类型的结果,是否可能执行意外代码,或整个应用程序崩溃(拒绝服务)?

(我想一些小丑可能会尝试通过加载GAC中每个程序集的每种类型来耗尽可用内存.更糟糕的是什么?)

笔记:

  • 这是在完全信任下运行的ASP.NET应用程序.
  • 将所得的type使用如上所示.没有尝试实例化该类型.

vcs*_*nes 19

不,这根本不安全.如果尚未加载程序集,Type.GetType将加载程序集:

GetType导致加载typeName中指定的程序集.

那么装载组件有什么问题呢?除了使用额外的内存,Daniel指出,.NET程序集在加载时可以执行代码,即使这些功能没有暴露给像C#和VB.NET这样的普通编译器.这些被称为模块初始化器.

模块的初始化方法在首次访问模块中定义的任何类型,方法或数据之前或之前执行

您正在加载程序集并检查其类型,这足以让模块初始化程序运行.

有一个巧妙编写的程序集(比如通过使用ilasm和编写原始MSIL)的人只需加载程序集并检查类型就可以执行代码.这就是我们有Assembly.ReflectionOnlyLoad的原因,因此我们可以安全地在不可执行的环境中加载程序集.


我做了一些更多的思考,并考虑了几个案例.

请考虑将应用程序池设置为运行64位.现在假设您的攻击者使用AJAX服务尝试加载仅严格用于x86体系结构的程序集.例如,我的GAC中有一个名为Microsoft.SqlServer.Replication,仅为x86,没有AMD64对应部分.如果我要求你的服务加载该程序集,你会得到一个BadImageFormatException.根据您在加载程序集时所使用的保护条款,未处理的异常可能会完全降低您的AppPool.