Подтвердить что ты не робот

Безопасно ли вызывать Type.GetType с именем ненадежного типа?

В обзоре кода я встретил следующее:

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

typeName берется из запроса AJAX и не проверяется. Означает ли это какие-либо потенциальные проблемы с безопасностью? Например, возможно ли выполнение неожиданного кода или для всего приложение для сбоя (отказ в обслуживании), в результате загрузки произвольных типов из произвольных сборок?

(Я полагаю, что какой-нибудь джокер может попытаться исчерпать доступную память, загружая каждый тип из каждой сборки в GAC. Что-нибудь хуже?)

Примечания:

  • Это приложение ASP.NET, работающее под полным доверием.
  • Полученный type используется только как показано выше. Не пытайтесь создать экземпляр типа.
4b9b3361

Ответ 1

Нет, это совсем не безопасно. Type.GetType загрузит сборку, если она не была загружена до:

GetType вызывает загрузку сборки, указанной в typeName.

Так что же плохо с загрузкой сборки? Помимо этого, используя дополнительную память, как отмечает Дэниел, сборки .NET могут выполнять код при загрузке, хотя эта функциональность не распространяется на обычные компиляторы, такие как С# и VB.NET. Они называются инициализаторы модулей.

Метод инициализации модулей выполняется в или когда-либо раньше, первым доступом к любым типам, методам или данным, определенным в модуле

Просто тот факт, что вы загружаете сборку и проверяете ее типы, достаточно, чтобы запустить инициализатор модуля.

Кто-то, у которого есть умная письменная сборка (скажем, используя ilasm и записывая сырую MSIL), может выполнить код, просто загрузив сборку и исследуя типы. Вот почему мы Assembly.ReflectionOnlyLoad, чтобы мы могли безопасно загрузить сборку в неиспользуемой среде.


Я немного подумал об этом и подумал о нескольких случаях.

Учтите, что ваш пул приложений настроен на запуск 64-разрядной версии. Теперь представьте, что ваш злоумышленник использует службу AJAX, чтобы попытаться загрузить сборку, предназначенную исключительно для архитектуры x86. Например, в моем GAC есть один экземпляр Microsoft.SqlServer.Replication, который только x86, нет антикоммутатора AMD64. Если я попрошу вашу службу загрузить эту сборку, вы получите BadImageFormatException. В зависимости от того, какие защитные предложения у вас есть при загрузке сборки, необработанные исключения могут полностью сбивать ваш AppPool.

Ответ 2

Он может потенциально съесть память, если библиотеки не находятся в памяти.

У меня был бы Dictionary<string, Type> как разрешенный список.

var whitelist = new Dictionary<string, Type>;
whitelist.Add("MyType", typeof(MyType));

Ответ 3

Не существует наследуемой опасности при обращении к самому типу. Доверие к .NET находится на уровне сборки. Если нет доступной сборки, содержащей указанный тип, ваш вызов просто вернет нуль. Соответственно, кто-то должен сделать сборку доступной для кода - сборки не просто появляются из воздуха.