CA2122: No exponer indirectamente métodos con peticiones de vínculos
Nombre de tipo |
DoNotIndirectlyExposeMethodsWithLinkDemands |
Identificador de comprobación |
CA2122 |
Categoría |
Microsoft.Security |
Cambio problemático |
No |
Causa
Un miembro público o protegido tiene un Peticiones de vínculos y es llamado por un miembro que no realiza ninguna comprobación de seguridad.
Descripción de la regla
Una solicitud de vínculo sólo comprueba los permisos del llamador inmediato. Si un miembro X no realiza ninguna solicitud de seguridad de sus llamadores y llama al código protegido mediante una solicitud de vínculo, un llamador sin el permiso necesario puede utilizar X para obtener acceso al miembro protegido.
Cómo corregir infracciones
Agregue una solicitud de seguridad Acceso a datos y modelado o de vínculo al miembro de modo que no proporcione más acceso no seguro al miembro protegido por solicitud de vínculo.
Cuándo suprimir advertencias
Para suprimir de forma segura una advertencia de esta regla, debe asegurarse de que el código no conceda a sus llamadores acceso a las operaciones o recursos que se puedan usar de forma destructiva.
Ejemplo
Los ejemplos siguientes muestran una biblioteca que infringe la regla y una aplicación que muestra la debilidad de la biblioteca. La biblioteca de ejemplos proporciona dos métodos que juntos infringen la regla. Una solicitud de vínculo protege al método EnvironmentSetting de un acceso no restringido a las variables de entorno. El método DomainInformation no realiza ninguna solicitud de seguridad de sus llamadores antes de llamar a 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);
}
}
}
La aplicación siguiente llama al miembro de biblioteca no seguro.
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);
}
}
}
}
Este ejemplo produce el siguiente resultado.
Vea también
Conceptos
Instrucciones de codificación segura