CA2122 : N'exposez pas indirectement des méthodes avec des demandes de liaison

Élément Valeur
ID de la règle CA2122
Category Microsoft.Security
Modification avec rupture Sans rupture

Cause

Un membre public ou protégé a des demandes de liaison et est appelé par un membre pour lequel aucune vérification de sécurité n’est effectuée.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Une demande de liaison vérifie uniquement les autorisations de l’appelant immédiat. Si un membre X n’applique aucune demande de sécurité sur ses appelants et qu’il appelle du code protégé par une demande de liaison, un appelant sans l’autorisation nécessaire peut utiliser X pour accéder au membre protégé.

Comment corriger les violations

Ajoutez une demande de liaison ou des données et une modélisation de sécurité au membre pour qu’il ne fournisse plus d’accès non sécurisé au membre protégé par la demande de liaison.

Quand supprimer les avertissements

Pour supprimer un avertissement de cette règle de manière sûre, veillez à ce que votre code ne fournisse pas aux appelants l’accès aux opérations ou ressources qui peuvent être utilisées de manière destructrice.

Exemple 1

Les exemples suivants montrent une bibliothèque qui enfreint la règle et une application qui démontre la faiblesse de la bibliothèque. L’exemple de bibliothèque fournit deux méthodes qui, ensemble, enfreignent la règle. La méthode EnvironmentSetting est sécurisée par une demande de liaison pour un accès sans restriction aux variables d’environnement. La méthode DomainInformation n’applique aucune demande de sécurité sur 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);
      }
   }
}

Exemple 2

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 produit la sortie suivante :

*Value from unsecured member: seattle.corp.contoso.com

Voir aussi