[#] Баг в CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback
habrabot(difrex,1) — All
2015-01-30 13:35:21


Добрый день! Надеюсь, я уже завоевал на Хабре достижение «узнал автора по заголовку» -) Однако сегодня речь пойдет о свежей, еще не закрытой уязвимости в .Net, на которую меня навел своей мыслью один человек (кто подкинет ему инвайт?), который написал мне на почту:

> Вы пытались IL кодом приводить объекты к строковому типу и передавать в другие домены?

Сначала я его не понял, но потом родился пример кода, который пробрасывает любой объект типа, находящегося в SharedDomain в песочницу и позволяет использовать его методы БЕЗ маршаллинга. Дырой, с одной стороны это назвать достаточно сложно, т.к. почву для этого должен подготовить хост. И не самым обычным способом, надо заметить. Но с другой стороны… Да, это ![][1] . Первое, что нам понадобится — это ставшие обыденностью, методы EntityPtr.ToPointer() и \*.ToInstance() из [![][2] DotNetEx][3]. Их комбинация заставляет приводить объект к несовместимому типу. Т.е. к тому типу, которым он не является:



Естественно, если вызвать любой метод у такой «строки», ничего не получится: вылетит Exception (кроме виртуальных методов от object — их позиции в таблице вирт методов совпадут с переопределенными в нашем типе и вызов произойдет корректно) Однако, поскольку строка является уже сериализованным объектом, то при маршаллинге она передается по ссылке, без копирования. Это значит, что мы можем прокинуть ее в метод, код которого выполняется в «песочнице» и там, внутри, сделать кастинг обратно в тип. [Читать дальше →][4]

[1]: //habrastorage.org/files/06d/302/e4f/06d302e4f18d4fb88b7051f17b212c13.png
[2]: //habrastorage.org/files/979/38e/df1/97938edf1170406c842b0613d0c84ae9.png
[3]: https://github.com/mumusan/dotnetex
[4]: http://habrahabr.ru/post/249135/#habracut