伍紅文 王曉明 周 柯 鄒建明 巫聰云 溫文劍
1(廣西電網有限責任公司梧州供電局 廣西梧州 543002)
2(廣西電網有限責任公司電力科學研究院 南寧 530023)
3(廣西電網有限責任公司電力調度控制中心 南寧 530023)
(wu_hw.wzg@gx.csg.cn)
智能電網是一個融合電力系統、通信網絡、計算機系統以及信息技術的復雜大電網系統,是網電空間 (cyberspace)的一個分支[1].在電網安全的研究中,針對智能電網系統漏洞的攻防是一個經久不衰的話題.在軟件開發過程中,由于開發者的疏忽或對底層技術的理解不夠深刻,都可能導致漏洞的產生,使得服務器設備對于攻擊者而言成為一個具有極高價值的攻擊目標.
1) 研究背景.
電網系統B/S架構或C/S架構中的用戶端如果被攻擊者控制,其后果是用戶個人信息被劫持、用戶在網絡上的身份被偽造或濫用.然而對于電網系統服務器端的設備或軟件而言,安全漏洞造成的危害更加嚴重,可能導致服務器權限被竊取.另一種可能是由于一臺服務器被控制,內網被暴露至外網,使得所有用戶數據以及企業內部數據都處于危機當中.
在對以上這些目標的攻擊中,往往需要采用多種漏洞形式配合的方式.其中2類控制能力最強的漏洞就是任意地址讀寫漏洞和遠程代碼執行漏洞.
根據攻擊目標的不同,遠程代碼執行漏洞的攻擊分為不同的方式,其中一種目標為二進制目標,是直接運行在目標機器上的原生服務,采用傳輸控制協議(transmission control protocol, TCP)或用戶數據報協議(user datagram protocol, UDP)通信.如果在已獲取到針對二進制原生服務遠程代碼執行漏洞的攻擊流量的前提下,能通過自動化的分析重現漏洞過程,可以快速分析出攻擊流量中用到的漏洞具體位置、成因等信息或是提取出攻擊過程作為后備武器.
2) 相關工作.
Avgerinos等人[2]在2014年AEG(automatic exploit generation)一文中提出了自動化漏洞利用的概念,將自動化漏洞利用定義為自動化尋找漏洞存在并針對安全漏洞生成漏洞利用,其主要針對在無攻擊流量前提下的自動化漏洞利用.在此基礎上文獻[3-4]提出了基于符號執行等程序分析方法的自動化漏洞利用方法.
Bao等人[5]在2017年曾提出一種用于自動化對漏洞利用中的shellcode進行移植的方法,這一點與本文研究的將漏洞利用過程進行更換目標較為類似,不過該方法需要擁有漏洞利用過程,并非對網絡攻擊流量進行處理.Newsome[6]在2005年提出了對攻擊流量進行動態污點分析的方法,該方法通過動態污點分析,對網絡流量中出現的針對漏洞的攻擊進行了檢測.但該文沒有進一步更換目標進行自動化漏洞利用.
本文主要研究在具有網絡流量前提下的智能電網系統遠程代碼執行漏洞的分析與重現,在發現漏洞利用的存在性后需要重現漏洞,與目前存在的工作均有一定區別.
3) 研究目的.
本文將探究在存在針對內存破壞類型的遠程代碼執行漏洞的TCP攻擊流量的前提下完成對同一目標同一環境利用過程的重現.在利用過程未采用暴力破解手段時,使得漏洞利用過程可以針對不同智能電網多次利用.
本節將介紹內存破壞漏洞的幾種主要類型,針對內存破壞漏洞的保護手段及繞過方法,為后文討論難點及電網系統設計提供必要的背景知識.
在C,C++等底層語言中,為了對內存分配過程進行精確控制,一般采用手動分配方式進行內存管理.這種內存管理方式比垃圾收集器[7]更加高效和精確,程序員能精確地控制分配和釋放的時間,使系統的整體延時更低,但也帶來了一定的問題.由于內存的分配、使用和釋放都由程序員自行控制,在這個過程中,程序員可能會錯誤地使用內存,嚴重時則可以直接導致攻擊者完全控制目標系統.上述類型的漏洞被稱為內存破壞漏洞或內存損壞漏洞[8].
軟件安全的攻擊技術主要有2類,分別為Web應用攻擊技術和二進制攻擊技術.本節將對二進制安全漏洞類型進行簡要介紹.
1.1.1 緩沖區溢出漏洞
緩沖區溢出漏洞是目前最為嚴重的安全問題之一[9],指在程序員對內存進行分配時,錯誤地計算分配內存的大小,在使用內存區域時使用了超出分配內存邊界的內存空間,導致使用到的內存空間實際為無效內存.而該無效內存中可能存放有程序中其他位置需要的數據結構,導致其數據結構被破壞.在執行流程被控制后就可以通過精確的構造方法完成任意代碼的執行,使得漏洞轉化為最為嚴重的任意代碼執行漏洞.
1.1.2 use-after-free漏洞
除緩沖區溢出漏洞以外,另一種具有極大風險的內存破壞漏洞則是use-after-free漏洞[8].這種漏洞會導致用戶輸入內容可能被存放于已釋放內存中,根據堆管理實現機制的不同,部分實現機制的已釋放內存與已分配內存存在內存空間上的復用[10].
1.1.3 Double-free漏洞
Double-free漏洞與use-after-free漏洞類似,同樣由于程序員錯誤地使用內存分配和釋放機制導致.Double-free漏洞的原理為程序員在內存釋放后未對指針進行清空,之后錯誤地再次對該指針進行釋放.
1.1.4 格式化字符串漏洞
格式化字符串漏洞[9]是指程序員在使用scanf,printf等C語言中的格式化字符串函數時,錯誤地將用戶輸入作為格式化字符串進行輸入或輸出,使用戶可以控制格式化字符串內容.這種情況下,攻擊者就可以通過傳入構造的格式化字符串,使額外數據按照傳參規則被輸出.
內存破壞漏洞在早期智能電網系統中極為常見,后來又陸續發展出一些有效的緩解技術保護系統.
1.2.1 數據不可執行與繞過
在漏洞利用過程中,當攻擊者擁有一次性控制目標程序執行流程的能力時,為進一步控制目標程序執行多條指令,可采用稱為shellcode的技術[11].針對這類攻擊方法的緩解措施被命名為數據不可執行保護[12],該方法可以有效防止shellcode技術的使用,不過一種被稱為面向返回地址編程[13]的新型技術可以繞過該保護機制.
1.2.2 地址空間隨機化與繞過
在系統內存破壞漏洞利用中,地址空間信息是可以被利用的關鍵信息.通過以頁為單位的隨機化,既不影響程序原有的運行過程,又使得攻擊者無法預測隨機后的基地址,從而使得需要預測內存空間的地址的攻擊無效[14].針對這類保護,攻擊者需要通過與其他漏洞進行配合,利用其他漏洞將目標進程的地址信息泄露,從而完成漏洞利用過程.
本文研究的目的是通過攻擊流量重現漏洞利用,一種最樸素的方法就是直接將攻擊流量重放,完整將攻擊流量再次輸出到另一目標.然而這種方式在二進制內存破壞漏洞利用的重現上會面臨諸多問題.
2.1.1 TCP流量記錄不穩定性
二進制原生服務常使用C,C++等底層語言編寫,使用TCP協議網絡通信.TCP網絡通信與HTTP等應用層協議相比更為底層,所以在原生服務上往往通信過程更加底層,封裝更為簡陋,甚至缺少封裝.由于缺少如HTTP等應用層標準協議的封裝,流量捕獲一般也是在TCP協議層級進行捕獲,導致捕獲過程存在不穩定性或重現失敗.
2.1.2 地址空間隨機化繞過重現
在攻擊流量的分析過程中,對地址空間隨機化繞過會影響漏洞重現.繞過時如果存在地址空間隨機化就需要通過利用漏洞進行地址信息泄露.這就需要對已記錄的遠程代碼執行漏洞的流量中識別地址空間隨機化繞過過程,以及識別后重現,從而可以完成多次重現的目標.
系統主要分為3個部分,如圖1所示.通過網絡流量預處理部分對系統進行整體初始化、環境搭建和流量清洗處理,為后續的分析部分提供條件和數據輸入,經過配置可以對其他遠程服務重現攻擊流程完成自動化漏洞利用重現.
2.2.1 網絡流量的預處理
系統啟動首先會經過網絡流量預處理部分.該部分主要工作為對已抓取流量進行格式解析并清洗流量以及服務準備.在現代流量抓取軟件中,常用PCAPNG[15]作為流量抓取記錄格式.流量清洗主要工作為將已解析以及按流結構進行處理后的流量初步按照端口號和根據部分篩選規則進行清洗,提高流量的處理效率.
服務準備部分包括目標服務準備和影子服務準備.目標服務指在分析過程中,本地預備的與原攻擊流量的遠程環境相同的目標靶機環境.影子服務是通過配置與受攻擊系統盡量相同的環境,使本地運行與受攻擊環境幾乎相同的環境,但是需保留一定的控制權限.目標服務與影子服務的對比如圖2所示:

圖2 目標服務(靶機)與影子服務對比
2.2.2 網絡流量自動化分析
流量分析部分為本系統的核心模塊,其主要工作為利用影子服務對已記錄流量進行分析從而提取流量內的地址信息,恢復已記錄流量的地址空間信息.由于地址空間隨機化攻擊的繞過本質上是部分恢復遠程服務地址空間信息,在繞過過程中需要進行地址信息泄露攻擊,獲取到目標進程地址空間的信息,所以通過一定的分析,可以推斷出攻擊載荷中的地址信息.
流量同步處理主要方法為按照已記錄流量的收發情況,在影子服務上同步操作.根據已記錄流量中的發送長度和接收次數同步發送和接收,發送和接收到的具體數據進一步處理.這一部分需要對包結構進行處理,對TCP流中由于不穩定產生的包拆分情況進行合并,合并過程在發送端和接收端稍有不同.
流量補齊階段是針對發送或是接收過程中,影子服務和已記錄流量中數據長度不同處理的.由于接收過程中高位地址為空字節導致長度不一致的情況,可以通過對地址信息進行處理使長度一致.流量補齊的模型被設置為通過補充空字節使2部分網絡流量之間的差距最小,這個模型可采用動態規劃的算法解決.如圖3所示,通過補充紅色部分的空字節,讓2部分流量趨于一致,使得后續分析過程中不會由于地址字節不全導致字節錯位.

圖3 流量補齊示例
地址提取階段是在發送或是接收過程中嘗試提取數據中的地址數據.過程如圖4所示,如果該數據能夠確認位于影子服務的地址空間中,按照同步處理的方法,可以將該部分數據對應到原服務數據中,從而確認原服務中的地址數據位置.

圖4 地址提取過程
在地址提取階段成功提取到影子服務接收到的流量中的地址位置之后,就可以進入映射恢復階段.如圖5所示,雖然這個階段無法恢復全部的內存映射信息,但可以恢復出在發送中需要的所有內存映射信息.

圖5 映射恢復過程
在映射恢復之后,為保證發送流量的正確性,需要修正即將發送流量中用到的地址信息,使利用過程繼續進行下去.修正方法為采用與地址提取階段相同的滑動窗口方式,如圖6所示,可以得到適用于當前影子服務的地址完成修正步驟.

圖6 地址修正過程
在流量分析模塊中,通過流量同步處理的方式,接收和發送步驟分別映射恢復和地址修正,通過循環發送和接收流程,完成已記錄流量中所有內存映射信息的恢復,為后續漏洞利用過程提供必要信息.
2.2.3 自動化漏洞利用重現
在分析流量分析模塊時,已經記錄了接收過程中恢復映射的地址位置和偏移量及發送時的地址位置,記錄過程如圖7所示.此時在自動化利用過程中,可以通過對所有記錄逐條處理,根據每條發送和接收類型的不同分別完成不同的步驟.發送記錄類型執行地址修正以及發送流程,接收記錄執行接收、計算映射基址以及記錄映射的流程,此時只需要對所有記錄進行循環處理就可以完成自動化的漏洞重現過程.

圖7 記錄處理
本文實驗在表1所示的環境下進行.

表1 實驗環境
在實驗中,預計使用強網杯CTF中的二進制題目以及CVE-2013-2028和CVE-2010-4221漏洞樣本作為目標.強網杯CTF中的二進制題目所涉及漏洞具有相對容易利用的特性,可以較為容易地模擬真實環境中危害最大的一類漏洞出現時的情況.
實驗方法主要為首先對目標環境進行測試,確認樣本存在遠程代碼執行漏洞,之后,通過已構造好的漏洞利用對目標樣本遠程代碼執行攻擊,在攻擊過程中,將攻擊流量通過tcpdump[16]記錄,這是一種網絡中傳送的數據包完全截獲下來提供分析的方式,以此來獲取遠程代碼執行攻擊的流量.
之后使用本文研究的系統,輸入漏洞樣本和已獲取的遠程代碼執行攻擊漏洞的流量,通過觀察系統結果可確認是否漏洞利用已經成功,可通過漏洞利用情況判斷本文方法的具體效果.為保證實驗環境的一致性,Docker應用容器引擎被用來提供一致的二進制穩定執行環境,實驗均運行于ubuntu 16.04的Docker基礎鏡像下.
實驗使用3個強網杯CTF題目的二進制文件以及CVE-2013-2028,CVE-2010-4221的帶有漏洞的樣本二進制文件作為測試對象.在ubuntu16.04環境下這5個測試項目均可以成功完成自動化漏洞利用重現過程,實驗結果如表2所示:

表2 測試結果
在實驗中,2個真實CVE漏洞利用過程主要采用面向返回地址編程的攻擊方式,首先通過該方式對地址空間進行信息泄露攻擊.利用過程中的read和write部分可能造成連續性問題而影響漏洞利用過程,另外其地址空間隨機化繞過部分可以很好地對系統進行測試.經過測試后,系統在該情況下可以穩定地執行漏洞利用過程.
在強網杯CTF賽題中,由于其漏洞本身更具理論性,利用過程也更加精確,因此3個題目利用正常且穩定,可以對空字節的情況恰當處理.在重現過程中需要保證與利用過程的高度一致性,否則無法完成漏洞利用過程.
經過實驗可以證明,在實驗假設前提下系統運行穩定,對擁有二進制內存破壞類型遠程代碼執行漏洞攻擊流量的情況下自動化分析,并穩定地自動化利用重現.
本文通過對二進制遠程代碼執行類漏洞進行研究,設計并實現了基于流量的自動化分析與利用智能電網系統.該系統在原流量利用過程中,繞過手段為二進制形式的情況下,可以成功完成對原生服務攻擊流量的分析和再次利用,并完成對攻擊過程的重現.通過使用該系統,智能電網安全專員可以快速對針對原生服務的遠程代碼執行漏洞調查,從而防止同類漏洞的再次攻擊;也可以提取出漏洞攻擊利用樣本探測攻擊的相似性,便于揭露攻擊過程.
未來工作可對泄露信息格式進一步研究,利用啟發式方法等對泄露形式抽象處理,使本文系統得到進一步增強,以應用于更廣泛的基于智能電網系統的遠程代碼執行漏洞利用過程流量的自動化分析.