Ошибка DCOM ID 10036, решаем за минуту

ошибка

Добрый день! Уважаемые читатели IT блога Pyatilistnik.org, в прошлый раз мы с вами разобрали за, что отвечает библиотека vcruntime140.dll и на сколько она важна для работы многих программ. Сегодня я хочу вам рассказать, об интересном случае, когда специализированный софт может не получить доступ к удаленному компьютеры по RPC протоколу из-за новых политик безопасности DCOM. В логах будет фигурировать событие об ошибке DCOM ID 10036 "политика уровня проверки подлинности на стороне сервера не разрешает пользователю". Давайте смотреть в чем дело.

❌Описание ошибки DCOM ID 10036 (EOleException)

Обратился ко мне мой коллега с просьбой показать ему, как отправлять сообщение всем пользователям терминального хоста. Я предложил ему бесплатную утилиту Terminal Services Manager и подумал, что задача выполнена, но не тут то было. Коллега сказал, что у него не подключается к RDSH хосту и высвечивается ошибка доступа. Я решил так же проверить данную ситуацию.

Запустив Terminal Services Manager, в логе я увидел вот такую ошибку подключения:

EOleException

EOleException

Сразу отмечу, что права на удаленный сервер у меня были и сетевая доступность присутствовала. Первым делом я полез на сам сервер, куда не удавалось произвести подключение. В логах системы я обнаружил массовую ошибку:

ID 10036: Политика уровня проверки подлинности на стороне сервера не разрешает пользователю ROOT\sem SID (S-1-5-21-551888299-3078463796-123456789-46162) с адреса 10.11.11.210 для активации DCOM-сервера. Повысьте уровень проверки подлинности активации, чтобы RPC_C_AUTHN_LEVEL_PKT_INTEGRITY в клиентском приложении. ("The server-side authentication level policy does not allow the user ROOT\sem SID (S-1-5-21-551888299-3078463796-123456789-46162) from address 10.11.11.210 to activate DCOM server. Please raise the activation authentication level at least to RPC_C_AUTHN_LEVEL_PKT_INTEGRITY in client application.")

ID 10036

Давайте выяснять в чем дело и как это можно обойти.

⚙️Причина ошибки DCOM ID 10036

Первое, что я стал изучать, что такое RPC_C_AUTHN_LEVEL_PKT_INTEGRITY. В итоге я наткнулся на статью Microsoft о константах уровня аутентификации.

Константы уровня аутентификации представляют собой уровни аутентификации, передаваемые различным функциям времени выполнения. Эти уровни перечислены в порядке возрастания аутентификации. Каждый новый уровень добавляет к аутентификации, обеспечиваемой предыдущим уровнем. Если библиотека времени выполнения RPC не поддерживает указанный уровень, она автоматически обновляется до следующего более высокого поддерживаемого уровня.

В итоге есть вот такой список констант:

  • RPC_C_AUTHN_LEVEL_DEFAULT - Использует уровень проверки подлинности по умолчанию для указанной службы проверки подлинности.
  • RPC_C_AUTHN_LEVEL_NONE - Не выполняет аутентификацию.
  • RPC_C_AUTHN_LEVEL_CONNECT - Аутентифицируется только тогда, когда клиент устанавливает связь с сервером.
  • RPC_C_AUTHN_LEVEL_CALL - Выполняет аутентификацию только в начале каждого вызова удаленной процедуры, когда сервер получает запрос. Не применяется к удаленным вызовам процедур, выполненным с использованием последовательностей протоколов на основе соединения (тех, которые начинаются с префикса "ncacn"). Если последовательность протокола в дескрипторе привязки представляет собой последовательность протокола на основе соединения, и вы указываете этот уровень, эта процедура вместо этого использует константу RPC_C_AUTHN_LEVEL_PKT.
  • RPC_C_AUTHN_LEVEL_PKT - Аутентифицирует только то, что все полученные данные получены от ожидаемого клиента. Не проверяет сами данные.
  • RPC_C_AUTHN_LEVEL_PKT_INTEGRITY - Аутентифицирует и проверяет, что никакие данные, передаваемые между клиентом и сервером, не были изменены.
  • RPC_C_AUTHN_LEVEL_PKT_PRIVACY - Включает все предыдущие уровни и гарантирует, что данные в открытом виде могут быть видны только отправителю и получателю. В локальном случае это предполагает использование безопасного канала. В удаленном случае это включает шифрование значения аргумента каждого удаленного вызова процедуры.

Теперь стало понятно, за что отвечает RPC_C_AUTHN_LEVEL_PKT_INTEGRITY и видимо Microsoft, ужесточила какую-то политику безопасности, я стал изучать вопрос дальше. Поиск ошибки DCOM ID 10036 привел меня ну обсуждение нового обновления KB5004442, которое как я выяснил и вызывает эту ситуацию.

KB5004442 призвана усилить защиту DCOM объектов. Удаленный протокол модели распределенных компонентов (DCOM) — это протокол для предоставления объектов приложений с помощью удаленных вызовов процедур (RPC). DCOM используется для связи между программными компонентами сетевых устройств. Многие из нас на самом деле не понимают этого, и мы не можем диагностировать ошибки DCOM в наших журналах событий, которые, по-видимому, не оказывают серьезного влияния на наши сети. Эта технология представляет собой протокол для предоставления объектов приложения с помощью удаленных вызовов процедур (RPC).

RPC являются ключевой частью Windows. RPC - это клиент-серверный протокол, который разработчики приложений могут использовать для вызова процедур на локальном или удаленном узле в сети. Детали подключения и сортировка данных выполняются за кулисами на уровне RPC, что дает разработчикам средства для прямого подключения клиентских приложений к удаленному компьютеру. Это позволяет разработчикам не беспокоиться о знании деталей того, как данные передаются между двумя машинами и как вызываются процедуры.

С обновлениями безопасности от 14 июня 2022 г. RPC_C_AUTHN_LEVEL_PKT_INTEGRITY на серверах DCOM теперь включен по умолчанию. Клиент, которому это необходимо, может отключить его с помощью раздела реестра RequireIntegrityActivationAuthenticationLevel.

Согласно бюллетеню, злоумышленник сначала воспользуется уязвимостью, предложив клиенту DCOM каким-либо образом подключиться к специально созданному серверу, как правило, отправив пользователю фишинговое электронное письмо, чтобы завладеть системой. Затем злоумышленник использует эту информацию для доступа к серверу DCOM, а затем скомпрометирует его. Патч исправляет и усиливает аутентификацию, используемую между клиентами и серверами DCOM.

Смотрите так же ошибку ID 10016

Я проверил RDSH хосты и действительно там прилетело данное обновление. Microsoft пока полностью не закрутило данную политику безопасности и ее еще можно обойти, но самое правильное, это доделать приложение, чтобы оно при обращении к серверу и запросе данных выполняло все требования вендора. На текущий момент есть вот такой график внедрения:

  1. 8 июня 2021 г. - Изменения защиты отключены по умолчанию, но с возможностью включить их с помощью ключа реестра.
  2. 14 июня 2022 г. - Защитные изменения включены по умолчанию, но с возможностью отключить их с помощью ключа реестра.
  3. 14 марта 2023 г. - Усиление изменений включено по умолчанию, отключить их невозможноК этому моменту вы должны решить все проблемы совместимости с усиливающими изменениями и приложениями в вашей среде.

Еще список обновлений несущих данное изменение: Windows Server 2022 - KB5005619, KB5005568. Windows 10, version 2004, Windows 10, version 20H2, Windows 10, version 21H1 - KB5005101. Windows Server 2019, Windows 10, version  1809 - KB5005102. Windows Server 2016, Windows 10, version 1607 - KB5005573. Windows Server 2012 R2 and Windows 8.1 - KB5006714. Данный список всегда меняется, так что смотрите в каталоге центра обновлений, что чем заменяется (https://www.catalog.update.microsoft.com/).

Сведения об обновлении

Так же помимо события ID 10036, есть еще два:

ID 10037: "Приложение %1 с PID %2 запрашивает активацию CLSID %3 на компьютере %4 с явно заданным уровнем аутентификации %5. Минимальный уровень аутентификации активации, требуемый DCOM, — 5 (RPC_C_AUTHN_LEVEL_PKT_INTEGRITY). Чтобы повысить уровень аутентификации активации, пожалуйста, обратитесь к поставщику приложения". ("Application %1 with PID %2 is requesting to activate CLSID %3 on computer %4 with explicitly set authentication level at %5. The lowest activation authentication level required by DCOM is 5(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY). To raise the activation authentication level, please contact the application vendor.")

ID 10038: "Приложение %1 с PID %2 запрашивает активацию CLSID %3 на компьютере %4 с уровнем аутентификации активации по умолчанию %5. Минимальный уровень аутентификации активации, требуемый DCOM, — 5 (RPC_C_AUTHN_LEVEL_PKT_INTEGRITY). Чтобы повысить уровень аутентификации активации, пожалуйста, обратитесь к поставщику приложения". ("Application %1 with PID %2 is requesting to activate CLSID %3 on computer %4 with default activation authentication level at %5. The lowest activation authentication level required by DCOM is 5(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY). To raise the activation authentication level, please contact the application vendor.")

  • %1 — путь к приложению
  • %2 — PID приложения
  • %3 — CLSID класса COM, который приложение запрашивает для активации
  • %4 — имя компьютера
  • %5 — значение уровня аутентификации

💡Как устранить ошибку ID 10036

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

ID 10036: Политика уровня проверки подлинности на стороне сервера не разрешает пользователю ROOT\sem SID (S-1-5-21-551888299-3078463796-123456789-46162) с адреса 10.11.11.210 для активации DCOM-сервера. Повысьте уровень проверки подлинности активации, чтобы RPC_C_AUTHN_LEVEL_PKT_INTEGRITY в клиентском приложении.

Тут IP-адрес откуда идет подключение 10.11.11.210, там и нужно установить все возможные обновления безопасности.

Установка обновлений Windows 10

Как только я обновился, ошибка EOleException ушла и мой Terminal Services Manager успешно подключился к серверу.

Terminal Services Manager успешное подключение

Если по каким, то причинам ваше приложение не заработало, а вам нужно, то есть лазейка до 2023 года в виде ключа реестра, который вы должны добавить на сервере, куда вы пытаетесь производить подключение. Запустите реестр Windows и перейдите в раздел:

HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Ole\AppCompat

И создайте там ключ реестра с типом REG_DWORD (32-бита) с именем RequireIntegrityActivationAuthenticationLevel.

  • RequireIntegrityActivationAuthenticationLevel = 0x00000000 выключает политику
  • RequireIntegrityActivationAuthenticationLevel = 0x00000001 включает политику

не забываем после создания ключа в реестре Windows произвести перезагрузку сервера

RequireIntegrityActivationAuthenticationLevel

Если и данный метод вам не помог, то как крайняя мера может быть, это удаление обновления. Посмотрите список установленных обновлений командой:

wmic qfe list

wmic qfe list

После чего просто прочитайте инструкцию, как это сделать. Надеюсь, что вам оказалась полезна данная статья, и вы устранили ошибку EOleException. Если остались вопросы, то пишите их в комментариях. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Дополнительные ссылки

  • https://docs.microsoft.com/en-us/windows/win32/rpc/authentication-level-constants
  • https://support.microsoft.com/en-us/topic/kb5004442-manage-changes-for-windows-dcom-server-security-feature-bypass-cve-2021-26414-f1400b52-c141-43d2-941e-37ed901c769c
  • https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-26414
Оцените статью
Настройка серверов windows и linux
Добавить комментарий

  1. Alexander

    Очень помог! Спасибо.

  2. Александр

    Здравствуйте, а как решить проблему без обновлений?

  3. Иван Семин автор

    А что вас смущает в обновлении системы?

  4. Леонид

    Ну, как минимум, на стороне клиента может быть устройство не-windows…