Elevazione dei privilegiElevation of Privilege

L'elevazione dei privilegi risultante dalla concessione dell'autorizzazione un utente malintenzionato autorizzazioni maggiori rispetto a tali concessa inizialmente.Elevation of privilege results from giving an attacker authorization permissions beyond those initially granted. L'autore di un attacco con, ad esempio, un set di privilegi di autorizzazioni "di sola lettura" eleva il set per includere "lettura e scrittura".For example, an attacker with a privilege set of "read only" permissions somehow elevates the set to include "read and write."

Un servizio token di sicurezza affidabile deve firmare le attestazioni del token SAMLTrusted STS Should Sign SAML Token Claims

Un token SAML (Security Assertions Markup Language) è un token XML generico che è il tipo predefinito per i token emessi.A Security Assertions Markup Language (SAML) token is a generic XML token that is the default type for issued tokens. Un token SAML può essere costruito da un servizio token di sicurezza (STS, Security Token Service) ritenuto affidabile dal servizio Web finale in uno scambio tipico.A SAML token can be constructed by a Security Token Service (STS) that the end Web service trusts in a typical exchange. Nelle istruzioni, i token SAML contengono attestazioni.SAML tokens contain claims in statements. L'autore di un attacco può copiare le attestazioni da un token valido, creare un nuovo token SAML e firmarlo con un emittente diverso.An attacker may copy the claims from a valid token, create a new SAML token, and sign it with a different issuer. Lo scopo è quello di determinare se il server sta convalidando gli emittenti e, in caso negativo, utilizzare la debolezza per costruire token SAML che consentano privilegi oltre quelli previsti da un servizio token di sicurezza.The intent is to determine whether the server is validating issuers and, if not, utilize the weakness to construct SAML tokens that allow privileges beyond those intended by a trusted STS.

La classe SamlAssertion verifica la firma digitale contenuta in un token SAML e l'oggetto SamlSecurityTokenAuthenticator predefinito richiede che i token SAML siano firmati da un certificato X.509 che sia valido quando l'oggetti CertificateValidationMode della classe IssuedTokenServiceCredential è impostata su ChainTrust.The SamlAssertion class verifies the digital signature contained within a SAML token, and the default SamlSecurityTokenAuthenticator requires that SAML tokens be signed by an X.509 certificate that is valid when the CertificateValidationMode of the IssuedTokenServiceCredential class is set to ChainTrust. La sola modalità ChainTrust non è sufficiente per stabilire se l'emittente del token SAML è affidabile.ChainTrust mode alone is insufficient to determine whether the issuer of the SAML token is trusted. I servizi che richiedono un modello di affidabilità più granulare possono utilizzare i criteri di autorizzazione e di imposizione per controllare l'emittente dei set di attestazioni prodotti dall'autenticazione del token emesso oppure utilizzare le impostazioni di convalida X.509 in IssuedTokenServiceCredential per limitare il set di certificati di firma consentiti.Services that require a more granular trust model can either use authorization and enforcement policies to check the issuer of the claim sets produced by issued token authentication or use the X.509 validation settings on IssuedTokenServiceCredential to restrict the set of allowed signing certificates. Per altre informazioni, vedere gestione attestazioni e autorizzazioni con il modello di identità e federazione e i token emessi.For more information, see Managing Claims and Authorization with the Identity Model and Federation and Issued Tokens.

Cambio di identità senza un contesto di sicurezzaSwitching Identity Without a Security Context

Quando segue si applica solo a WinFXWinFX.The following applies only to WinFXWinFX.

Quando viene stabilita una connessione tra un client e server, l'identità del client non cambia, tranne che in una situazione: dopo l'apertura di client di WCF, se sono vere tutte le condizioni seguenti:When a connection is established between a client and server, the identity of the client does not change, except in one situation: after the WCF client is opened, if all of the following conditions are true:

  • Le procedure per stabilire un contesto di sicurezza (con protezione del trasporto sessione o una sessione di sicurezza messaggio) è disattivata (EstablishSecurityContext è impostata su false in caso di sicurezza dei messaggi o non in grado di stabilire sicurezza trasporto le sessioni viene utilizzato nel caso della protezione del trasporto.The procedures to establish a security context (using a transport security session or message security session) is switched off (EstablishSecurityContext property is set to false in case of message security or transport not capable of establishing security sessions is used in transport security case. HTTPS è un esempio di questo tipo di trasporto.HTTPS is one example of such transport).

  • Viene utilizzata l'autenticazione di Windows.You are using Windows authentication.

  • La credenziale non è impostata in modo esplicito.You do not explicitly set the credential.

  • Il servizio viene chiamato nel contesto di sicurezza rappresentato.You are calling the service under the impersonated security context.

Se queste condizioni sono vere, l'identità utilizzata per autenticare il client presso il servizio potrebbe cambiare (potrebbe non essere l'identità rappresentata ma l'identità del processo invece) dopo l'apertura del client WCF.If these conditions are true, the identity used to authenticate the client to the service might change (it might not be the impersonated identity but the process identity instead) after the WCF client is opened. Ciò accade perché la credenziale di Windows utilizzata per autenticare il client al servizio viene trasmessa con ogni messaggio e la credenziale utilizzata per l'autenticazione viene ottenuta dall'identità di Windows del thread corrente.This occurs because the Windows credential used to authenticate the client to the service is transmitted with every message, and the credential used for authentication is obtained from the current thread's Windows identity. Se l'identità di Windows del thread corrente cambia (ad esempio, rappresentando un chiamante diverso), potrebbe cambiare anche la credenziale allegata al messaggio e utilizzata per autenticare il client al servizio.If the Windows identity of the current thread changes (for example, by impersonating a different caller), the credential that is attached to the message and used to authenticate the client to the service might also change.

Se si desidera ottenere un comportamento deterministico quando si utilizza l'autenticazione di Windows assieme alla rappresentazione, è necessario impostare in modo esplicito la credenziale di Windows oppure stabilire un contesto di sicurezza con il servizio.If you want to have deterministic behavior when using Windows authentication together with impersonation you need to explicitly set the Windows credential or you need to establish a security context with the service. A tale scopo, utilizzare una sessione di sicurezza del messaggio o una sessione di sicurezza del trasporto.To do this, use a message security session or a transport security session. Il trasporto net.tcp, ad esempio, può fornire una sessione di sicurezza del trasporto.For example, the net.tcp transport can provide a transport security session. Quando si chiama il servizio , è inoltre necessario utilizzare solo una versione sincrona delle operazioni client.Additionally, you must use only a synchronous version of client operations when calling the service. Se si stabilisce un contesto di sicurezza del messaggio, non mantenere aperta la connessione al servizio oltre il periodo di rinnovo della sessione configurato, perché l'identità può cambiare anche durante il processo di rinnovo della sessione.If you establish a message security context, you should not keep the connection to the service open longer than the configured session renewal period, because the identity can also change during the session renewal process.

Acquisizione delle credenzialiCredentials Capture

Quanto segue si applica a .NET Framework versione 3.5.NET Framework version 3.5 e versioni successive.The following applies to .NET Framework versione 3.5.NET Framework version 3.5, and subsequent versions.

Le credenziali utilizzate dal client o dal servizio sono basate sul thread del contesto corrente.Credentials used by the client or the service are based on the current context thread. Le credenziali vengono ottenute quando si chiama il metodo Open (o BeginOpen, per le chiamate asincrone) del client o del servizio.The credentials are obtained when the Open method (or BeginOpen, for asynchronous calls) of the client or service is called. Per entrambe le classi ServiceHost e ClientBase<TChannel>, i metodi Open e BeginOpen ereditano dai metodi Open e BeginOpen della classe CommunicationObject.For both the ServiceHost and ClientBase<TChannel> classes, the Open and BeginOpen methods inherit from the Open and BeginOpen methods of the CommunicationObject class.

Nota

Quando si utilizza il metodo BeginOpen, non è possibile garantire che le credenziali acquisite siano quelle del processo che chiama il metodo.When using the BeginOpen method, the credentials captured cannot be guaranteed to be the credentials of the process that calls the method.

I token memorizzati nella cache consentono la riproduzione utilizzando dati obsoletiToken Caches Allow Replay Using Obsolete Data

WCF Usa l'autorità di sicurezza locale (LSA) LogonUser (funzione) per autenticare gli utenti tramite nome utente e password.WCF uses the local security authority (LSA) LogonUser function to authenticate users by user name and password. Poiché la funzione di accesso è un'operazione costosa, WCF consente agli utenti per migliorare le prestazioni per i token nella cache che rappresentano autenticati.Because the logon function is a costly operation, WCF allows you to cache tokens that represent authenticated users to increase performance. Il meccanismo di memorizzazione nella cache salva i risultati ottenuti da LogonUser per utilizzi successivi.The caching mechanism saves the results from LogonUser for subsequent uses. Questo meccanismo è disabilitato per impostazione predefinita. Per attivarla, impostare il CacheLogonTokens proprietà true, oppure utilizzare il cacheLogonTokens attributo del <userNameAuthentication >.This mechanism is disabled by default; to enable it, set the CacheLogonTokens property to true, or use the cacheLogonTokens attribute of the <userNameAuthentication>.

È possibile impostare la durata (TTL) per i token memorizzati nella cache, impostando la proprietà CachedLogonTokenLifetime su un TimeSpan, oppure utilizzare l'attributo cachedLogonTokenLifetime dell'elemento userNameAuthentication. L'impostazione predefinita è 15 minuti.You can set a Time to Live (TTL) for the cached tokens by setting the CachedLogonTokenLifetime property to a TimeSpan, or use the cachedLogonTokenLifetime attribute of the userNameAuthentication element; the default is 15 minutes. Si noti che quando un token è memorizzato nella cache, può essere utilizzato da qualsiasi client che presenti lo stesso nome utente e la stessa password, anche se l'account utente viene eliminato da Windows o se la sua password è stata modificata.Note that while a token is cached, any client that presents the same user name and password can use the token, even if the user account is deleted from Windows or if its password has been changed. Fino a quando la durata (TTL) scade e il token viene rimosso dalla cache, WCF consente all'utente (forse malintenzionato) per l'autenticazione.Until the TTL expires and the token is removed from the cache, WCF allows the (possibly malicious) user to authenticate.

Per limitare questo problema, ridurre il tempo a disposizione dell'attacco impostando il valore cachedLogonTokenLifetime sull'intervallo di tempo più breve necessario per gli utenti.To mitigate this: Decrease the attack window by setting the cachedLogonTokenLifetime value to the shortest time span your users need.

Autorizzazione del token emesso: scadenza reimpostata su un valore grandeIssued Token Authorization: Expiration Reset to Large Value

In certe condizioni, la proprietà ExpirationTime di AuthorizationContext può essere impostata su un valore inaspettatamente superiore (il valore del campo MaxValue meno un giorno, o 20 dicembre 9999).Under certain conditions, the ExpirationTime property of the AuthorizationContext may be set to an unexpectedly larger value (the MaxValue field value minus one day, or December 20, 9999).

Ciò si verifica quando si utilizza WSFederationHttpBinding e una qualsiasi delle associazioni fornite dal sistema che ha un token emesso come tipo di credenziale client.This occurs when using the WSFederationHttpBinding and any of the system-provided bindings that have an issued token as the client credential type.

Lo stesso accade anche quando si creano associazioni personalizzate utilizzando uno dei metodi seguenti:This also occurs when you create custom bindings by using one of the following methods:

Per limitare questo problema, i criteri di autorizzazione devono controllare l'azione e la data di scadenza dei singoli criteri di autorizzazione.To mitigate this, the authorization policy must check the action and the expiration time of each authorization policy.

Il servizio utilizza un certificato diverso da quello previsto dal clientThe Service Uses a Different Certificate Than the Client Intended

In certe condizioni, un client può firmare digitalmente un messaggio con un certificato X.509 e far sì che il servizio recuperi un certificato diverso da quello previsto.Under certain conditions, a client can digitally sign a message with an X.509 certificate and have the service retrieve a different certificate than the intended one.

Ciò può verificarsi nelle circostanze seguenti:This can occur under the following circumstances:

  • Il client firma digitalmente un messaggio utilizzando un certificato X.509 e non allega il certificato X.509 al messaggio, ma fa semplicemente riferimento al certificato utilizzando il suo identificatore chiave del soggetto.The client digitally signs a message using an X.509 certificate and does not attach the X.509 certificate to the message, but rather just references the certificate using its subject key identifier.

  • Il computer del servizio contiene due o più certificati con la stessa chiave pubblica, ma tali certificati contengono informazioni diverse.The service's computer contains two or more certificates with the same public key, but they contain different information.

  • Il servizio recupera un certificato che corrisponde all'identificatore chiave del soggetto, ma non è quello che il client doveva utilizzare.The service retrieves a certificate that matches the subject key identifier, but it is not the one the client intended to use. Quando WCF riceve il messaggio e verifica la firma, WCF le informazioni nel certificato X.509 non intenzionale viene mappato a un set di attestazioni che sono diverse e potenzialmente con privilegi elevati da quello previsto del client.When WCF receives the message and verifies the signature, WCF maps the information in the unintended X.509 certificate to a set of claims that are different and potentially elevated from what the client expected.

Per limitare questo problema, fare riferimento al certificato X.509 in un altro modo, ad esempio utilizzando IssuerSerial.To mitigate this, reference the X.509 certificate another way, such as using IssuerSerial.

Vedere ancheSee Also

Considerazioni sulla sicurezzaSecurity Considerations
Divulgazione di informazioniInformation Disclosure
Negazione del servizioDenial of Service
Attacchi di tipo replayReplay Attacks
ManomissioniTampering
Scenari non supportatiUnsupported Scenarios