Как COM-сервер может разрешать доступ только к определенным COM-клиентам с использованием белого списка?

Я создал приложение C++, которое загружает dll (плагины). Перед загрузкой dll приложение проверяет, входит ли цифровая подпись dll в белый список. Это сделано для того, чтобы загружались только авторизованные dll.

Я пытаюсь сделать что-то подобное, используя внепроцессный COM-сервер/клиент. COM-сервер должен гарантировать, что только определенные клиенты могут получить к нему доступ (из белого списка). Я знаю, что Microsoft предоставляет множество различных механизмов аутентификации для COM, но они похоже вращаются вокруг удостоверения приложения (учетной записи, используемой для его запуска). В конечном счете, мне нужен безопасный способ убедиться, что COM-клиент является тем, за кого себя выдает, и находится в моем белом списке.

Я открыт для других способов достижения этого, но не использовать COM на самом деле не вариант.

Спасибо за любую помощь, которую вы можете предоставить

  • Крис

person Chris McBride    schedule 17.12.2014    source источник
comment
›*похоже, они вращаются вокруг идентификатора приложения (учетная запись, используемая для его запуска)* Это потому, что за пределами .Net вы не можете основывать решения о безопасности на вызывающем объекте, потому что вызывающий объект может делать с памятью все, что захочет, начиная с куча. То, о чем вы просите, возможно только в контролируемой среде (проверяемый код .Net) или в другом процессе, работающем с другим токеном.   -  person Medinoc    schedule 17.12.2014
comment
@Medonic. Не могли бы вы объяснить, что вы имеете в виду под другим процессом, работающим с другим токеном?   -  person Chris McBride    schedule 17.12.2014
comment
Предположим, вам каким-то образом удалось проверить достоверность EXE-файла, стоящего за процессом, из которого исходит вызов, но фактический вызов мог быть сделан сторонней DLL (например, внедренной через SetWindowsHookEx) из этого процесса. Или злоумышленник может прочитать память этого процесса (через ReadProcessMemory) после выполнения вызова и таким образом получить данные, которые вы ему предоставили.   -  person Igor Tandetnik    schedule 17.12.2014
comment
Другой токен означает либо другого пользователя, либо ограниченный токен для одного и того же пользователя (что делает пользователя принадлежащим к меньшему количеству групп и имеет меньше привилегий, но не может влиять на права пользователя по частям).   -  person Medinoc    schedule 17.12.2014


Ответы (1)


Я думаю, что это можно сделать в DCOM Config в сочетании с доверенными клиентскими сертификатами.

Другой способ — реализовать в интерфейсе метод, в котором сервер проверяет цифровую подпись клиента. В этой ссылке приведен пример того, как прочитать сертификат клиента Как прочитать встроенную подпись подписи кода в C++?

person Hans    schedule 17.12.2014
comment
Я не думаю, что это может защитить от подделки стека, чтобы вызов выглядел так, как будто он исходит из подписанной DLL (в то время как адрес возврата фактически указывает, где инструкция ret законной функции или законная функция, которая делает виртуальный вызов с поддельными данными). со стороны злоумышленника). - person Medinoc; 17.12.2014