C #: снижение целостности именованных каналов - PullRequest
3 голосов
/ 29 июня 2011

Я разрабатываю объект помощника браузера Internet Explorer (BHO) на C #. Это BHO обнаруживает URL, по которому пользователь переходит, а затем автоматически вводит имя пользователя и пароль.

BHO связывается с процессом, работающим как служба. Связь происходит по именованным каналам.

Связь работает нормально, когда защищенный режим выключен. Однако, когда защищенный режим включен, это не работает. Если я запускаю iexplore.exe в качестве администратора, тогда он работает.

В защищенном режиме я получаю сообщение об отказе в доступе.

Прочитав об этом, я понимаю, что доступ к каналу запрещен, потому что IE работает область с низким уровнем целостности.

Я прошел следующую статью а. Понимание и работа в защищенном режиме Internet Explorer http://msdn.microsoft.com/en-us/library/bb250462.aspx

b.Также было много предложений по настройке информации о безопасности перед созданием ресурса канала, чтобы позволить процессу более низкой целостности использовать это. Это, однако, не очень полезно для меня. Я все еще получаю ту же ошибку.

Единственное, что у меня есть в настоящее время - это общение через сокеты. Я проверил, что этот подход работает.

Я бы предпочел использовать подход именованного канала.

Ниже приведен мой исходный код для настройки контекста безопасности перед открытием канала

Сервисный код:

PipeSecurity security = new PipeSecurity();
security.AddAccessRule(new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),  // @"Users"
            PipeAccessRights.ReadWrite, 
            System.Security.AccessControl.AccessControlType.Allow
            ));

var currentUser = WindowsIdentity.GetCurrent().Name;
security.AddAccessRule(new PipeAccessRule(currentUser, PipeAccessRights.FullControl,   System.Security.AccessControl.AccessControlType.Allow));


NamedPipeServerStream stream;
stream = new NamedPipeServerStream(
            CommandPipeName,
            PipeDirection.InOut, MAX_PIPE_INSTANCE,
            PipeTransmissionMode.Message, PipeOptions.WriteThrough,
            EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
            EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
            security
            );

do
        {
            n++;

            isListening = true;
            stream.WaitForConnection();
            isListening = false;

            var cs = stream;

            stream = new NamedPipeServerStream(
                    CommandPipeName,
                    PipeDirection.InOut, MAX_PIPE_INSTANCE,
                    PipeTransmissionMode.Message, PipeOptions.WriteThrough,
                    EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
                    EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
                    security
                    );

    // some code

        } while (true);

Есть что-то, чего мне не хватает?

Спасибо.

1 Ответ

3 голосов
/ 29 июля 2011

Я полагаю, что вы нарушаете механизм Integrity Level, добавленный в Windows в Vista.Этот механизм ортогонален механизмам контроля доступа на основе записей Allow и Deny в списке контроля доступа.

Идея понижения уровня целостности канала звучит для меня как правильный подход, но ваш код не подходитне делай этого вообще.В классах .NET Framework пока не поддерживается внесение изменений в метку целостности, связанную с ресурсом.Вы должны работать с Win32 API.

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

...