應用程式所在系統的資源是有限的:可用磁碟空間、記憶體與運算能力都有上限。一旦某項關鍵系統資源被耗盡,系統就可能開始以意想不到的方式失效,例如不再回應新的網路連線。

當協定處理過程使用動態記憶體時,永遠存在「配置過量」或「忘記釋放已配置區塊」的風險,兩者都會導致記憶體耗盡。最簡單的一種形式,是協定直接依照傳入的絕對數值來動態配置記憶體

def read_buffer()
{
  byte buf[];
  uint32 len;
  int i = 0;

  // Read the number of bytes from the network
  len = read_uint32();

  // Allocate memory buffer
  buf = malloc(len);      /* 攻擊者說多大就配多大 */

  // Allocate bytes from network
  read_bytes(buf, len);

  printf("Read in %d bytes\n", len);
}

程式先讀入一個無號 32 位元整數作為長度,在真正讀取網路資料之前就配置該長度的緩衝區,最後才把資料讀進來。

攻擊者可以輕易指定一個很大的長度,例如 2 GB。配置下去就會佔掉一大塊記憶體,讓應用程式的其他部分都用不到。接著攻擊者慢慢送資料(避免連線因逾時而被關閉),如此重複多次,最終就能把系統的記憶體榨乾。

多數系統在記憶體真正被使用之前不會配置實體記憶體,這在一定程度上限制了對整體系統的衝擊。但在記憶體本來就珍貴、又沒有虛擬記憶體的專用嵌入式系統上,這種攻擊會嚴重得多。