什麼是緩衝區溢位?

當程式向緩衝區中寫入的資料使該緩衝區的容量過載時,就會發生緩衝區溢位。這就像將 12 盎司的牛奶倒入 8 盎司的杯子中。

學習目標

閱讀本文後,您將能夠:

  • 定義緩衝區
  • 解釋緩衝區溢位及其如何被用於網路攻擊
  • 瞭解誰最容易受到攻擊以及如何防範緩衝區溢位攻擊

相關內容


想要繼續瞭解嗎?

訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!

請參閱 Cloudflare 的隱私權政策,了解我們如何收集和處理您的個人資料。

複製文章連結

什麼是緩衝區溢位?

緩衝區溢位是一種異常現象,當軟體向緩衝區中寫入資料使緩衝區容量溢出時,會導致相鄰記憶體位置被覆寫。換句話說,過量的資訊被傳遞到沒有足夠空間的容器中,而這些資訊最終會取代相鄰容器中的資料。

攻擊者可以利用緩衝區溢位修改電腦的記憶體,以破壞或控制程式的執行。

緩衝區溢位

什麼是緩衝區?

緩衝區或資料緩衝區是一個實體記憶體儲存區,用於在將資料從一個位置移到另一位置時臨時儲存資料。這些緩衝區通常位於 RAM 記憶體中。電腦經常使用緩衝區來協助提高效能。大多數現代硬碟都利用緩衝的優勢來有效地存取資料,並且許多線上服務也使用緩衝區。例如,線上影片串流處理服務經常使用緩衝區以防止中斷。影片串流時,影片播放程式一次下載並儲存 20% 的影片到緩衝區,然後從該緩衝區進行串流。這樣,連線速度的小幅下降或快速的服務中斷都不會影響影片串流效能。

緩衝區被設計為容納特定數量的資料。除非利用緩衝區的程式具有內建指令以在將太多資料傳送到緩衝區時丟棄資料,否則程式將覆寫緩衝區附近的記憶體中的資料。

攻擊者可以利用緩衝區溢位來破壞軟體。儘管這個隱患得到了很好的理解,但緩衝區溢位攻擊仍然是困擾網路安全團隊的主要安全問題。2014 年,由於 SSL 軟體中的緩衝區溢位漏洞,一種被稱為「heartbleed」的威脅使億萬使用者受到攻擊。

攻擊者如何利用緩衝區溢位?

攻擊者可以故意將精心製作的輸入饋入程式,程式會嘗試將該輸入儲存在不夠大的緩衝區中,因此輸入會覆寫連接到緩衝區空間的部分記憶體。如果程式的記憶體配置定義明確,則攻擊者可以故意覆寫已知包含可執行代碼的區域。然後,攻擊者可以用自己的可執行代碼替換這些代碼,這可以大大改變程式的運作方式。

例如,如果記憶體中的被覆寫部分包含一個指標(指向記憶體中另一個位置的物件),則攻擊者的代碼可以用另一個指向漏洞利用負載的指標來替換該代碼。這樣就可以將整個程式的控制權轉移給攻擊者的代碼。

誰容易受到緩衝區溢位攻擊?

某些編碼語言比其他語言更容易發生緩衝區溢位。C 和 C++ 是兩種具有高漏洞的常用語言,因為它們不包含內建的保護措施以防止存取或覆寫記憶體中的資料。Windows、Mac OSX 和 Linux 都包含用這兩種語言編寫的代碼。

Java、PERL 和 C# 等更現代的語言具有內建功能,可幫助減少緩衝區溢位的機會,但不能完全阻止緩衝區溢位。

如何防範緩衝區溢位攻擊

幸運的是,現代作業系統具有執行階段保護,可幫助緩解緩衝區溢位攻擊。我們來探討有助於緩解漏洞利用風險的 2 種常見保護措施:

  • 位址空間隨機化:隨機重新排列處理序的關鍵資料區的位址空間位置。緩衝區溢位攻擊通常依賴於瞭解重要的可執行代碼的確切位置,位址空間隨機化讓攻擊者幾乎無法瞭解這些位置。
  • 防止資料執行:將記憶體的某些區域標記為可執行或不可執行,防止漏洞利用執行不可執行區域中的代碼。

軟體開發人員還可以透過使用具有內建保護的語言編寫或在其代碼中使用特殊的安全性程序,來預防緩衝區溢位漏洞。

儘管存在上述預防措施,但開發人員仍然會發現新的緩衝區溢位漏洞,有時是在遭遇成功的漏洞利用之後。發現新漏洞時,工程師需要修補受影響的軟體,並確保該軟體的使用者可以獲取修補程式。

緩衝區溢位攻擊有哪些不同類型?

緩衝區溢位攻擊有很多類型,它們採用不同的策略並針對不同的代碼片段。以下是一些最著名的類型。

  • 堆疊溢位攻擊:這是最常見的緩衝區溢位攻擊類型,涉及到呼叫堆疊*上的緩衝區溢位。
  • 堆積溢位攻擊:這種類型的攻擊針對開放記憶體集區中稱為堆積*的資料。
  • 整數溢位攻擊:在整數溢位中,算術運算得出的整數對用於儲存它的整數類型來說太大;這可能導致緩衝區溢位。
  • Unicode 溢位:Unicode 溢位是指將 Unicode 字元插入需要 ASCII 字元的輸入中,導致緩衝區溢位。(ASCII 和 unicode 是使電腦呈現文字的編碼標準。例如,字母「a」由 ASCII 中的數字 97 表示。雖然 ASCII 代碼僅用於表達西方語言中的字元,但 unicode 可以為地球上幾乎所有書面語言建立字元。因為 unicode 中有更多可用的字元,所以許多 unicode 字元大於最大的 ASCII 字元。)

*電腦依賴於兩種不同的記憶體配置模型,稱為堆疊和堆積;兩者都位於電腦的 RAM 中。堆疊結構整齊,並以「後進先出」的模型保存資料。最後放入堆疊中的任何資料都將首先發出,就像是插入彈夾中的最後一顆子彈將被首先發射一樣。堆積則是雜亂無章的額外記憶體集區,資料不會以任何特定順序進入或離開堆積。由於從堆疊存取記憶體比從堆積存取快得多,因此通常將堆積保留為供較大的資料段或程式設計師想要顯式管理的資料使用。