應用程式所在系統的資源是有限的:可用磁碟空間、記憶體與運算能力都有上限。一旦某項關鍵系統資源被耗盡,系統就可能開始以意想不到的方式失效,例如不再回應新的網路連線。
當協定處理過程使用動態記憶體時,永遠存在「配置過量」或「忘記釋放已配置區塊」的風險,兩者都會導致記憶體耗盡。最簡單的一種形式,是協定直接依照傳入的絕對數值來動態配置記憶體。
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。配置下去就會佔掉一大塊記憶體,讓應用程式的其他部分都用不到。接著攻擊者慢慢送資料(避免連線因逾時而被關閉),如此重複多次,最終就能把系統的記憶體榨乾。
多數系統在記憶體真正被使用之前不會配置實體記憶體,這在一定程度上限制了對整體系統的衝擊。但在記憶體本來就珍貴、又沒有虛擬記憶體的專用嵌入式系統上,這種攻擊會嚴重得多。