gpt4 book ai didi

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

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

我在代码审查中遇到了以下问题:

Type type = Type.GetType(typeName);
if (type == typeof(SomeKnownType))
DoSomething(...); // does not use type or typeName

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

(我想有些 clown 可能会尝试通过加载 GAC 中每个程序集中的每个类型来耗尽可用内存。还有更糟糕的情况吗?)

注意事项:

  • 这是一个在完全信任下运行的 ASP.NET 应用程序。
  • 生成的 type 如上所示使用。不尝试实例化该类型。

最佳答案

不,这根本不安全。 Type.GetType将加载一个程序集,如果它之前没有被加载:

GetType causes loading of the assembly specified in typeName.

那么加载程序集有什么问题呢?除了像 Daniel 指出的那样使用额外的内存之外,.NET 程序集可以在加载时执行代码,即使此功能未向 C# 和 VB.NET 等普通编译器公开。这些被称为 module initializers .

The module’s initializer method is executed at, or sometime before, first access to any types, methods, or data defined in the module

只需加载程序集并检查其类型就足以让模块初始化程序运行。

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


我对此做了更多的思考,并想到了更多的案例。

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

关于c# - 使用不受信任的类型名称调用 Type.GetType 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23895563/

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