0

概要クライアント(Windows XP SP3)サーバー(Windows Vista Business SP1)/LocalSystemサービスとして実行

Apiシーケンスクライアント-AcquireCredentialsHandleクライアント-Initializesecuritycontextサーバー-Acquirecredentialshandleサーバー-AcceptSecurityContextクライアント/サーバー-CompleteAuthnTokenサーバー-ImpersonateSecurityContextサーバー-AccessCheckAndAuditAlarm(MAXIMUM_allowed)サーバー-次に、要求されたアクセスと許可されたアクセスを比較します。

createprivateobjectsecurityexで作成されたプライベートセキュリティオブジェクトに対してアクセスチェックを呼び出します。Uacをオンにすると、アクセスチェックから成功を取り戻すことができますが、どの特権も保持されません。uacをオフにすると、GantedAccessパラメーターのすべての権限で成功を取り戻すことができます

詳細アプリケーションには、クライアントとサーバーの2つのコンポーネントがあります。tcpを使用して、セキュリティで保護されていないネットワークを介して通信します。着信接続を認証するために、上記のsspi apiを使用し、呼び出し元のユーザーになりすます。呼び出し元のユーザーが偽装されたら、Accesscheckとauditalarmを使用します。これが失敗した場合は、accesscheckだけに戻ります。UACをオンにすると、accesscheckとauditalarmから成功を取り戻すことができますが、grandedaccessパラメーターにアクセス権はありませんが、uacをオフにすると、期待どおりに機能します。サーバープロセスの整合性レベルを確認し、高に設定しました。呼び出し元ユーザーの偽装に使用される偽装トークンの整合性レベルを確認し、中に設定しました。呼び出し元ユーザーの整合性レベルを高く設定してみましたが、成功しましたが、アクセスチェックは依然として誤った結果を返します。リンクされたトークンがあるかもしれないと思って、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); 
4

1 に答える 1

3

すべての利害関係者への解決策を見つけました。

問題は、認証されているユーザーがローカルアカウントであり、デフォルトでローカルアカウントには、拒否ACLを持つBUILTIN\Administratorsグループを持つフィルターされたトークンがあることでした。そして、私はBUILTIN\Administratorsグループに対して権利をチェックしていました。そのため、レジストリ設定を設定するか、ドメインアカウントを使用する必要がありました。

ライアン

于 2008-10-24T03:45:57.787 に答える