2008-10-22 8 views
0
de api Avec Windows AccessCheck()

Résumé client (Windows XP SP3) Server (Windows Vista Professionnel SP1)/Course à pied en tant que service LocalSystemEn utilisant SSPI (NTLM) Sur Vista avec l'UAC

Api Séquence client - AcquireCredentialsHandle client - serveur InitializeSecurityContext - AcquireCredentialsHandle serveur - AcceptSecurityContext client/serveur - CompleteAuthnToken serveur - ImpersonateSecurityContext serveur - AccessCheckAndAuditAlarm (MAXIMUM_allowed) serveur - je compare alors le acc ess demandé avec les accès autorisés.

J'appelle vérification d'accès par rapport à un objet de sécurité privé créé avec createprivateobjectsecurityex. Avec Uac allumé je reçois le succès de accesscheck, mais aucun des privilèges n'est tenu. Avec uac désactivé, je reçois avec succès tous les droits dans le paramètre GantedAccess

Détails L'application a deux composants, un client et un serveur. Il utilise tcp pour communiquer sur un réseau non sécurisé. Pour authentifier les connexions incomming j'utilise les api sspi énumérés ci-dessus, et usurper l'identité de l'utilisateur appelant. Une fois que l'utilisateur appelant est usurpé, j'utilise Accesscheckandauditalarm, si cela échoue, je reviens à accesscheck. Avec UAC allumé, je reçois le succès de accesscheckandauditalarm mais aucun des droits d'accès sont dans le paramètre grandedaccess , mais si uac est désactivé, il fonctionne comme prévu. J'ai vérifié le niveau d'intégrité du processus serveur et il est élevé, j'ai regardé le niveau d'intégrité du jeton d'emprunt d'identité utilisé pour emprunter l'identité de l'utilisateur appelant et il est défini sur Moyen. J'ai essayé de définir le niveau d'intégrité de l'utilisateur appelant à haut, avec succès mais la vérification d'accès renvoie toujours des résultats incorrects. En pensant que je pourrais avoir un jeton lié j'ai essayé le jeton lié avec un appel à GetTOkenInformation (TokenLInkedToken) avec un résultat de 0x520. Toutes les pensées sur ce que je pourrais essayer ensuite seraient appréciées.

Code après authentification.

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); 

Répondre

3

Trouvé la solution à toutes les parties intéressées. Le problème était que l'utilisateur authentifié était un compte local et que par défaut les comptes locaux avaient un jeton filtré avec le groupe BUILTIN \ Administrateurs ayant une liste ACL refusée. Et je vérifiais les droits sur le groupe BUILTIN \ Administrators. Donc, a dû définir un paramètre de registre ou utiliser un compte de domaine.

Ryan

Questions connexes