Использование API-интерфейсов SSPI (NTLM) с Windows AccessCheck () в Vista с UAC - PullRequest
0 голосов
/ 22 октября 2008

Резюме Клиент (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); 

1 Ответ

3 голосов
/ 24 октября 2008

Нашли решение всем заинтересованным сторонам.

Проблема заключалась в том, что аутентифицируемый пользователь был локальной учетной записью, и по умолчанию локальные учетные записи имеют отфильтрованный токен с группой BUILTIN \ Administrators, имеющей запрещенный ACL. И я проверял права в группе BUILTIN \ Администраторы. Поэтому пришлось установить настройки реестра или использовать учетную запись домена.

Ryan

...