Partager via


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 Accès aux données et modélisation des données 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 :

  

Voir aussi

Concepts

Instructions de codage sécurisé

Demandes de liaison

Autres ressources

Accès aux données et modélisation des données