6.10. „Erőforrás kimerítés” (Resource Depletion - Asymmetric resource consumption (amplification))

6.10.1. Leírás

A támadó arra kényszeríti az áldozatot, hogy több erőforrást használjon, mint amennyi a támadó hozzáférési szintjével engedélyezve van. A program valószínűleg nem, vagy csak hibásan szabadítja föl a rendszer egy erőforrását. Az erőforrás nem lett rendesen kiürítve és előkészítve az újbóli felhasználásra.

6.10.2. PÉLDÁK

6.10.2.1. Példa 1

A következő metódus sosem fogja bezárni a saját maga által megnyitott fájl kezelőt/számlálót (file handle). The  method for A StreamReader Finalize() metódusa végül meghívja a Close() metódust, de semmi sem tudja megmondani, hogy mennyi időbe fog telni, mielőtt a Finalize() működésbe lépne. Valójában semmi garancia nincs arra, hogy a Finalize() egyáltalán működésbe fog lépni. Egy terhelt környezetben ez azt eredményezheti, hogy a VM felhasználja az összes rendelkezésére álló fájl számlálót.

  private void processFile(string fName) {
  StreamWriter sw = new
    StreamWriter(fName);
    string line;
    while ((line = sr.ReadLine()) != null) processLine(line);
   }
            

Miután minden fájl számlálót (fájl leírót) felhasznált, a VM nagyon instabillá válhat, lelassulhat, vagy determinisztikusan megszakíthatja a működést a korábbi állapotához képest.

6.10.2.2. Példa 2

Normál körülmények között az alábbi C# kód egy adatbázis lekérdezést hajt végre, feldolgozza a az adatbázis által adott eredményt és bezárja a hozzá társított SqlConnection objektumot. De ha egy kivétel történik az SQL vagy az eredmények feldolgozása közben, akkor az SqlConnection objektum fog bezáródni. Ha ez elég sokszor megtörténik, akkor az adatbázis ki fog futni a rendelkezésére álló kurzorokból és nem fog tudni több SQL lekérdezést végrehajtani.

C# példa:

      ...
   SqlConnection conn = new SqlConnection(connString);
   SqlCommand cmd = new SqlCommand(queryString);
   cmd.Connection = conn; conn.Open();
   SqlDataReader rdr = cmd.ExecuteReader();
   HarvestResults(rdr);
   conn.Connection.Close();
   ...

Az adatbázishoz kapcsolódó egybeeső kapcsolatok száma gyakran alacsonyabb, mint a rendszer által maximálisan használható számlálók száma. Ez megkönnyíti az alkalmazások szűk keresztmetszetének a megtalálását és a felhasználásukat arra, hogy leállítsuk instabillá tegyük az alkalmazás működését.

6.10.2.3. Példa 3

Ha az N egybeeső kapcsolatot kezelni tudó alkalmazásba nincsenek beépítve megfelelő mechanizmusok a kliensek leválasztására (például időkorlátok (TIMEOUT)), akkor nagyon könnyen működésképtelenné tehető úgy, hogy N-hez közeli számú kapcsolatot hozunk létre. Ráadásképpen ezek a kapcsolatok munkát is szimulálnak az alkalmazással, addig használva a protokolljait, amíg föl nem emésztenek minden rendelkezésre álló erőforrást.