Уязвимость CLR: как затащить объект в песочницу без маршаллинга и вызвать Callback
Добрый день! Надеюсь, я уже завоевал на Хабре достижение «узнал автора по заголовку» -) Однако сегодня речь пойдет о свежей, еще не закрытой уязвимости в .Net, на которую меня навел своей мыслью один человек (кто подкинет ему инвайт?), который написал мне на почту:
Вы пытались IL кодом приводить объекты к строковому типу и передавать в другие домены?
Сначала я его не понял, но потом родился пример кода, который пробрасывает любой объект типа, находящегося в SharedDomain в песочницу и позволяет использовать его методы БЕЗ маршаллинга.
Дырой, с одной стороны это назвать достаточно сложно, т.к. почву для этого должен подготовить хост. И не самым обычным способом, надо заметить. Но с другой стороны… Да, это баг.
Первое, что нам понадобится — это ставшие обыденностью, методы EntityPtr.ToPointer() и *.ToInstance() из DotNetEx. Их комбинация заставляет приводить объект к несовместимому типу. Т.е. к тому типу, которым он не является:
string str = EntityPtr.ToInstance(EntityPtr.ToPointer(new List()));
Естественно, если вызвать любой метод у такой «строки», ничего не получится: вылетит Exception (кроме виртуальных методов от object — их позиции в таблице вирт методов совпадут с переопределенными в нашем типе и вызов произойдет корректно)
Однако, поскольку строка является уже сериализованным объектом, то при маршаллинге она передается по ссылке, без копирования. Это значит, что мы можем прокинуть ее в метод, код которого выполняется в «песочнице» и там, внутри, сделать кастинг обратно в тип.
Читать дальше →
Вы пытались IL кодом приводить объекты к строковому типу и передавать в другие домены?
Сначала я его не понял, но потом родился пример кода, который пробрасывает любой объект типа, находящегося в SharedDomain в песочницу и позволяет использовать его методы БЕЗ маршаллинга.
Дырой, с одной стороны это назвать достаточно сложно, т.к. почву для этого должен подготовить хост. И не самым обычным способом, надо заметить. Но с другой стороны… Да, это баг.
Первое, что нам понадобится — это ставшие обыденностью, методы EntityPtr.ToPointer() и *.ToInstance() из
string str = EntityPtr.ToInstance(EntityPtr.ToPointer(new List()));
Естественно, если вызвать любой метод у такой «строки», ничего не получится: вылетит Exception (кроме виртуальных методов от object — их позиции в таблице вирт методов совпадут с переопределенными в нашем типе и вызов произойдет корректно)
Однако, поскольку строка является уже сериализованным объектом, то при маршаллинге она передается по ссылке, без копирования. Это значит, что мы можем прокинуть ее в метод, код которого выполняется в «песочнице» и там, внутри, сделать кастинг обратно в тип.
Читать дальше →
Источник: Хабрахабр
Похожие новости
- Топологический аудит ECDSA: Практическая реализация с минимальными входными данными
- Как подружить Bitwarden CLI с пайплайном деплоя
- Картель-i- Кофе: Флэш-краш, $50M и трейдер, который слишком хорошо знал рынок
- 9 вопросов, которые нужно задать себе, прежде чем сдать текст редактору
- Станислав Кондрашов: три простых слова, которые перепрограммируют ваш мозг на успех
- За год во ВКонтакте стало на 52% больше блогеров. Что с инфлюенс-маркетингом на площадке в 2025 году
- Что делать, если ваш слон думает, что он баг?
- Как не потерять свои контейнеры у себя в инфраструктуре?
- Киберугрозы в первом полугодии 2025 года: анализ векторов атак на облачные и гибридные инфраструктуры
- Лицо, голос и тело по-датски