Резюме
Клиент (Windows XP SP3)
Сервер (Windows Vista Business SP1) / Запуск в качестве службы локальной системы
последовательность API
Клиент - AcquireCredentialsHandle
Клиент - Initializesecuritycontext
Сервер - получение данных
Сервер - AcceptSecurityContext
Клиент / Сервер - CompleteAuthnToken
Сервер - ImpersonateSecurityContext
Сервер - AccessCheckAndAuditAlarm (MAXIMUM_allowed)
Сервер - затем я сравниваю запрашиваемый доступ с разрешенным доступом.
Я вызываю проверку доступа к частному объекту безопасности, созданному с помощью createprivateobjectsecurityex. С включенным Uac я получаю успех от accesscheck, но ни одно из привилегий не удерживается. С выключенным UAC я получаю успех со всеми правами в параметре GantedAccess
Подробнее
Приложение имеет два компонента: клиент и сервер. Это
использует tcp для связи через незащищенную сеть. Для аутентификации
входящие соединения я использую API-интерфейсы Sspi, перечисленные выше, и
выдавать себя за вызывающего пользователя. Как только вызывающий пользователь выдает себя за
использовать Accesscheckandauditalarm, если это не удается, я возвращаюсь к просто
AccessCheck. С включенным UAC я возвращаюсь к успеху
accesscheckandauditalarm, но ни одно из прав доступа не
Параметр grandedaccess, но если UAC выключен, он работает как положено.
Я должен проверить уровень целостности серверного процесса, и он установлен
Высоко, я посмотрел уровень целостности маркера олицетворения
используется для олицетворения вызывающего пользователя и имеет значение Medium. я имею
попытался установить высокий уровень целостности вызывающего пользователя, с
успех, но проверка доступа по-прежнему возвращает неверные результаты.
Думая, что у меня может быть связанный токен, я попробовал связанный токен с
вызов GetTOkenInformation (TokenLInkedToken) с результатом 0x520.
Будем благодарны за любые мысли о том, что я мог бы попробовать дальше.
Код после аутентификации.
SECURITY_STATUS ss = SEC_E_OK;
HANDLE _hToken = NULL;
ss = QuerySecurityContextToken((PCtxtHandle)pContext,&_hToken);
if(SEC_E_OK != ss)
{
return ss;
}
CAccessToken impToken;
impToken.Attach(_hToken);
if(CWin32::IsVista())
{
/*TOKEN_LINKED_TOKEN linkedToken;
DWORD nLen = 0;
BOOL bRet = GetTokenInformation(_hToken,
(TOKEN_INFORMATION_CLASS)TokenLinkedToken,&linkedToken,sizeof(linkedToken), &nLen);
if(bRet)
{
CloseHandle(impToken.Detach());
impToken.Attach(linkedToken.LinkedToken);
}
else
{
TRACE(_T("GetTokenInfo Failed 0x%x\n"),GetLastError());
}*/
PSID pHighIntegritySid = NULL;
BOOL bConvertSid = FALSE;
bConvertSid = ConvertStringSidToSid(SDDL_ML_HIGH,
&pHighIntegritySid);
if (bConvertSid)
{
TOKEN_MANDATORY_LABEL TML = {0};
TML.Label.Attributes = SE_GROUP_INTEGRITY |
SE_GROUP_INTEGRITY_ENABLED;
TML.Label.Sid = pHighIntegritySid;
BOOL bSetTokenRet = SetTokenInformation(_hToken,
(TOKEN_INFORMATION_CLASS)TokenIntegrityLevel,&TML,sizeof(TML) +
GetLengthSid(pHighIntegritySid));
LocalFree(pHighIntegritySid);
if(!bSetTokenRet)
{
nReturn = GetLastError();
DBGOUT(DebugOut::LOG_COMP_AUTH_LAYER,DebugOut::LOG_DETAIL_ERROR,
_T("Failed to set Token information %x\n"),nReturn);
return nReturn;
}
}
}
bool bRet = impToken.Impersonate();
if(false == bRet)
{
return GetLastError();
}
_GetTokenSecurityLevel(impToken.GetHandle());
::MapGenericMask(&nRights, GetGENERIC_MAPPING());
DWORD nAccessGranted = 0;
BOOL bAccessStatus = FALSE;
BOOL bGenerateOnClose = FALSE;
BOOL bAccessCheckRet = FALSE;
bAccessCheckRet = ::AccessCheckAndAuditAlarm(_T("Purgos
Security"),impToken.GetHandle(),_T("Purgos"),m_csObjectName.GetBuffer(0),
const_cast<SECURITY_DESCRIPTOR*>(m_ObjectSD.GetPSECURITY_DESCRIPTOR())/
*privObjectSD.GetPSECURITY_DESCRIPTOR())*/,MAXIMUM_ALLOWED,GetGENERIC_MAPPI NG(),FALSE,&nAccessGranted,&bAccessStatus,&bGenerateOnClose);