Win10安全特性之執行流保護

騰訊電腦管家 · 2015/02/04 15:07

0x00 背景


微軟在2015年1月22日公布了windows10技術預覽版,Build號:9926。電腦管家反病毒實驗室第一時間對其引入的新安全特性進行了深入分析。

眾所周知,漏洞利用過程中攻擊者若要執行惡意代碼,需要破壞程序原有指令的的正常執行。執行流保護的作用就是在程序執行的過程中檢測指令流的正常性,當發生不符合預期的情況時,及時進行異常處理。業界針對執行流保護已經有一些相對成熟的技術方案,在微軟發布的windows10最新版本中,我們看到了這一防護思想的廣泛使用。

0x01 CFI


CFI即控制流完整性Control-Flow Integrity,主要是通過對二進制可執行文件的動態改寫,以此為其增加額外的安全性保障。

這是Mihai Budiu介紹CFI技術時使用的例子。這里通過對二進制可執行文件的改寫,對jmp的目的地址前插入一個在改寫時約定好的校驗ID,在jmp的時候看目的地址前的數據是不是我們約定好的校驗ID,如果不是則進入錯誤處理流程。

同理在call 和 ret的時候也可以進行改寫:

左半部分就是一個對call的改寫,右半部分是對ret的一個改寫,在call的目的地址和ret的返回地址之前插入校驗ID,然后改寫的call 和ret中增加了對校驗ID的檢查,如果不符合預期,進入錯誤處理流程,這個思路和上邊對jmp的處理是完全一樣的。

0x02 CFG


實現CFI需要在jmp、call 一個寄存器(或者使用寄存器間接尋址)的時候,目的地址有時必須通過動態獲得,且改寫的開銷又很大,這些都給CFI的實際應用造成了一定的困難。

微軟在最新的操作系統win10當中,對基于執行流防護的實際應用中采用了CFG技術。CFG是Control Flow Guard的縮寫,就是控制流保護,它是一種編譯器和操作系統相結合的防護手段,目的在于防止不可信的間接調用。

漏洞攻擊過程中,常見的利用手法是通過溢出覆蓋或者直接篡改某個寄存器的值,篡改間接調用的地址,進而控制了程序的執行流程。CFG通過在編譯和鏈接期間,記錄下所有的間接調用信息,并把他們記錄在最終的可執行文件中,并且在所有的間接調用之前插入額外的校驗,當間接調用的地址被篡改時,會觸發一個異常,操作系統介入處理。

以win10 preview 9926中IE11的Spartan html解析模塊為例,看一下CFG的具體情況:

這里就是被編譯器插入的CFG校驗函數

但是靜態情況下默認的檢測函數是一個直接return的空函數,是微軟在和我們開玩笑嗎?

通過動態調試看一下

從上圖我們可以看出,實際運行時的地址和我們通過IDA靜態看到的地址是不一樣的,這里就涉及到CFG和操作系統相關的那部分。支持CFG版本的操作系統加載器在加載支持CFG的模塊時,會把這個地址替換成ntdll中的一個函數地址。不支持CFG版本的操作系統不用理會這個檢測,程序執行時直接retn。

這是ntdll中的檢測函數

原理是在進入檢測函數之前,把即將call的寄存器值(或者是帶偏移的寄存器間接尋址)賦值給ecx,在檢測函數中通過編譯期間記錄的數據,來校驗這個值是否有效。

檢測過程如下:

首先從LdrSystemDllInitBlock+0x60處讀取一個位圖(bitmap),這個位圖表明了哪些函數地址是有效的,通過間接調用的函數地址的高3個字節作為一個索引,獲取該函數地址所在的位圖的一個DWORD值,一共32位,證明1位代表了8個字節,但一般來說間接調用的函數地址都是0x10對齊的,因此一般奇數位是不使用的。

通過函數地址的高3個字節作為索引拿到了一個所在的位圖的DWORD值,然后檢查低1字節的0-3位是否為0,如果為0,證明函數是0x10對齊的,則用3-7bit共5個bit就作為這個DWORD值的索引,這樣通過一個函數地址就能找到位圖中所對應的位了。如果置位了,表明函數地址有效,反之則會觸發異常。

這里有個有趣的東西,雖然使用test cl,0Fh檢測是否0x10對齊,如果對齊的話實際上用3-7位作為索引,也就是說第3位一定是0。但如果函數地址不是0x10對齊的話,則會對3-7位 or 1,然后再作為索引。這樣就有一個弊端,如果一個有效的間接調用的函數地址是8字節對齊的,那么其實是允許一個8字節的一個錯位調用的,這樣可能導致的結果就是可能造成雖然通過了校驗,但是實際調用的地址并不是原始記錄的函數地址。

還有一點,如果這時候漏洞觸發成功,間接調用的寄存器值已經被攻擊者修改了,這時候從bitmap中取值的時候可能造成內存訪問無效。請看LdrpValidateUserCallTargetBitMapCheck符

號處的這條指令:mov edx,dword ptr [edx+eax*4] edx是bitmap地址,eax是索引,但如果eax不可信了,這個很有可能,則會導致內存訪問異常,并且這個函數并沒有異常處理。這是因為微軟為了效率考慮(畢竟這個校驗函數的調用十分頻繁,一個開啟CFG的模塊可能會有上萬個調用處),微軟在ntdll! RtlDispatchException中對該地址發生的異常做了一個處理:

如果異常發生的地址命中LdrpValidateUserCallTargetBitMapCheck,則進行一個單獨處理,RtlpHandleInvalidUserCallTarget會校驗當前進程的DEP狀態和要間接調用的地址(ecx)的內存屬性,如果當前進程關閉了DEP并且要間接調用的地址有可執行屬性,則觸發CFG異常,否則通過修改pContext把EIP修正到ret返回處,并且表明異常已被處理。

最后再說下這個原始的bitmap,在系統初始化的時候,內存管理器初始化中會創建一個Section(MiCfgBitMapSection32),這個Section在Win8.1上的大小是通過MmSystemRangeStart(32位下是0x80000000)計算的,前面提到過bitmap里面1位代表8字節,計算完后正好是32MB

而在Win10上MiCfgBitMapSection32的大小有了變化,直接寫死成了0x3000000(48MB)

Section創建完成后在每個進程啟動的時候會映射進去

(NtCreateUserProcess-> PspAllocateProcess-> MmInitializeProcessAddressSpace-> MiMapProcessExecutable-> MiCfgInitializeProcess)
復制代碼

映射的時候作為shared view,除非某一個進程修改了這片內存。

在一個CFG模塊映射進來的時候,重定位過程中會重新解析PE文件LOADCONFIG中的Guard Function Table以重新計算該模塊對應的bitmap(MiParseImageCfgBits),最后更新到MiCfgBitMapSection32中去(MiUpdateCfgSystemWideBitmap)。

0x03 電腦管家XP防護的執行流保護


早些年的漏洞攻擊代碼可以直接在棧空間或堆空間執行指令,但近幾年,微軟操作系統在安全性方面逐漸加強,DEP、ASLR等防護手段的應用,使得攻擊者必須借助ROP等繞過手段來實現漏洞利用。在ROP利用中,棧交換指令Stack pivot必不可少。

針對ROP攻擊的防御長久以來是漏洞防御的一個難題,因為ROP指令在靜態層面分析與程序的正常指令流毫無差別,且運行時也是在合法模塊內執行,因此極難防御。

管家漏洞防御團隊針對ROP利用的特點,從整個程序的執行流層面進行分析,研究出在動態運行時區分是合法指令流還是異常指令流的方法,其思想與CFI不謀而合。

下邊就是一個由于錯位匯編形成的比較常用的棧交換指令

而實際正常的執行流程是這樣的

以上是沒有開啟XP防護的情況

開啟電腦管家XP防護之后:

此時如果攻擊者依靠靜態分析時得到棧交換指令位置來執行ROP攻擊的話,會被執行流保護邏輯發現異常,后續攻擊則無法實現。

0x04 尾聲


CFG防護方法需要在編譯鏈接階段來完成準備工作,同時需要操作系統的支持。CFI無需編譯時的幫助,且不僅能夠防御call調用,能夠對全部執行流進行保護。但CFI需要插入大量的檢測點,并且在執行過程中檢測的頻率極高,難免對程序執行效率帶來影響。

電腦管家XP版的防御方法相比于前兩者,對性能的影響更小,但這種方法是針對舊版操作系統的緩解方案,通用性會打折扣。所以建議廣大windows用戶盡量升級到最新操作系統,享受全面的安全保護。而由于某些原因無法升級的用戶也不必擔心,管家XP版會繼續提供最高的安全防護能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452459.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】 大話數據結構(1) 線性表之順序存儲結構

本文根據《大話數據結構》一書,實現了Java版的順序存儲結構。 順序存儲結構指的是用一段地址連續的存儲單元一次存儲線性表的數據元素,一般用一維數組來實現。 書中的線性表抽象數據類型定義如下(第45頁): 實現程序&am…

程序復雜程度的定量度量

對程序復雜程度進行度量的目的 1.把程序的復雜程度乘以適當常數即可估算出軟件中錯誤的數量以及軟件開發需要用的工作量, 2.定量度量的結果可以用來比較兩個不同的設計或兩個不同算法的優劣; 3.程序的定量的復雜程度可以作為模塊規模的精確限度。 …

Readhat中升級openssh

1.掛載yum源(鏡像) 如何掛載yum源(鏡像),在本人的另外一篇博客中,請戳這里 2.安裝升級所需依賴 由于升級ssh需要安裝依賴,這里提前將所需依賴安裝 指令: yum install -y zlib-dev…

android暫停活動,如何將Android暫停活動帶到前面

我有一個活動啟動異步任務,偵聽來自服務器的消息.當用戶點擊主頁按鈕時,活動暫停,異步任務繼續在后臺運行.當某個消息到達時,我希望活動恢復并在不重新創建的情況下到達前面.我嘗試了以下內容.機器人:launchMode "singleTop"intent new Intent(getBaseContext(), M…

軟件開發人員怎樣走好從技術到管理之路?

軟件開發人員怎樣走好從技術到管理之路?這是一部分技術人員思考和談論的老話題。雖然我自己并沒有豐富的管理經驗,但還是想記載下這一段時間里對這一問題的想法。從我個人走過的路來看,要走順這條路,應該做好三個方面:…

如何選擇程序設計語言

程序設計語言是人和計算機通信的最基本的工具,會影響人的思維和解題方式,影響人和計算機通信的方式和質量,影響其他人閱讀和理解程序的難易程度。 選擇適宜的程序設計語言的原因: 1.根據設計去完成編碼時,困難最少&am…

zabbix4

1.宏(Macros) 宏可以理解為一個用于文本替換模式的預設文本內容; 宏根據一系列預定義的規則替換一定格式的文本模式,一般情況下,解釋器或編譯器在遇到宏時會自動進行文本模式替換; 類似的,Zabbix可以基于宏保存預設文件…

結對項目——Subway

博客鏈接:結對項目-Subway 轉載于:https://www.cnblogs.com/Dominic-Abraham/p/9117266.html

Readhat中作安全基線

文章目錄1.新建文件夾并上傳腳本2.修改腳本中設置root2用戶的密碼字段3.添加腳本的可執行權限4.執行腳本5.嘗試使用root2登錄驗證1.新建文件夾并上傳腳本 在根目錄下的/openssh8(沒有則新建)中上傳腳本: 2.修改腳本中設置root2用戶的密碼字…

軟件測試的準則

1.所有測試都應該能追溯到用戶需求;2.應該遠在測試開始之前就制定出測試計劃;3.把Pareto原理應用到軟件測試中;4.應該從“小規模”測試開始,并逐步進行“大規模”測試;5.窮舉測試是不可能的;6.為了達到最佳…

在線計算機計器,計算機存儲單位換算-電腦容量在線換算器

APP說明存儲單位是一種計量單位。指在某一領域以一個特定量,或標準做為一個記錄(計數)點。再以此點的某個倍數再去定義另一個點,而這個點的代名詞就是計數單位或存儲單位。二進制序列用以表示計算機、電子信息數據容量的量綱,基本單位為字節B…

WordPress插件開發-創建、停用、刪除插件

插件存放目錄 wp-content/plugins 創建一個插件 在plugins創建一個文件插件文件夾,命名最好加前綴,這個前綴可以使用你的名字或者你自己的域名,防止插件和別人重名,再創建一個PHP文件名字和你的插件名一樣。我這里創建一個名為 yg…

在eclipse中使用hadoop插件

我的配置環境看我的上篇博文。 配置過程: (1)把插件放到eclipse/plugins目錄下。(我的版本上一篇也有) (3)重啟eclipse,配置Hadoop installation directory 如果插件安裝成功&#…

從程序員到技術領導者

入行 你為什么要當程序員?每當我問起很多人入行的人,回答各不相同。 有很多人是因為喜歡。誰說過:熱愛是最好的老師。當然,關鍵是熱愛是否能支撐自己把愛好做成一份職業。但不論做多久,因為熱愛或曾經熱愛&#xff0…

黑盒測試和白盒測試

黑盒測試(又稱功能測試)把程序看作一個黑盒子,完全不考慮程序的內部結構和處理過程。黑盒測試是在程序接口進行的測試,只檢查程序功能是否能按照規格說明書的規定正常使用,程序是否能適當地接收輸入數據并產生正確的輸…

Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署

文章目錄0.部署前準備1.創建一個超級用戶2.更新 SQLite33.安裝 Python3 、pip3.6以及 Pipenv4.部署代碼5.使用 Gunicorn6.啟動 Nginx 服務器7.配置 Nginx8.關閉 DEBUG 模式,收集靜態文件9.使用 Supervisor管理 Gunicorn 進程10.使用 CDN 加快 Bootstrap 和 jQuery 的…

計算機更改了用戶名數據恢復,怎么把電腦更換用戶后恢復到原來的用戶呢?

如何讓administrator帳戶出現在登陸畫面?安裝Windows XP時,如果設置了一個管理員賬戶,那么系統內置沒有密碼保護的Administrator管理員賬戶是不會出現在用戶登錄列表中的。雖然它身在幕后,可卻擁有系統最高權限,為了方…

StringBuilder類

1.1 StringBuilder類概述StringBuilder:是一個可變的字符串。字符串緩沖區類。 String和StringBuilder的區別:String的內容是固定的StringBuilder的內容是可變的1.1.1 拼接字符串耗費內存原因:每次拼接都會產生新的字符串對象,而利用StringBuilder來拼接字符串自始至…

如何使用搜索技巧來成為一名高效的程序員

沒有人是完全獨立的孤島,每個人都是整體的一部分。—— 約翰多恩對于缺乏編程知識的人來說,完全有可能編寫一個網頁或小程序。如果在用Google搜索相關示例時幸運的話,可以搜到現成的代碼。即使是經驗豐富的程序員,通常也會為了節省…

電開大計算機應用基礎作業,2016年電大-電大計算機應用基礎作業 答案.doc

2016年電大-電大計算機應用基礎作業 答案計算機作業2單項選擇題:第1題:在Word中編輯文本時,編輯區顯示的“水印”在打印時( )出現在紙上。(2分)A、不會B、全部C、一部分D、大部分第2題:Word文檔以文件形式存放于磁盤中,其默認的文件擴展名為(…