Доступ к серверам именованных каналов из IE EPM BHO
Я пытаюсь внести некоторые изменения в наш устаревший продукт для поддержки IE EPM на BHO. Мне удалось загрузить его и вызвать различные методы - SetSite, DocumentComplete и т. Д.
Кажется, что я пытаюсь подключиться к серверу именованных каналов, работающему внутри службы Windows.
Ранее мы уже внесли изменения, чтобы разрешить IE BHO в защищенном режиме доступ к указанному серверу каналов - с помощью LOW_INTEGRITY_SDDL_SACL ("S:(ML;;NW;;;LW)"). В этом коде мы использовали создание дескриптора безопасности с использованием метода ConvertStringSecurityDescriptorToSecurityDescriptor, а затем выполняли SetSecurityDescriptorSacl для фактического SD или объекта SECURITY_ATTRIBUTES. Это позволило коду BHO получить доступ к серверам именованных каналов, размещенным в сервисе SYSTEM.
Я сослался на несколько статей, и, вероятно, самой полезной была эта статья. Есть ли способ создать именованный канал из BHO AppContainer на IE11?
Я внес некоторые изменения в SDDL, теперь он выглядит так:
#define EPM_INTEGRITY_SDDL L"S:(ML;;NW;;;LW)D:(A;;FA;;;SY)(A;;FA;;;WD)(A;;FA;;;AC)"
Это в основном дает полный доступ к файлу всем, ВСЕМ ПАКЕТАМ ПРИЛОЖЕНИЙ и СИСТЕМЕ в части DACL. Я знаю, что это слишком допустимо, но я ожидал, что это должно работать, по крайней мере, после того, как я использовал SetSecurityDescriptorDacl:-)
В любом случае, код, который устанавливает SD, теперь выглядит следующим образом. Я что-то здесь упускаю?
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(EPM_INTEGRITY_SDDL, SDDL_REVISION_1, &pLISD, NULL))
{
OutputDebugString(L"Unable to get the app-container integrity security descriptor");
return false;
}
PACL pAcl = 0;
BOOL bAclPresent = FALSE;
BOOL bAclDefaulted = FALSE;
if (!GetSecurityDescriptorSacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
return false;
}
if (!SetSecurityDescriptorSacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
return false;
}
pAcl = 0;
bAclPresent = FALSE;
bAclDefaulted = FALSE;
if (!GetSecurityDescriptorDacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
OutputDebugString(L"Setting to low integrity : No DACL Available");
return false;
}
if (!SetSecurityDescriptorDacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
OutputDebugString(L"Setting to low integrity : Unable to set the DACL");
return false;
}
1 ответ
Я провел некоторое исследование и сумел выяснить подход, который работает.
Во-первых, кажется, что BHO внутри AppContainer не может получить доступ к именованным каналам и т. Д., Созданным в сеансе Windows, кроме своего собственного. Поскольку я создавал свой именованный конвейерный сервер в службе Windows, не имеет значения, какой дескриптор безопасности я указываю. Это не сработает.
Во-вторых, используйте процесс посредника со средней целостностью, чтобы создать именованный канал с той же попыткой SD, и он будет доступен. Итак, подход, который я выбрал, заключался в создании прокси для моего BHO, который перенаправляет эти сообщения в службу Windows. Итак, моя "серверная" логика не должна была двигаться.
Я не в восторге от этого подхода, но он не так уж и плох, потому что я могу повторно использовать этот код и для расширений на основе JS, не переписывая основной код полностью.
В-третьих, мне нужно было как-нибудь перезвонить в BHO, чтобы попросить его предпринять некоторые действия, основанные на внешних раздражителях. Мне удалось добиться этого, создав окно HWND_MESSAGE в SetSite BHO и вызвав его с помощью SendMessage из процесса Broker. Поскольку это кросс-процесс, вам необходимо использовать WM_COPYDATA.