緩衝區溢位對伺服器安全的影響的原理是什麼?
緩衝區溢位(buffer overflow)漏洞,時常出現在我們視線範圍內,它主要是什麼樣的一種漏洞,有什麼危害,原理又是如何呢?
首先我們借用維基百科定義,初識一下什麼是緩衝區溢位:它是指在電腦學上是指標對程式設計缺陷,向程式輸入緩衝區寫入使之溢位的內容(通常是超過緩衝區能儲存的最大資料量的資料),從而破壞程式執行、趁著中斷之際並獲取程式乃至系統的控制權。
接下來向大家介紹緩衝區溢位漏洞的基本原理(希望大家已經瞭解了堆疊的工作原理)。
我們設定了2個函式,一個稱為主調函式,一個稱為被調函式。主調函式是發起功能呼叫的函式,由它呼叫被調函式。在呼叫的過程中,需透過棧這個神奇的事物,完成變數值的傳遞。
主調函式中定義了3個變數,變數A、變數B、變數C(他們不是主角)。
被調函式中定義了2個變數,變數V、變數W(主角登場)。
當主調函式呼叫被調函式過程中,棧中的結構如下圖所示。
在被調函式中,變數“w”是一個8位元組的變數,用於存放字串(每個字元佔用一個位元組,8位元組)。
正常情況下,我們輸入的字串數量最多為8個字元,並賦值給變數“w”,即W=“abcdefgh”。
若存在緩衝區溢位漏洞,缺少對記憶體邊界的檢查,此時輸入超過8位元組的字串,會發生什麼情況呢?
此時,給w變數賦值為“abcd efgh ijkl mnop”,堆疊情況如下圖所示。
如上圖所示,棧中原存放主調函式的返回地址的值,被“mnop”字元覆寫。當棧彈出主調函式的返回地址時,會報下圖出錯。
其中0x706f6e6d,代表返回地址,透過查詢ascII表不難得知,p字母的十六進位制值為“70”,o為“6f”,n為“6e”,m為“6d”,如下圖所示。
【小結】
2017年披露的永恆之藍漏洞,其中就用到了緩衝區溢位原理,實現shell反彈、內網入侵等攻擊目的。
除此之外,已被披露的此類漏洞還有很多,這裡簡單羅列一些:
l Apache HTTP/2緩衝區溢位漏洞(CVE-2020-11984)
l SWFTools堆緩衝區溢位漏洞(CNVD-2021-73189)
l Tuxera NTFS-3G緩衝區溢位漏洞(CNVD-2021-72267)
l IBM Tivoli Workload Scheduler緩衝區溢位漏洞
l Apache Portable Runtime緩衝區溢位漏洞
l libsolv緩衝區溢位漏洞
l Google Chrome緩衝區溢位漏洞
l D-Link DAP-2020堆疊緩衝區溢位漏洞
l Google TensorFlow緩衝區溢位漏洞(CNVD-2021-64528)
l Adobe Bridge緩衝區溢位漏洞
l fig2dev棧緩衝區溢位漏洞(CNVD-2021-68460)
l FFmpeg緩衝區溢位漏洞(CNVD-2021-73206)
最後,簡單的總結一下本文的內容。本文主要透過兩個函式的呼叫,向大家介紹了緩衝區溢位漏洞的原理。不難發現,如若該主調函式返回值(地址),透過溢位方式覆寫成對應著攻擊程式碼入口、軟體認證繞過區域程式碼地址等,將可完成系統攻擊、軟體破解。