Вразливість CLR: як затягнути об'єкт в пісочницю без маршаллинга і викликати Callback

Добрий день! Сподіваюся я вже завоював на Хабре досягнення «дізнався автора по заголовку» -) Проте сьогодні мова піде про свіжою, ще не закритій уразливості .Net, на яку мене навів своєю думкою одна людина (хто підкине йому інвайт?), який написав мені на пошту:

Ви намагалися IL кодом приводити об'єкти до строковому типу і передавати в інші домени?


Спочатку я його не зрозумів, але потім народився приклад коду, який прокидає будь-який об'єкт, що знаходиться в SharedDomain в пісочницю і дозволяє використовувати його методи БЕЗ маршаллинга.

Дірою, з одного боку це назвати досить складно, тому що грунт для цього повинен підготувати хост. І не самим звичайним способом, треба помітити. Але з іншого боку… Так, це баг.

Перше, що нам знадобиться — це стали буденністю, методи EntityPtr.ToPointer ()*.ToInstance() з DotNetEx. Їх комбінація змушує приводити об'єкт до несумісного типу. Тобто до того типу, яким він не є:
string str = EntityPtr.ToInstance<string>(EntityPtr.ToPointer(new List<int>()));

Природно, якщо викликати будь-який метод у такий «рядки», нічого не вийде: вилетить Exception (крім віртуальних методів від object — їх позиції в таблиці вірт методів співпадуть з переопределенными в нашому тип і виклик відбудеться коректно)

Однак, оскільки рядок є вже сериализованным об'єктом, то при маршаллинге вона передається за посиланням, без копіювання. Це означає, що ми можемо прокинути її в метод, код якого виконується в «пісочниці» і там, всередині, зробити кастинг назад в тип.

Читати далі →