Los métodos APTCA sólo deberían llamar a métodos APTCA
Actualización: noviembre 2007
Nombre de tipo |
AptcaMethodsShouldOnlyCallAptcaMethods |
Identificador de comprobación |
CA2116 |
Categoría |
Microsoft.Security |
Cambio problemático |
Sí |
Motivo
Un método de un ensamblado con el atributo System.Security.AllowPartiallyTrustedCallersAttribute llama a un método de un ensamblado que no tiene el atributo.
Descripción de la regla
De forma predeterminada, los métodos públicos o protegidos de los ensamblados con nombres seguros quedan protegidos de forma implícita mediante Peticiones de vínculos de plena confianza; sólo los llamadores de plena confianza pueden obtener acceso a un ensamblado con nombre seguro. Los ensamblados con nombre seguro marcados con el atributo AllowPartiallyTrustedCallersAttribute (APTCA) no tienen esta protección. El atributo deshabilita una solicitud de vínculo haciendo que los llamadores que no tienen plena confianza puedan obtener acceso al ensamblado, como la ejecución de código desde una intranet o Internet.
Si está presente el atributo APTCA en un ensamblado con plena confianza y el ensamblado ejecuta código en otro ensamblado que permite llamadores parcialmente confiables, se puede producir un ataque en el sistema de seguridad. Si dos métodos M1 y M2 cumplen las condiciones siguientes, los llamadores malintencionados pueden hacer que el método M1 omita la solicitud implícita de vínculo de plena confianza que protege M2:
M1 es un método público declarado en un ensamblado de plena confianza que tiene el atributo APTCA.
M1 llama a un método M2 fuera del ensamblado de M1.
El ensamblado de M2 no tiene el atributo APTCA y, por consiguiente, no debería ejecutarse por los llamadores que no son de plena confianza ni en su nombre.
Un llamador X que no es de plena confianza puede llamar al método M1, provocando que M1 llame a M2. Puesto que M2 no tiene el atributo APTCA, el llamador inmediato (M1) debe cumplir la solicitud de vínculo de plena confianza; M1 es de plena confianza y, por tanto, supera esta comprobación. El riesgo de seguridad es porque X no participa en el cumplimiento de la solicitud de vínculo que protege M2 que no es de confianza. Por lo tanto, los métodos con el atributo APTCA no deben llamar a métodos que no tengan el atributo.
Cómo corregir infracciones
Si el atributo APCTA es necesario, utilice un Acceso a datos para proteger el método que llama en el ensamblado de plena confianza. Los permisos exactos que se solicitan dependerán de la funcionalidad expuesta por el método. Si es posible, proteja el método con una solicitud de plena confianza para asegurarse de que la funcionalidad subyacente no se expone a llamadores que no son de plena confianza. Si esto no es posible, seleccione un conjunto de permisos que proteja eficazmente la funcionalidad expuesta.
Cuándo suprimir advertencias
Para suprimir una advertencia de esta regla de forma segura, debe asegurase de que la funcionalidad expuesta por el método no permite directa ni indirectamente que los llamadores tengan acceso a información confidencial, operaciones o recursos que se puedan usar de forma destructiva.
Ejemplo
El ejemplo siguiente utiliza dos ensamblados y una aplicación de prueba para mostrar la vulnerabilidad de seguridad detectada por esta regla. El primer ensamblado no tiene el atributo APTCA y los llamadores que no son de plena confianza no deberían tener acceso a él (representado por M2 en la explicación anterior).
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This code is compiled into a strong-named
// assembly that requires full trust and does
// not allow partially trusted callers.
namespace AptcaTestLibrary
{
public class ClassRequiringFullTrust
{
public static void DoWork()
{
Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
}
}
}
El segundo ensamblado es de plena confianza y permite el acceso de llamadores que no son de plena confianza (representado por M1 en la explicación anterior).
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This assembly executes with full trust and
// allows partially trusted callers.
[assembly:AllowPartiallyTrustedCallers]
namespace AptcaTestLibrary
{
public class AccessAClassRequiringFullTrust
{
public static void Access()
{
// This security check fails if the caller
// does not have full trust.
NamedPermissionSet pset= new NamedPermissionSet("FullTrust");
// This try-catch block shows the caller's permissions.
// Correct code would either not catch the exception,
// or would rethrow it.
try
{
pset.Demand();
}
catch (SecurityException e)
{
Console.WriteLine("Demand for full trust:{0}", e.Message);
}
// Call the type that requires full trust.
// Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
ClassRequiringFullTrust.DoWork();
}
}
}
La aplicación de prueba (representada por X en la explicación anterior) no es de plena confianza.
using System;
using AptcaTestLibrary;
// If this test is run from the local computer, it gets full trust by default.
// Remove full trust.
[assembly:System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse, Name="FullTrust")]
namespace TestSecLibrary
{
class TestApctaMethodRule
{
public static void Main()
{
// Indirectly calls DoWork in the full-trust class.
ClassRequiringFullTrust a = new ClassRequiringFullTrust();
a.Access();
}
}
}
Este ejemplo produce el siguiente resultado.
Demand for full trust:Request failed.
ClassRequiringFullTrust.DoWork was called.
Reglas relacionadas
Los tipos APTCA se deberían extender en tipos base APTCA
Vea también
Conceptos
Ensamblados de .NET Framework marcados con AllowPartiallyTrustedCallersAttribute
Utilizar bibliotecas de código que no es de plena confianza