Protezione del codice wrapperSecuring Wrapper Code

Attenzione

Sicurezza dall'accesso di codice e codice parzialmente attendibileCode Access Security and Partially Trusted Code

.NET Framework fornisce un meccanismo denominato sicurezza dall'accesso di codice, che consente di applicare vari livelli di attendibilità a codice diverso in esecuzione nella stessa applicazione.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). La sicurezza per l'accesso di codice in .NET Framework non deve essere usata come meccanismo per l'applicazione dei limiti di sicurezza in base alla creazione di codice o altri aspetti di identità.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Le linee guida sono state modificate per specificare che la sicurezza per l'accesso di codice e il codice SecurityTransparent non saranno supportati come limiti di sicurezza con codice parzialmente attendibile, soprattutto nel caso di codice di origine sconosciuta.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Non è consigliabile caricare ed eseguire codice di origine sconosciuta in assenza di misure di sicurezza alternative.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Questi criteri si applicano a tutte le versioni di .NET Framework, ma non alla versione di .NET Framework inclusa in Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Il codice wrapper, soprattutto dove il wrapper ha un'attendibilità più elevata del codice che lo usa, può creare una combinazione univoca di punti di debolezza nella sicurezza.Wrapper code, especially where the wrapper has higher trust than code that uses it, can open a unique set of security weaknesses. Tutte le operazioni eseguite per conto di un chiamante, in cui le autorizzazioni limitate del chiamante non sono incluse nel controllo di sicurezza appropriato, sono un potenziale punto di debolezza da sfruttare.Anything done on behalf of a caller, where the caller's limited permissions are not included in the appropriate security check, is a potential weakness to be exploited.

Non abilitare mai tramite il wrapper nulla che il chiamante non possa abilitare manualmente.Never enable something through the wrapper that the caller could not do itself. L'esecuzione di operazioni con un controllo di sicurezza limitato comporta un grave rischio, al contrario di una richiesta di percorso stack completo.This is a special danger when doing something that involves a limited security check, as opposed to a full stack walk demand. Con i controlli dei livelli singoli, se si interpone il codice wrapper tra il vero chiamante e l'elemento API in questione, il controllo di sicurezza potrebbe facilmente avere esito positivo quando non dovrebbe, indebolendo in tal modo la sicurezza.When single-level checks are involved, interposing the wrapper code between the real caller and the API element in question can easily cause the security check to succeed when it should not, thereby weakening security.

DelegatiDelegates

La sicurezza dei delegati è diversa a seconda della versione di .NET Framework.Delegate security differs between versions of the .NET Framework. Questa sezione descrive i diversi comportamenti dei delegati e le relative considerazioni sulla sicurezza.This section describes the different delegate behaviors and associated security considerations.

Nelle versioni 1.0 e 1.1 di .NET FrameworkIn version 1.0 and 1.1 of the .NET Framework

Le versioni 1.0 e 1.1 di .NET Framework eseguono le seguenti azioni di sicurezza su un creatore del delegato e un chiamante del delegato.Version 1.0 and 1.1 of the .NET Framework perform the following security actions against a delegate creator and a delegate caller.

  • Quando viene creato un delegato, le richieste di collegamento sicurezza per il metodo destinazione delegato vengono eseguite sul set di concessioni del creatore del delegato.When a delegate is created, security link demands on the delegate target method are performed against the grant set of the delegate creator. Se si verifica un errore nell'azione di sicurezza, viene generata un'eccezione SecurityException.Failure to satisfy the security action results in a SecurityException.

  • Quando il delegato viene richiamato, vengono eseguite le eventuali richieste di sicurezza esistenti per il chiamante del delegato.When the delegate is invoked, any existing security demands on the delegate caller are performed.

Quando il codice accetta un Delegate da un codice considerato meno attendibile che potrebbe chiamarlo, assicurarsi di non consentire al codice considerato meno attendibile di eseguire l'escalation delle autorizzazioni.Whenever your code takes a Delegate from less-trusted code that might call it, make sure that you are not enabling the less-trusted code to escalate its permissions. Se si accetta un delegato e lo si usa in un secondo momento, il codice che ha creato il delegato non è nello stack di chiamate e le autorizzazioni non verranno testate se il codice dentro o sotto il delegato tenta di eseguire un'operazione protetta.If you take a delegate and use it later, the code that created the delegate is not on the call stack and its permissions will not be tested if code in or under the delegate attempts a protected operation. Se il proprio codice e il codice del chiamante hanno privilegi più elevati di quelli del creatore, il creatore può orchestrare il percorso di chiamate senza far parte dello stack di chiamate.If your code and the caller code have higher privileges than the creator, the creator can orchestrate the call path without being part of the call stack.

Nella versione 2.0 e versioni successive di .NET FrameworkIn version 2.0 and later versions of the .NET Framework

Diversamente dalle versioni precedenti, versione 2.0 e versioni successive di .NET Framework esegue azioni di sicurezza sul creatore del delegato quando il delegato viene creato e chiamato.Unlike previous versions, version 2.0 and later versions of the .NET Framework performs security action against the delegate creator when the delegate is created and called.

  • Quando viene creato un delegato, le richieste di collegamento sicurezza per il metodo destinazione delegato vengono eseguite sul set di concessioni del creatore del delegato.When a delegate is created, security link demands on the delegate target method are performed against the grant set of the delegate creator. Se si verifica un errore nell'azione di sicurezza, viene generata un'eccezione SecurityException.Failure to satisfy the security action results in a SecurityException.

  • Anche il set di concessioni del creatore del delegato viene acquisito durante la creazione del delegato e archiviato con il delegato.The delegate creator's grant set is also captured during delegate creation and stored with the delegate.

  • Quando il delegato viene richiamato, il set di concessioni acquisito del creatore del delegato viene prima confrontato con eventuali richieste nel contesto corrente se il creatore e il chiamante del delegato appartengono ad assembly diversi.When the delegate is invoked, the delegate creator's captured grant set is first evaluated against any demands in the current context if the delegate creator and caller belong to different assemblies. Vengono poi eseguite eventuali richieste di sicurezza esistenti per il chiamante del delegato.Next, any existing security demands on the delegate caller are performed.

Un particolare caso di protezione con richieste di collegamento è stato rafforzato nell'infrastruttura di sicurezza, ma è ancora una possibile fonte di vulnerabilità nel codice.A special protection case with link demands has been strengthened in the security infrastructure, but it is still a source of possible weakness in your code.

Se il codice completamente attendibile chiama una proprietà, un evento o un metodo protetto da un LinkDemand, la chiamata ha esito positivo se la LinkDemand controllo dell'autorizzazione per il chiamante.If fully trusted code calls a property, event, or method protected by a LinkDemand, the call succeeds if the LinkDemand permission check for the caller is satisfied. Inoltre, se il codice completamente attendibile espone una classe che accetta il nome di una proprietà e chiamate relativo ottenere tramite reflection, la chiamata alla funzione di accesso di ottenere della funzione di accesso ha esito positivo anche se il codice utente non non dispone del diritto di accedere a questa proprietà.Additionally, if the fully trusted code exposes a class that takes the name of a property and calls its get accessor using reflection, that call to the get accessor succeeds even though the user code does not have the right to access this property. In questo modo il LinkDemand controlla solo il chiamante immediato, ovvero il codice completamente attendibile.This is because the LinkDemand checks only the immediate caller, which is the fully trusted code. In pratica, il codice completamente attendibile effettua una chiamata con privilegi per conto del codice utente senza verificare che il codice utente disponga del diritto per eseguire la chiamata.In essence, the fully trusted code is making a privileged call on behalf of user code without making sure that the user code has the right to make that call.

Per evitare tali problemi di sicurezza, common language runtime estende il controllo a una richiesta di percorso stack completo su tutte le chiamate indirette a un metodo, un costruttore, una proprietà o un evento protetto da un LinkDemand.To help prevent such security holes, the common language runtime extends the check into a full stack-walking demand on any indirect call to a method, constructor, property, or event protected by a LinkDemand. Questa protezione comporta costi in termini di prestazioni e richiede modifiche alla semantica del controllo di sicurezza. La richiesta di percorso stack completo potrebbe non riuscire se viene superato il più rapido controllo di un solo livello.This protection incurs some performance costs and changes the semantics of the security check; the full stack-walk demand might fail where the faster, one-level check would have passed.

Wrapper di caricamento assemblyAssembly loading wrappers

Diversi metodi usati per caricare il codice gestito, tra cui Assembly.Load, caricano gli assembly con l'evidenza del chiamante.Several methods used to load managed code, including Assembly.Load, load assemblies with the evidence of the caller. Se si esegue il wrapping di uno di questi metodi, il sistema di sicurezza potrebbe usare le autorizzazioni del codice, invece delle autorizzazioni del chiamante del wrapper, per caricare gli assembly.If you wrap any of these methods, the security system could use your code's permission grant, instead of the permissions of the caller to your wrapper, to load the assemblies. Non è consigliabile consentire al codice considerato meno attendibile di caricare codice a cui sono state concesse autorizzazioni più elevate di quelle del chiamante del wrapper.You should not allow less-trusted code to load code that is granted higher permissions than those of the caller to your wrapper.

In questo modo il codice con attendibilità totale o con un'attendibilità considerevolmente maggiore di quella di un potenziale chiamante (incluso un chiamante con livello di autorizzazioni per Internet) potrebbe indebolire la sicurezza.Any code that has full trust or significantly higher trust than a potential caller (including an Internet-permissions-level caller) could weaken security in this way. Se il codice dispone di un metodo pubblico che accetta una matrice di byte e lo passa al Load, creando così un assembly per conto del chiamante, potrebbe violare la sicurezza.If your code has a public method that takes a byte array and passes it to Assembly.Load, thereby creating an assembly on the caller's behalf, it might break security.

Questo problema si verifica con gli elementi API seguenti:This issue applies to the following API elements:

Demand e LinkDemandDemand vs. LinkDemand

La sicurezza dichiarativa offre due tipi di controlli di sicurezza che, pur essendo simili, eseguono verifiche molto diverse.Declarative security offers two kinds of security checks that are similar but perform very different checks. È importante conoscerli entrambi perché la scelta sbagliata potrebbe indebolire la sicurezza o provocare una riduzione delle prestazioni.You should understand both forms because the wrong choice can result in weak security or performance loss.

La sicurezza dichiarativa offre i controlli di sicurezza seguenti:Declarative security offers the following security checks:

  • Demand specifica il percorso di chiamate nello stack di sicurezza dall'accesso al codice.Demand specifies the code access security stack walk. Tutti i chiamanti nello stack devono disporre dell'identità o dell'autorizzazione specificata per poter passare.All callers on the stack must have the specified permission or identity to pass. Richiesta si verifica a ogni chiamata perché lo stack potrebbe contenere chiamanti diversi.Demand occurs on every call because the stack might contain different callers. Se si chiama un metodo più volte, questo controllo di sicurezza viene eseguito ogni volta.If you call a method repeatedly, this security check occurs each time. Richiesta è una valida protezione contro gli attacchi subdoli; non autorizzata del codice durante il recupero tramite quest'ultimo verrà rilevata.Demand is good protection against luring attacks; unauthorized code trying to get through it will be detected.

  • LinkDemand viene eseguito in fase di compilazione just-in-time (JIT) e controlla solo il chiamante immediato.LinkDemand happens at just-in-time (JIT) compilation time and checks only the immediate caller. Questo controllo di sicurezza non verifica il chiamante del chiamante.This security check does not check the caller's caller. Una volta passato questo controllo, non ne vengono eseguiti altri, indipendentemente dal numero di chiamate effettuate dal chiamante.Once this check passes, there is no additional security overhead no matter how many times the caller might call. Tuttavia, non esiste nemmeno alcuna protezione contro gli attacchi luring.However, there is also no protection from luring attacks. Con LinkDemand, qualsiasi codice che supera il test e può fare riferimento al codice può potenzialmente problemi di sicurezza consentendo al codice dannoso di chiamare usando il codice autorizzato.With LinkDemand, any code that passes the test and can reference your code can potentially break security by allowing malicious code to call using the authorized code. Pertanto, non usare LinkDemand a meno che non possono evitare completamente tutti i possibili punti di debolezza.Therefore, do not use LinkDemand unless all the possible weaknesses can be thoroughly avoided.

    Nota

    Nel .NET Framework 4.NET Framework 4, le richieste di collegamento sono state sostituite dal SecurityCriticalAttribute attributo Level2 assembly.In the .NET Framework 4.NET Framework 4, link demands have been replaced by the SecurityCriticalAttribute attribute in Level2 assemblies. Il SecurityCriticalAttribute equivale a una richiesta di collegamento per l'attendibilità totale, ma influisce anche sulle regole di ereditarietà.The SecurityCriticalAttribute is equivalent to a link demand for full trust; however, it also affects inheritance rules. Per ulteriori informazioni su questa modifica, vedere codice SecurityTransparent, livello 2.For more information about this change, see Security-Transparent Code, Level 2.

Le precauzioni aggiuntive necessarie quando si utilizza LinkDemand devono essere programmate singolarmente; il sistema di sicurezza può offrire un'ulteriore tutela.The extra precautions required when using LinkDemand must be programmed individually; the security system can help with enforcement. Ogni errore crea un punto di debolezza per la sicurezza.Any mistake opens a security weakness. Tutto il codice autorizzato che usa il codice dell'utente deve essere responsabile dell'implementazione di altre misure di sicurezza tramite l'esecuzione delle operazioni seguenti:All authorized code that uses your code must be responsible for implementing additional security by doing the following:

  • Limitare l'accesso del codice chiamante alla classe o all'assembly.Restricting the calling code's access to the class or assembly.

  • Inserire nel codice chiamante gli stessi controlli di sicurezza visualizzati nel codice che viene chiamato e obbligare i chiamanti a fare lo stesso.Placing the same security checks on the calling code that appear on the code being called and obligating its callers to do so. Ad esempio, se si scrive codice che chiama un metodo è protetto con un LinkDemand per il SecurityPermission con il UnmanagedCode flag specificato, il metodo deve anche eseguire un LinkDemand (o Richiesta, che è più affidabile) per l'autorizzazione.For example, if you write code that calls a method that is protected with a LinkDemand for the SecurityPermission with the UnmanagedCode flag specified, your method should also make a LinkDemand (or Demand, which is stronger) for this permission. L'eccezione si verifica se il codice Usa il LinkDemand-metodo protetto in modo limitato che si decide è sicuro, nel codice siano presenti altri meccanismi di protezione di sicurezza (ad esempio, le richieste).The exception is if your code uses the LinkDemand-protected method in a limited way that you decide is safe, given other security protection mechanisms (such as demands) in your code. In questo caso eccezionale, il chiamante si assume la responsabilità di indebolire la protezione della sicurezza nel codice sottostante.In this exceptional case, the caller takes responsibility in weakening the security protection on the underlying code.

  • Garantire che i chiamanti del codice non possano spingere il codice a chiamare il codice protetto per conto loro.Ensuring that your code's callers cannot trick your code into calling the protected code on their behalf. In altre parole, i chiamanti non possono obbligare il codice autorizzato a passare parametri specifici al codice protetto o recuperare i risultati da esso.In other words, callers cannot force the authorized code to pass specific parameters to the protected code, or to get results back from it.

Se un metodo virtuale, una proprietà o un evento con LinkDemand esegue l'override di un metodo della classe base, il metodo della classe di base deve avere lo stesso LinkDemand per il metodo sottoposto a override per avere effetto.If a virtual method, property, or event with LinkDemand overrides a base class method, the base class method must also have the same LinkDemand for the overridden method in order to be effective. Per il codice dannoso è possibile eseguire nuovamente il cast al tipo di base e chiamare il metodo della classe base.It is possible for malicious code to cast back to the base type and call the base class method. Si noti inoltre che le richieste di collegamento possono essere aggiunte in modo implicito agli assembly che non dispongono dell'attributo a livello di assembly AllowPartiallyTrustedCallersAttribute.Also note that link demands can be added implicitly to assemblies that do not have the AllowPartiallyTrustedCallersAttribute assembly-level attribute.

È consigliabile proteggere le implementazioni dei metodi con richieste di collegamento quando anche i metodi di interfaccia dispongono di richieste di collegamento.It is a good practice to protect method implementations with link demands when interface methods also have link demands. Tenere presente quanto segue sull'uso di richieste di collegamento con interfacce:Note the following about using link demands with interfaces:

  • Se si inserisce un LinkDemand in un metodo pubblico di una classe che implementa un metodo di interfaccia di LinkDemand non applicate se si esegue il cast nell'interfaccia e chiamare il metodo.If you place a LinkDemand on a public method of a class that implements an interface method, the LinkDemand will not be enforced if you then cast to the interface and call the method. In questo caso, poiché è stato collegato all'interfaccia, solo il LinkDemand sull'interfaccia viene tenuto in considerazione.In this case, because you linked against the interface, only the LinkDemand on the interface is honored.

Verificare la presenza di problemi di sicurezza negli elementi seguenti:Review the following items for security issues:

  • Richieste di collegamento esplicite nei metodi di interfaccia.Explicit link demands on interface methods. Assicurarsi che le richieste di collegamento offrano la protezione prevista.Make sure these link demands offer the expected protection. Determinare se il codice dannoso può usare un cast per evitare le richieste di collegamento, come descritto in precedenza.Determine whether malicious code can use a cast to get around the link demands as described previously.

  • Metodi virtuali con richieste di collegamento applicate.Virtual methods with link demands applied.

  • Tipi e interfacce implementate.Types and the interfaces they implement. Questi devono usare le richieste di collegamento in modo coerente.These should use link demands consistently.

Vedere ancheSee Also

Linee guida per la generazione di codice sicuroSecure Coding Guidelines