CA2116: I metodi APTCA devono chiamare solo metodi APTCA
TypeName |
AptcaMethodsShouldOnlyCallAptcaMethods |
CheckId |
CA2116 |
Categoria |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Un metodo in un assembly con l'attributo AllowPartiallyTrustedCallersAttribute chiama un metodo in un assembly che non presenta l'attributo.
Descrizione della regola
Per impostazione predefinita, i metodi pubblici o protetti negli assembly con nomi sicuri sono protetti in modo implicito da Richieste di collegamento per l'attendibilità totale; solo i chiamanti totalmente attendibili possono accedere a un assembly con nome sicuro.Gli assembly con nomi sicuri contrassegnati con l'attributo AllowPartiallyTrustedCallersAttribute (APTCA) non presentano questa sicurezza.L'attributo disabilita la richiesta di collegamento, rendendo l'assembly accessibile ai chiamanti non totalmente attendibili, ad esempio l'esecuzione di codice da una rete Intranet o da Internet.
Quando l'attributo APTCA è presente su un assembly totalmente attendibile e l'assembly esegue codice in un altro assembly che non consente chiamanti parzialmente attendibili, è possibile essere in presenza di una violazione della sicurezza.Se due metodi M1 e M2 soddisfano le seguenti condizioni, i chiamanti malintenzionati possono utilizzare il metodo M1 per ignorare la richiesta di collegamento di attendibilità totale implicita che protegge M2:
M1 è un metodo pubblico dichiarato in un assembly totalmente attendibile che presenta l'attributo APTCA.
M1 chiama un metodo M2 al di fuori dell'assembly di M1.
L'assembly di M2 non presenta l'attributo APTCA, pertanto non deve essere eseguito da o per conto di chiamanti parzialmente attendibili.
Un chiamante parzialmente attendibile X può chiamare il metodo M1 facendo in modo che M1 chiami M2.Poiché M2 non presenta l'attributo APTCA, il relativo chiamante immediato (M1) deve soddisfare una richiesta di collegamento per l'attendibilità totale; M1 presenta attendibilità totale e pertanto soddisfa questo controllo.Il rischio di sicurezza è dovuto al fatto che X non contribuisce a soddisfare la richiesta di collegamento che protegge M2 dai chiamanti non attendibili.I metodi con l'attributo APTCA non devono pertanto chiamare metodi che non presentano tale attributo.
Come correggere le violazioni
Se è richiesto l'attributo APCTA, utilizzare una richiesta per proteggere il metodo che esegue la chiamata nell'assembly totalmente attendibile.Le autorizzazioni esatte richieste dipendono dalla funzionalità esposta dal metodo.Se possibile, proteggere il metodo con una richiesta di attendibilità totale per assicurare che la funzionalità sottostante non sia esposta a chiamanti parzialmente attendibili.Se questo non è possibile, selezionare un insieme di autorizzazioni che proteggano efficacemente la funzionalità esposta.Per ulteriori informazioni sulle domande, vedere Richieste.
Esclusione di avvisi
Affinché l'esclusione di un avviso da questa regola sia sicura, è necessario assicurarsi che la funzionalità esposta dal metodo non consenta direttamente o indirettamente ai chiamanti di accedere a informazioni, operazioni o risorse riservate che possano essere utilizzate in modo distruttivo.
Esempio
Nell'esempio riportato di seguito vengono utilizzati due assembly e un'applicazione di test per illustrare la vulnerabilità della sicurezza rilevata da questa regola.Il primo assembly non presenta l'attributo APTCA e non deve essere accessibile ai chiamanti parzialmente attendibili (rappresentato da M2 nella spiegazione precedente).
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This code is compiled into a strong-named
// assembly that requires full trust and does
// not allow partially trusted callers.
namespace AptcaTestLibrary
{
public class ClassRequiringFullTrust
{
public static void DoWork()
{
Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
}
}
}
Il secondo assembly è totalmente attendibile e consente l'accesso a chiamanti parzialmente attendibili (rappresentato da M1 nella spiegazione precedente).
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This assembly executes with full trust and
// allows partially trusted callers.
[assembly:AllowPartiallyTrustedCallers]
namespace AptcaTestLibrary
{
public class AccessAClassRequiringFullTrust
{
public static void Access()
{
// This security check fails if the caller
// does not have full trust.
NamedPermissionSet pset= new NamedPermissionSet("FullTrust");
// This try-catch block shows the caller's permissions.
// Correct code would either not catch the exception,
// or would rethrow it.
try
{
pset.Demand();
}
catch (SecurityException e)
{
Console.WriteLine("Demand for full trust:{0}", e.Message);
}
// Call the type that requires full trust.
// Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
ClassRequiringFullTrust.DoWork();
}
}
}
L'applicazione di test (rappresentata da X nella spiegazione precedente) è parzialmente attendibile.
using System;
using AptcaTestLibrary;
// If this test is run from the local computer, it gets full trust by default.
// Remove full trust.
[assembly:System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse, Name="FullTrust")]
namespace TestSecLibrary
{
class TestApctaMethodRule
{
public static void Main()
{
// Indirectly calls DoWork in the full-trust class.
ClassRequiringFullTrust testClass = new ClassRequiringFullTrust();
testClass.Access();
}
}
}
Questo esempio produce l'output che segue.
Regole correlate
CA2117: I tipi APTCA devono estendere solo tipi di base APTCA
Vedere anche
Concetti
Assembly .NET Framework richiamabili dal codice parzialmente attendibile
Utilizzo di librerie da codice parzialmente attendibile