CA2122 : N'exposez pas indirectement des méthodes avec des demandes de liaison
TypeName |
DoNotIndirectlyExposeMethodsWithLinkDemands |
CheckId |
CA2122 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Modification sans rupture |
Cause
Un membre public ou protégé présente un Demandes de liaison et est appelé par un membre qui ne procède à aucune vérification de la sécurité.
Description de la règle
Une demande de liaison vérifie uniquement les autorisations de l'appelant immédiat.Si un membre X n'effectue aucune des demandes de sécurité de ses appelants, et appelle un code protégé par une demande de liaison, un appelant dépourvu de l'autorisation nécessaire peut utiliser X pour accéder au membre protégé.
Comment corriger les violations
Ajoutez une Données et modélisation dans le .NET Framework de sécurité ou une demande de liaison au membre afin qu'il ne fournisse plus d'accès non sécurisé au membre protégé par demande de liaison.
Quand supprimer les avertissements
Pour supprimer sans risque un avertissement de cette règle, vous devez vous assurer que votre code ne donne aux appelants aucun accès à des opérations ou des ressources susceptibles d'être utilisées de façon néfaste.
Exemple
Les exemples suivants présentent une bibliothèque qui viole la règle, et une application qui montre la faiblesse de la bibliothèque.La bibliothèque exemple fournit deux méthodes qui, ensemble, violent la règle.La méthode EnvironmentSetting est sécurisée par une demande de liaison pour un accès illimité aux variables d'environnement.La méthode DomainInformation n'effectue aucune des demandes de sécurité de ses appelants avant d'appeler EnvironmentSetting.
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
public class DoNotIndirectlyExposeMethodsWithLinkDemands
{
// Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
public static string DomainInformation()
{
return EnvironmentSetting("USERDNSDOMAIN");
}
// Library method with link demand.
// This method holds its immediate callers responsible for securing the information.
// Because a caller must have unrestricted permission, the method asserts read permission
// in case some caller in the stack does not have this permission.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public static string EnvironmentSetting(string environmentVariable)
{
EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
envPermission.Assert();
return Environment.GetEnvironmentVariable(environmentVariable);
}
}
}
L'application suivante appelle le membre de bibliothèque non sécurisé.
using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;
// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
class TestUnsecured
{
[STAThread]
static void Main(string[] args)
{
string value = null;
try
{
value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
}
catch (SecurityException e)
{
Console.WriteLine(
"Call to unsecured member was stopped by code access security! {0}",
e.Message);
throw;
}
if (value != null)
{
Console.WriteLine("Value from unsecured member: {0}", value);
}
}
}
}
Cet exemple génère la sortie suivante.