Condividi tramite


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

Articolo Valore
ID regola CA2122
Category Microsoft.Security
Modifica Nessuna interruzione

Causa

Un membro pubblico o protetto dispone di richieste di collegamento e viene chiamato da un membro che non esegue alcun controllo di sicurezza.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Una richiesta di collegamento controlla esclusivamente le autorizzazioni del chiamante immediato. Se un membro X non richiede la sicurezza dei chiamanti e chiama il codice protetto da una richiesta di collegamento, un chiamante senza l'autorizzazione necessaria può usare X per accedere al membro protetto.

Come correggere le violazioni

Aggiungere una richiesta di dati di sicurezza e modellazione o collegamento al membro in modo che non fornisca più l'accesso non sicuro al membro protetto dalla richiesta di collegamento.

Quando eliminare gli avvisi

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

Esempio 1

Gli esempi seguenti illustrano una libreria che viola la regola e un'applicazione che dimostra la debolezza della libreria. La libreria di esempio fornisce due metodi che insieme violano la regola. Il EnvironmentSetting metodo è protetto da una richiesta di collegamento per l'accesso senza restrizioni alle variabili di ambiente. Il DomainInformation metodo non richiede la sicurezza dei 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);
      }
   }
}

Esempio 2

L'applicazione seguente 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);
         }
      }
   }
}

Nell'esempio viene prodotto l'output seguente:

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

Vedi anche