CA2153: Sérült állapotú kivételek elkerülése

Tulajdonság Érték
Szabályazonosító CA2153
Cím Sérült állapot kivételei kezelésének elkerülése
Kategória Biztonság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

A sérült állapotkivételek (CSE-k) arra utalnak, hogy a folyamatban memóriasérülés található. Ha ezeket elcsípi ahelyett, hogy lehetővé tenné a program összeomlását, biztonsági sebezhetőségekhez vezethet, ha a támadó kihasználási lehetőséget helyezhet el a sérült memóriaterületen.

Szabály leírása

A CSE azt jelzi, hogy egy folyamat állapota sérült, és amelyet a rendszer nem észlelt. Sérült állapot esetén az általános kezelő csak akkor kapja meg a kivételt, ha a metódust az System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute attribútummal jelöli meg. Alapértelmezés szerint a Common Language Runtime (CLR) nem hívja meg a CSE-k kivételkezelőit.

A legbiztonságosabb megoldás, ha engedélyezi a folyamat összeomlását az ilyen típusú kivételek észlelése nélkül. Még a naplózási kód is lehetővé teszi a támadók számára a memóriasérülési hibák kihasználását.

Ez a figyelmeztetés akkor jelenik meg, ha olyan általános kezelővel kapják el a CSE-ket, amely minden kivételt elkap, például catch (System.Exception e) vagy catch kivételparaméter nélkül.

Szabálysértések kijavítása

A figyelmeztetés feloldásához tegye az alábbiak egyikét:

  • Távolítsa el az HandleProcessCorruptedStateExceptionsAttribute attribútumot. Ez visszaáll az alapértelmezett futtatókörnyezeti viselkedésre, ahol a csE-k nem lesznek átadva a fogáskezelőknek.

  • Távolítsa el az általános kivételkezelőt, és használjon olyan kezelőket, amelyek specifikus kivételtípusokat kezelnek. Ilyenek lehetnek a CSE-k, feltéve, hogy a kezelőkód képes biztonságosan kezelni őket (ritka).

  • A CSE újbóli beállítása a fogáskezelőben, amely átadja a kivételt a hívónak, és a futó folyamat befejezését eredményezi.

Mikor kell letiltani a figyelmeztetéseket?

Ne nyomja el a figyelmeztetést ebből a szabályból.

Példa pszeudokódra

Megsértés

Az alábbi pszeudokód a szabály által észlelt mintát mutatja be.

[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

1. megoldás – az attribútum eltávolítása

Az attribútum eltávolítása biztosítja, hogy a HandleProcessCorruptedStateExceptionsAttribute sérült állapot kivételeit a metódus ne kezelje.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

2. megoldás – adott kivételek elfogása

Távolítsa el az általános fogáskezelőt, és csak bizonyos kivételtípusokat fog.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (IOException e)
    {
        // Handle IOException.
    }
    catch (UnauthorizedAccessException e)
    {
        // Handle UnauthorizedAccessException.
    }
}

3. megoldás – újradobás

A kivétel újbóli megismétlése.

[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Rethrow the exception.
        throw;
    }
}