Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ivan Migalev  
#1 Оставлено : 28 января 2021 г. 16:32:44(UTC)
Ivan Migalev

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.01.2021(UTC)
Сообщений: 2
Российская Федерация

Добрый день. Я являюсь разработчиком из компании JetBrains.

К нам иногда обращаются пользователи наших продуктов, у которых возникают проблемы с ними при совместном использовании с КриптоПро .NET:

КриптоПро .NET инъектирует свои библиотеки достаточно рано в процессе жизненного цикла процессов, и этим ломает функциональность наших продуктов (в dotMemory не работает профилирование, в Rider ломается отладка модульных тестов).

На данный момент мы советуем пользователям отключать инъекцию CProDspr.dll через реестр, но очевидно, что это может негативно сказаться на основной функциональности КриптоПро. В итоге получается, что пользователь вынужден выбирать между работой с некоторыми нашими инструментами и работающим КриптоПро, что не подходит пользователям, которые разрабатывают или исследуют быстродействие своих программ, требующих КриптоПро.

В связи с этим — пара вопросов:
  1. Возможно ли рассмотреть добавление в КриптоПро каких-то исключений для наших процессов (что бы решило проблему с Rider), или вообще пользовательского фильтра (чтобы пользователи могли отфильтровать и свои процессы тоже — во всяком случае, те, в которых не нужна функциональность КриптоПро)?
  2. Возможно ли решить проблему так, чтобы не ломать наши инструменты? Техническая информация приведена в нашем багтрекере: на текущий момент мы подозреваем, что вся проблема состоит в том, что КриптоПро .NET выделяет память для управляемых объектов в потоке с preemptive GC, и этим ломает некоторые API, используемые для профилирования и отладки.
Offline Максим Коллегин  
#2 Оставлено : 28 января 2021 г. 17:33:48(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,095
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 19 раз
Поблагодарили: 613 раз в 546 постах
Иван, добрый день, спасибо за ваше сообщение.
1. Исключать процессы можно через ветку реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProExclude, Название подключа любое. FileName - название исполняемого файла процесса.
2. Мы постараемся решить проблему, но нам очень бы помогла простая пошаговая инструкция или тестовый проект, который поможет локализовать несовместимость.
Знания в базе знаний, поддержка в техподдержке
Offline two_oceans  
#3 Оставлено : 2 февраля 2021 г. 6:25:05(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Добрый день.
Кажется, был еще какой-то обход для профилировщиков.
Offline Максим Коллегин  
#4 Оставлено : 2 февраля 2021 г. 9:42:51(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,095
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 19 раз
Поблагодарили: 613 раз в 546 постах
Речь про эту https://github.com/lucasg/Dependencies?
Или про ключи профилировки у depends?
Если второе, то оно скорее всего делает то же, что и наши перехватчики - подменяет точку входа библиотеки. Вместе существовать они не смогут, думаю.

Отредактировано пользователем 2 февраля 2021 г. 9:45:22(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Ivan Migalev  
#5 Оставлено : 5 февраля 2021 г. 10:53:19(UTC)
Ivan Migalev

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.01.2021(UTC)
Сообщений: 2
Российская Федерация

Максим, добрый день. Спасибо за ваш ответ!

На данный момент мы снова подняли исследование по этому вопросу, и в Rider пока что проблему не воспроизвели. Есть предположение, что новая версия Rider или КриптоПро стали работать по-другому, и поэтому теперь всё в порядке.

Мы продолжим опрашивать пользователей на предмет возможных проблем, и пока что пробуем воспроизвести в профилировщике dotMemory. Я обязательно сообщу о результатах.
Offline Anna.Guseva  
#6 Оставлено : 22 октября 2021 г. 13:44:37(UTC)
Anna.Guseva

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.10.2021(UTC)
Сообщений: 4
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Иван, добрый день, спасибо за ваше сообщение.
1. Исключать процессы можно через ветку реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProExclude, Название подключа любое. FileName - название исполняемого файла процесса.
2. Мы постараемся решить проблему, но нам очень бы помогла простая пошаговая инструкция или тестовый проект, который поможет локализовать несовместимость.


Добрый день!

Я работаю в команде профиляторов в компании JetBrains.
Я провела исследование взаимодействия последних версий CryptoPro c профилятором памяти dotMemory и выявила проблему в случае когда dotMemory собирает данные об аллокациях через profiling API. Внутри нашего профайлера происходит следующее:

1. Профайлер это Windows COM объект, который реализует интерфейс: https://docs.microsoft.c...ofilercallback-interface

2. После того как COM объект создан, происходит вызов: https://docs.microsoft.c...llback-initialize-method

3. В методе есть аргумент IUnknown, для которого делается cast в ICoreProfilerInfo и записывается в переменную, в нем для ICoreProfilerInfo вызывается https://docs.microsoft.c...info-seteventmask-method с флагами COR_PRF_MONITOR_OBJECT_ALLOCATED | COR_PRF_ENABLE_OBJECT_ALLOCATED
На этом метод инициализации профайлера завершается.

4. После этого в профайлер должны начать приходить коллбэки https://docs.microsoft.c...k-objectallocated-method
В каждом коллбэке приходит параметр ObjectId и для каждого из них вызывается https://docs.microsoft.c...nfo-getobjectsize-method - на этом моменте происходит ошибка.

Как это воспроизвести в dotMemory:

- Установить КриптоПро CSP 5.0 (CSPSetup-5.0.12266)
- Установить КриптоПро .NET (NETSetup 1.0.7775.0 от 20.04.2021)
- Запуситить dotMemory UI версию. Я проверяла на последнем EAP, но разницы с релизом не должно быть.
- Создать "Standalone" конфигурацию в "New process run", выбрать .exe для профиляции. Тут есть некоторые нюансы, так как не на всех приложениях проблема воспроизводится, нужно более-менее сложное приложение, которое создает много разных объектов в памяти. У меня воспроизвелось на процессе Visual Studio (devenv.exe) и на процессе самого dotMemory, наш .exe можно найти в папке инсталляции, по умолчанию "%localappdata%\JetBrains\Installations\dotMemory<vN>\dotMemory.UI.64.exe". Можно попробовать и на других приложениях, я указала те с которыми я получила 100% вопроизведение.
- Включить полный режим сбора аллокаций: установить Collect allocation data -> Full если используется dotMemory 2021.3 и позднее, либо включить флаг "Collect memory allocation and traffic data from start" для dotMemory 2021.2 и ранее (в 2021.3 немного поменяли UI). Этот режим как раз соответствует описанному выше сбору аллокаций через profiling API.

- Нажать "Start" => проблема возникает сразу и выглядит следующим образом: кнопка "Get snapshot" недоступна, в правом верхнем углу мигает желтый треугольник, при его нажатии отображается ошибка ядра нашего профайлера.

Воркэраунд который мне помог:
- Добавить ключ в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProExclude с именем исполняемого файла в значении (devenv.exe в моем случае).
- Перезагрузить компьютер.

Ссылка на тикет от нашего пользователя: https://youtrack.jetbrains.com/issue/DMRY-6637
Ниже прикладываю скриншоты из интерфейса с настройкой конфигурации и самой ошибкой.

Core error.png (77kb) загружен 5 раз(а). Enable alloc.png (58kb) загружен 4 раз(а).
Offline Максим Коллегин  
#7 Оставлено : 22 октября 2021 г. 13:51:02(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,095
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 19 раз
Поблагодарили: 613 раз в 546 постах
Принято, спасибо, посмотрим. А какая версия MS .NET Framework?
Знания в базе знаний, поддержка в техподдержке
Offline Anna.Guseva  
#8 Оставлено : 22 октября 2021 г. 13:59:53(UTC)
Anna.Guseva

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.10.2021(UTC)
Сообщений: 4
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Принято, спасибо, посмотрим. А какая версия MS .NET Framework?



У самого dotMemory targetFramework 4.7.2, на машине стоит следующее:

Классический .NET Framework версии 4.8.04161

.NET SDK (reflecting any global.json):
Version: 5.0.402
Commit: e9d3381880

Runtime Environment:
OS Name: Windows
OS Version: 10.0.20348
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\5.0.402\

Host (useful for support):
Version: 5.0.11
Commit: f431858f8b

.NET SDKs installed:
5.0.402 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
Microsoft.AspNetCore.App 3.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.11 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Offline Максим Коллегин  
#9 Оставлено : 1 ноября 2021 г. 14:16:33(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,095
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 19 раз
Поблагодарили: 613 раз в 546 постах
Не вижу ничего подозрительного.
Попробуйте подключить ваших разработчиков, что конкретно не срабатывает?
Вот так можно включить отладочный вывод в КриптоПро .NET:
Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProPatches\NetDetStarter40\DebugInfo=0xFFFFFFFF
Знания в базе знаний, поддержка в техподдержке
Offline Anna.Guseva  
#10 Оставлено : 1 ноября 2021 г. 15:57:52(UTC)
Anna.Guseva

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.10.2021(UTC)
Сообщений: 4
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Не вижу ничего подозрительного.
Попробуйте подключить ваших разработчиков, что конкретно не срабатывает?
Вот так можно включить отладочный вывод в КриптоПро .NET:
Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProPatches\NetDetStarter40\DebugInfo=0xFFFFFFFF


Мы получаем 0x80131363 == CORPROF_E_UNSUPPORTED_CALL_SEQUENCE внутри коллбэка ICorProfilerCallback::ObjectAllocated() при совершенно легальном вызове ICorProfilerInfo::GetObjectSize() после установки CryptoPro. Без CryptoPro такой ошибки не происходит.

CORPROF_E_UNSUPPORTED_CALL_SEQUENCE - означает, что метод не может быть вызван внутри какого-либо коллбэка потому-что Microsoft Profiling API таким образом защищается от дэдлока при работе с профайлерами.

Есть подозрение, что к нам приходят коллбэки о выделениях памяти из мэнедж части CryptoPro, которая в свою очередь была принудительно инжектирована вашим драйвером в пользовательский процесс.

Вы можете легко повторить это в своем окружении, достаточно запустить профиляцию dotMemory на компьютере с установленным CryptoPro (инструкцию я писала выше).
Offline Максим Коллегин  
#11 Оставлено : 2 ноября 2021 г. 13:10:00(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,095
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 19 раз
Поблагодарили: 613 раз в 546 постах
Предположив, что это наши выделения памяти -- попробуйте их игнорировать.
Мы со своей стороны будем думать, что могло привести к такому поведению.
Знания в базе знаний, поддержка в техподдержке
Offline Anna.Guseva  
#12 Оставлено : 2 ноября 2021 г. 17:48:00(UTC)
Anna.Guseva

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.10.2021(UTC)
Сообщений: 4
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Предположив, что это наши выделения памяти -- попробуйте их игнорировать.
Мы со своей стороны будем думать, что могло привести к такому поведению.


Спасибо! Было бы отлично, если бы удалось исправить причину.

Если мы будем игнорировать объекты, которые вызывают подобные ошибки, у нас потеряется возможность обнаруживать такие проблемы, что довольно плохо. Кроме того, в этом случае для некоторых объектов в графе мы не найдем место где они выделились - это поломает работу части наших алгоритмов.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.