CA2124: Incluir cláusulas finally vulnerables en un bloque try externo

Elemento Valor
RuleId CA2124
Category Microsoft.Security
Cambio importante Poco problemático

Causa

En las versiones 1.0 y 1.1 de .NET Framework, un método público o protegido contiene un bloque try/catch/finally. El bloque finally aparece para restablecer el estado de seguridad y no se incluye en un bloque finally.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Esta regla busca bloques try/finally en el código que tiene como destino las versiones 1.0 y 1.1 de .NET Framework que podrían ser vulnerables a filtros de excepciones malintencionados presentes en la pila de llamadas. Si se producen operaciones confidenciales como la suplantación en el bloque try y se produce una excepción, el filtro se puede ejecutar antes del bloque finally. En el ejemplo de suplantación, esto significa que el filtro se ejecutaría como usuario suplantado. Los filtros solo se pueden implementar actualmente en Visual Basic.

Nota

En las versiones 2.0 y posteriores de .NET Framework, el entorno de ejecución protege automáticamente un bloque try/catch/ finally de filtros de excepciones malintencionados, si el restablecimiento se produce directamente dentro del método que contiene el bloque de excepciones.

Cómo corregir infracciones

Coloque el try/finally desencapsulado en un bloque try externo. Vea el segundo ejemplo que se muestra a continuación. Esto obliga a que finally se ejecute antes del código de filtro.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo de pseudocódigo

Descripción

El pseudocódigo siguiente muestra el patrón que detecta esta regla.

try {
   // Do some work.
   Impersonator imp = new Impersonator("John Doe");
   imp.AddToCreditCardBalance(100);
}
finally {
   // Reset security state.
   imp.Revert();
}

El siguiente pseudocódigo muestra el patrón que puede usar para proteger el código y cumplir con esta regla.

try {
     try {
        // Do some work.
     }
     finally {
        // Reset security state.
     }
}
catch()
{
    throw;
}