Condividi tramite


CA2122: Non esporre in modo indiretto metodi con richieste di collegamento

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Category

Microsoft.Security

Breaking Change

Non sostanziale

Causa

Un membro pubblico o protetto presenta un Richieste di collegamento ed è chiamato da un membro che non esegue alcun controllo della sicurezza.

Descrizione della regola

Una richiesta di collegamento controlla esclusivamente le autorizzazioni del chiamante immediato. Se un membro X non effettua richieste di sicurezza dei relativi chiamanti e chiama codice protetto da una richiesta di collegamento, un chiamante privo dell'autorizzazione necessaria potrà utilizzare X per accedere al membro protetto.

Come correggere le violazioni

Aggiungere un Accesso ai dati e modellazione di sicurezza o una richiesta di collegamento al membro in modo che non fornisca più accesso non protetto al membro protetto dalla richiesta di collegamento.

Esclusione di avvisi

Per escludere in modo sicuro un avviso da questa regola, è necessario assicurarsi che il codice non conceda ai chiamanti l'accesso a operazioni o risorse che possono essere utilizzate in modo distruttivo.

Esempio

Negli esempi riportati di seguito vengono illustrate una libreria che viola la regola e un'applicazione che mette in evidenza i punti deboli della libreria. Nella libreria di esempio sono contenuti due metodi che insieme violano la regola. Il metodo EnvironmentSetting è protetto da una richiesta di collegamento per l'accesso illimitato alle variabili di ambiente. Il metodo DomainInformation non effettua richieste di sicurezza dei relativi chiamanti prima di chiamare 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'applicazione riportata di seguito chiama il membro della libreria non protetto.

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);
         }
      }
   }
}

Questo esempio produce l'output che segue.

  

Vedere anche

Concetti

Linee guida per la generazione di codice sicuro

Richieste di collegamento

Altre risorse

Accesso ai dati e modellazione