在软件开发生命周期中使用应用程序验证器
轉(zhuǎn)自https://msdn.microsoft.com/zh-cn/library/aa480483.aspx#EHAA
發(fā)布日期 : 2006-6-5?|?更新日期 : 2006-6-5摘要
Microsoft? Application Verifier (AppVerifier) 是針對(duì)非托管代碼的運(yùn)行時(shí)驗(yàn)證工具,它有助于找到細(xì)小的編程錯(cuò)誤、安全問題和受限的用戶帳戶特權(quán)問題,使用常規(guī)的應(yīng)用程序測(cè)試技術(shù)很難識(shí)別出這些錯(cuò)誤和問題。
本頁內(nèi)容
簡(jiǎn)介?
什么是 AppVerifier??
AppVerifier 功能?
何時(shí)使用 AppVerifier?
如何使用 AppVerifier?
分析 AppVerifier 數(shù)據(jù)?
有關(guān) AppVerifier 的要點(diǎn)?
附錄 A:Driver Verifier?
附錄 B:使用 Application Verifier 測(cè)試安全功能?
附錄 C:參考站點(diǎn)?
簡(jiǎn)介
程序員、軟件架構(gòu)師、測(cè)試人員以及安全咨詢師所面臨的最大難題之一是,了解其應(yīng)用程序部署到產(chǎn)品時(shí)的結(jié)果。即使具備對(duì)源代碼的訪問,也很難掌握?qǐng)?zhí)行過程中將發(fā)生的每個(gè)操作,這歸咎于存在多種依賴項(xiàng)(例如,服務(wù)于代碼或利用外部組件的多個(gè)組)。在幫助管理這種復(fù)雜性以及錯(cuò)誤帶來的潛在的副面影響方面,Microsoft AppVerifier 扮演著重要的角色。AppVerifier 有助于找到細(xì)小的編程錯(cuò)誤、安全問題和用戶帳戶特權(quán)問題,這些錯(cuò)誤和問題在典型的測(cè)試過程中是很難識(shí)別的。
本文提供的信息,涉及 AppVerifier 如何工作以及在軟件開發(fā)生命周期 (Software Development Lifecycle) 過程中如何應(yīng)用 AppVerifier。
返回頁首?什么是 AppVerifier?
AppVerifier 可以免費(fèi)下載,特別用于檢測(cè)和幫助調(diào)試內(nèi)存損壞、危險(xiǎn)的安全漏洞以及受限的用戶帳戶特權(quán)問題。AppVerifier 有助于創(chuàng)建可靠且安全的應(yīng)用程序,方法是監(jiān)視應(yīng)用程序與 Microsoft? Windows? 操作系統(tǒng)的交互,并配置應(yīng)用程序使用的對(duì)象、注冊(cè)表、文件系統(tǒng)和 Win32 API(包括堆、句柄和鎖)。AppVerifier 還包括檢查,以便預(yù)測(cè)應(yīng)用程序在非管理員環(huán)境中的執(zhí)行情況。
在整個(gè)軟件開發(fā)生命周期中使用時(shí),AppVerifier 可節(jié)約開發(fā)工作的成本,因?yàn)樗芊奖愕卦谠缙诰妥R(shí)別出問題,而在早期修復(fù)錯(cuò)誤是比較容易且成本較低的。AppVerifier 還有助于檢測(cè)出可能被忽視掉的錯(cuò)誤,并確保最終的應(yīng)用程序能夠在受限的(例如,非管理員)環(huán)境中執(zhí)行(最后這一點(diǎn)對(duì)于 Windows Vista 應(yīng)用程序更為重要)。
AppVerifier 識(shí)別的問題
AppVerifier 有助于確定:
-
應(yīng)用程序正確地使用 API 的時(shí)刻:
-
不安全的 TerminateThread API。
-
正確使用線程本地存儲(chǔ)(Thread Local Storage,TLS)API。
-
正確使用虛擬空間操作(例如,VirtualAlloc 和 MapViewOfFile)。
-
-
應(yīng)用程序是否使用結(jié)構(gòu)化的異常處理隱藏訪問沖突。
-
應(yīng)用程序是否試圖使用無效的句柄。
-
堆中是否有內(nèi)存損壞或存在內(nèi)存問題。
-
應(yīng)用程序是否在資源不足的情況下用盡了內(nèi)存。
-
是否正確使用了臨界區(qū)。
-
運(yùn)行在管理員環(huán)境中的應(yīng)用程序在具有較低特權(quán)的環(huán)境中是否能良好運(yùn)行。
-
當(dāng)應(yīng)用程序作為受限用戶運(yùn)行時(shí)是否會(huì)存在潛在的問題。
-
在線程的上下文中,是否在將來的函數(shù)調(diào)用中會(huì)存在未初始化的變量。
AppVerifier 功能
AppVerifier 創(chuàng)建于 2001 年,在登錄過程中使用。然而,在 Download Center 的 3.0 版中進(jìn)行了一些更改。用戶界面經(jīng)過了更改,增加了對(duì)安全的關(guān)注,更新的體系結(jié)構(gòu)可以提供更健壯的報(bào)告(基于 XML 的日志),靈活性方面表現(xiàn)為能添加新的測(cè)試(例如,LuaPriv 等更多的新特性)。
AppVerifier 測(cè)試
AppVerifier 包含稱為"驗(yàn)證層"的測(cè)試集。可以針對(duì)進(jìn)行測(cè)試的每個(gè)應(yīng)用程序打開或關(guān)閉它們。通過在測(cè)試區(qū)域內(nèi)擴(kuò)展驗(yàn)證層,將顯示特定的測(cè)試。要打開針對(duì)該應(yīng)用程序的測(cè)試,選擇它旁邊的復(fù)選框。要打開整個(gè)驗(yàn)證層(例如,Basics),選擇最上層的復(fù)選框。
AppVerifier 可以執(zhí)行四種不同類型的測(cè)試(在版本 3.0.28 中):
-
Basics?包含針對(duì)以下內(nèi)容的測(cè)試:
-
Exceptions?— 使用結(jié)構(gòu)化的異常處理確保應(yīng)用程序不隱藏訪問沖突。
-
Handles?— 確保應(yīng)用程序不嘗試使用無效的句柄。
-
Heaps?— 查看堆中的內(nèi)存損壞問題。
-
Locks?— 驗(yàn)證臨界區(qū)的正確使用。
-
Memory?— 確保正確使用虛擬空間操作的 API。
-
TLS?— 確保正確使用線程本地存儲(chǔ) API。
-
-
Low resource simulation?嘗試在資源不足的情況下模擬環(huán)境,因此,您可定義一個(gè)編號(hào) (0–100) 來指示關(guān)于以下內(nèi)容的錯(cuò)誤可能性調(diào)用:
-
Wait(例如,WaitForXXXX API)。
-
Heap_Alloc(堆分配 API)。
-
Virtual_Alloc(虛擬內(nèi)存分配 API)。
-
注冊(cè)表(注冊(cè)表 API)。
-
文件(諸如 CreateFile 的文件 API)。
-
事件(諸如 CreateEvent 的事件 API)。
-
MapView(諸如 CreateMapView MapView API 的 CreateMapView)。
-
Ole_Alloc(諸如 SysAllocString 的 Ole API)。
-
-
LuaPriv?包含 31 種不同的測(cè)試,它們可在以下兩種方案中使用:
-
Predictive?— 確定一個(gè)以管理權(quán)限運(yùn)行的應(yīng)用程序如果以較小特權(quán)(通常,作為常規(guī)用戶)運(yùn)行時(shí)是否能正常工作。例如,如果應(yīng)用程序?qū)χ辉试S管理員訪問的文件進(jìn)行寫操作,那么如果該應(yīng)用程序以非管理員身份運(yùn)行,則它將無法寫入此類文件。
-
Diagnostic?— 以非管理員身份運(yùn)行時(shí),將識(shí)別可能已經(jīng)存在于當(dāng)前運(yùn)行中的潛在問題。例如,如果應(yīng)用程序嘗試寫入只允許管理員訪問的文件,則應(yīng)用程序?qū)a(chǎn)生一個(gè) ACCESS_DENIED 錯(cuò)誤。
-
-
Miscellaneous?包含針對(duì)以下方面的測(cè)試:
-
Dangerous API — 進(jìn)行跟蹤,查看應(yīng)用程序是否正在使用以下不安全的操作:
-
對(duì) TerminateThread 的危險(xiǎn)調(diào)用。
-
內(nèi)存不足情況下潛在的堆棧溢出。
-
在多個(gè)線程仍然運(yùn)行的情況下退出調(diào)用的進(jìn)程。
-
LoadLibrary 在 DllMain 過程中調(diào)用。
-
FreeLibrary 在 DllMain 過程中調(diào)用。
-
Dirty Stacks?用內(nèi)存模式填充(周期性地)未使用的堆棧部分。這有助于檢測(cè)線程上下文的將來函數(shù)調(diào)用中未初始化的變量。
-
-
屬性
AppVerifier 中有兩組屬性。一組基于測(cè)試,一組基于應(yīng)用程序。每組屬性按以下方式定義:
-
Name - 針對(duì)每個(gè)屬性的唯一名稱。
-
Type - Boolean、DWORD、String 和 MultipleString。
-
Value - 基于類型變化的可更改元素。
-
Description - 該描述解釋屬性的內(nèi)容。
針對(duì)每個(gè)應(yīng)用程序編輯屬性
對(duì)于每個(gè)應(yīng)用程序,以下屬性可用于編輯:
-
Propagate?— 將驗(yàn)證器設(shè)置從父進(jìn)程傳播到子進(jìn)程。False(不選中該框)不傳播這些設(shè)置,而 True(選中該框)則傳播這些設(shè)置。
-
AutoClr?— 當(dāng)指定的圖像開始運(yùn)行之后,驗(yàn)證的圖像將清除自己的設(shè)置。False(不選中該框)不進(jìn)行此操作;True(選中該框)則進(jìn)行此操作。
-
AutoDisableStop?— AppVerifier 對(duì)于一個(gè)錯(cuò)誤將只解釋一次。如果再次發(fā)現(xiàn)該問題,它不會(huì)生成錯(cuò)誤。False 在每次發(fā)現(xiàn)問題時(shí)都將生成錯(cuò)誤。True 將只生成一個(gè)錯(cuò)誤。
-
LoggingWithLocksHeld?— 將記錄 dll 加載/卸載事件。驗(yàn)證器在加載器鎖處于保持狀態(tài)時(shí)進(jìn)行 I/O。這可能會(huì)掛起應(yīng)用程序。False 不會(huì)記錄該事件,而 True 將記錄該事件。
編輯測(cè)試屬性
有關(guān)特定測(cè)試的屬性的詳細(xì)信息,參見 AppVerifier 中的 Help 內(nèi)容。要編輯這些屬性,可采用以下兩種方法之一:
-
Individual?— 在屬性窗口中,雙擊要編輯的屬性。將顯示一個(gè)對(duì)話框,允許編輯該項(xiàng)并將其設(shè)置回默認(rèn)內(nèi)容。更改該項(xiàng)并單擊"OK"。
-
Group?— 從 Test 區(qū)域,單擊要編輯的測(cè)試或驗(yàn)證層。使用右鍵單擊選項(xiàng)顯示包含所有屬性的屏幕。更改這些屬性或重置為默認(rèn)內(nèi)容,并單擊"OK"。
日志
運(yùn)行應(yīng)用程序而且生成錯(cuò)誤時(shí),創(chuàng)建日志。日志為 XML 格式,可以使用瀏覽器、XML 或 XLST 查看。
返回頁首?何時(shí)使用 AppVerifier
您應(yīng)該在軟件開發(fā)生命周期(SDL,又稱為安全開發(fā)生命周期 Security Development Lifecycle)的整個(gè)過程中使用 AppVerifier:
-
需求?階段?— 規(guī)劃 AppVerifier 的使用,并安排它的執(zhí)行與后續(xù)操作。
-
設(shè)計(jì)階段?— 定義將測(cè)試哪些組件(模塊、Dll 或 EXE)。
-
實(shí)現(xiàn)階段?— 從開發(fā)中不同組件的穩(wěn)定版本(從 Alpha 到 RTM)運(yùn)行 AppVerifier(單獨(dú)和共同測(cè)試組件很重要)。
-
驗(yàn)證階段?— 測(cè)試人員應(yīng)該使用 AppVerifier 進(jìn)行他們的所有測(cè)試(手動(dòng)和自動(dòng)),因?yàn)檫@是第一次對(duì)應(yīng)用程序進(jìn)行限制,而且將提交意外的行為和數(shù)據(jù)。AppVerifier 對(duì)于安全咨詢師而言也是一個(gè)進(jìn)行審核(黑盒和白盒)的強(qiáng)大工具,因?yàn)樗軌蚩焖倜杜e實(shí)際(或潛在)的攻擊/破壞向量。
-
發(fā)布階段?— 客戶和安全咨詢師可以對(duì)發(fā)布的二進(jìn)制文件使用 AppVerifier,從而識(shí)別出潛在的安全漏洞。
-
支持和服務(wù)階段?— 使用 AppVerifier 確保代碼更改(例如,錯(cuò)誤修復(fù))不會(huì)引入回歸。
如何使用 AppVerifier
安裝和配置
-
安裝:從?Microsoft Download Center?下載最新版的 AppVerifier,其中您將發(fā)現(xiàn)針對(duì)以下支持的體系結(jié)構(gòu)的安裝二進(jìn)制文件:x86、ia64 和 amd64。
-
調(diào)試器安裝:已驗(yàn)證的應(yīng)用程序應(yīng)該運(yùn)行于用戶模式的調(diào)試器中或者系統(tǒng)應(yīng)該運(yùn)行于內(nèi)核調(diào)試器中,因?yàn)槌霈F(xiàn)錯(cuò)誤時(shí),將中斷調(diào)試器。參閱 Help 內(nèi)容獲取有關(guān)調(diào)試器的詳細(xì)信息。
-
設(shè)置:?對(duì)于運(yùn)行中的進(jìn)程,不能啟用 AppVerifier。需要按照下面描述的方式創(chuàng)建設(shè)置,然后啟動(dòng)應(yīng)用程序。除非顯式刪除,否則這些設(shè)置將一直保留;無論啟動(dòng)應(yīng)用程序多少次,在啟動(dòng)時(shí)都會(huì)啟用 AppVerifier,除非刪除這些設(shè)置。
注?AppVerifier 也可以在 Visual Studio 2005 Team System 中使用。
使用 AppVerifier Basic 測(cè)試
下面的方案展示推薦的命令行和用戶界面選項(xiàng)。這些內(nèi)容應(yīng)該在執(zhí)行代碼的所有測(cè)試中運(yùn)行以確保完全覆蓋。這些方案的預(yù)期目標(biāo)是,應(yīng)用程序不?中斷調(diào)試器,而且所有測(cè)試在不啟用 AppVerifier 運(yùn)行時(shí)以相同的通過率通過。
-
針對(duì)要測(cè)試的應(yīng)用程序(一個(gè)或多個(gè))啟用驗(yàn)證器,通過:
從命令行:?appverif /verify MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區(qū)域并單擊?Add Application?添加應(yīng)用程序。
-
b. 從 Tests 區(qū)域選擇?Basics。
-
c. 單擊?Save?按鈕。
-
注:
-
/verify?將啟用 Basic 測(cè)試。
-
如果要測(cè)試一個(gè) DLL 應(yīng)用程序,必須為執(zhí)行該 DLL 的測(cè)試 .exe 文件啟用 AppVerifier。
-
單獨(dú)運(yùn)行驗(yàn)證層。例如,在一個(gè)會(huì)話中啟用所有 Basic,而在另一個(gè)會(huì)話中啟用所有 LuaPriv 檢查。
-
-
-
運(yùn)行執(zhí)行應(yīng)用程序的所有測(cè)試。
-
分析遇到的任何調(diào)試器中斷(一個(gè)或多個(gè))。如果發(fā)生一個(gè)中斷,則需要了解中斷的原因以及如何修復(fù)它。(Help 內(nèi)容提供關(guān)于中斷的詳細(xì)信息以及如何研究它們。)
-
完成時(shí),刪除所有設(shè)置:
從命令行:appverif /n MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區(qū)域并單擊?Delete Application?刪除應(yīng)用程序。
-
b. 單擊?Save?按鈕。
-
使用 AppVerifier 低資源模擬(錯(cuò)誤注入)
該方案的預(yù)期目標(biāo)是,應(yīng)用程序不中斷該調(diào)試器。這意味著沒有需要解決的錯(cuò)誤。
由于在常規(guī)操作中引入隨機(jī)錯(cuò)誤注入,因此這些測(cè)試的通過率可能顯著降低。
-
針對(duì)一個(gè)或多個(gè)應(yīng)用程序啟用應(yīng)用程序驗(yàn)證器低資源模擬(錯(cuò)誤注入):
從命令行:Appverif /verify MyApp.exe /faults;
從用戶界面:
-
a.?右鍵單擊 Applications 區(qū)域并單擊?Add Application?添加應(yīng)用程序。
-
b. 從 Tests 區(qū)域選擇?Low Resource Simulation。
-
c. 單擊?Save?按鈕。
注?如果要測(cè)試一個(gè) DLL,可以在特定的 DLL 上(而非整個(gè)過程中)應(yīng)用低資源模擬(錯(cuò)誤注入)。命令行格式如下所示:
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL ?]]]]Example: appverif /verify mytest.exe /faults 5 1000 d3d9.dll -
-
運(yùn)行執(zhí)行應(yīng)用程序的所有測(cè)試。
-
完成時(shí),刪除所有設(shè)置。分析遇到的任何調(diào)試器中斷(一個(gè)或多個(gè))。如果出現(xiàn)中斷,需要了解中斷的原因以及如何修復(fù)它。
-
完成時(shí),刪除所有設(shè)置:
從命令行:appverif /n MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區(qū)域并單擊?Delete Application?刪除應(yīng)用程序。
-
b. 單擊?Save?按鈕。
注?在應(yīng)用程序中是否使用錯(cuò)誤注入將導(dǎo)致執(zhí)行完全不同的代碼路徑,因此為了完全受益于 AppVerifier 必須運(yùn)行這兩個(gè)方案。
-
分析 AppVerifier 數(shù)據(jù)
在 AppVerifier 分析過程中創(chuàng)建的所有數(shù)據(jù)存儲(chǔ)在一個(gè)二進(jìn)制格式的 %ALLUSERSPROFILE%\AppVerifierLogs 文件夾中。然后,這些日志可通過用戶界面或命令行轉(zhuǎn)換為 XML 以供進(jìn)一步分析。要查看 XML 文件,使用以下方式之一:
-
Web?瀏覽器?— 現(xiàn)在,所有的 Web 瀏覽器都能夠以結(jié)構(gòu)化以及顏色編碼的格式顯示 XML 文件。
-
XSL?轉(zhuǎn)換?—?創(chuàng)建一個(gè) XSLT,將原始內(nèi)容轉(zhuǎn)換為只包含相關(guān)信息的報(bào)告。
-
導(dǎo)入到?Excel?— 將 XML 文件導(dǎo)入到 Excel,使用篩選器或 Pivot 表識(shí)別并分析收集的數(shù)據(jù)。
-
導(dǎo)入到數(shù)據(jù)庫(kù)?—?保存 XML 文件,并將其導(dǎo)入到一個(gè)數(shù)據(jù)庫(kù)中(例如,SQL、Access 數(shù)據(jù)庫(kù)等)。
有關(guān) AppVerifier 的要點(diǎn)
本節(jié)提供有關(guān)潛在 AppVerifier 用戶遇到的最常見問題的信息:
系統(tǒng)要求
AppVerifier 旨在測(cè)試 Windows XP、Windows Server 2003 和 Windows Vista 上的非托管應(yīng)用程序(例如,非 .NET Framework 應(yīng)用程序)。當(dāng)運(yùn)行一個(gè)完整的頁面堆時(shí),建議最少需要 1 GB。
盡管應(yīng)用程序的符號(hào)或調(diào)試信息的可用性在所收集數(shù)據(jù)的質(zhì)量和有用性方面差異巨大,但 AppVerifier 在執(zhí)行測(cè)試時(shí)不需要訪問源代碼。
AppVerifier 將驗(yàn)證什么?
AppVerifier 用于在 Windows XP、Windows Server 2003 和 Windows Vista 中測(cè)試用戶模式的應(yīng)用程序。
-
要測(cè)試驅(qū)動(dòng)程序或內(nèi)核模塊,使用 Driver Verifier。有關(guān)更多信息,請(qǐng)參閱附錄 A:Driver Verifier 以及知識(shí)庫(kù)文章?How to Use Driver Verifier to Troubleshoot Windows Drivers。
-
要測(cè)試 Windows CE,使用 Windows CE Test Kit (CETK) 中包含的特定的 Platform AppVerifier。
-
需要注意的重要一點(diǎn)是,AppVerifier 將只測(cè)試在測(cè)試執(zhí)行過程中調(diào)用的函數(shù)。這意味著,如果單元測(cè)試可用(從目標(biāo)應(yīng)用程序/模塊),它們應(yīng)該用于確保最大的代碼覆蓋 - 如果調(diào)用生成請(qǐng)求的方法,則只檢測(cè)錯(cuò)誤。
AppVerifier 如何工作?
AppVerifier 的工作方式是修改非托管 DLL Method Table,以便在執(zhí)行實(shí)際函數(shù)之前執(zhí)行所需的檢查(也稱為"函數(shù)掛鉤")。例如,Win32 APICreateFileA?方法的地址被替換為一個(gè)內(nèi)部的 AppVerifier 方法,后者將觸發(fā)需要記錄的一系列測(cè)試。
當(dāng)新進(jìn)程啟動(dòng)時(shí),使用 AppVerifier 的 Method Table Hooking 技術(shù)將由在特定注冊(cè)表鍵中創(chuàng)建的項(xiàng)進(jìn)行控制。如果存在注冊(cè)表項(xiàng),那么 AppVerifier DLL 將加載到新創(chuàng)建的進(jìn)程中,該進(jìn)程將在現(xiàn)有的以及后續(xù)加載的 DLL 中處理 Method Table 替換。由于這些掛鉤在加載 DLL 時(shí)生成的,因此在已經(jīng)運(yùn)行的進(jìn)程上使用 AppVerifier 3.0 是可能的。
AppVerifier 用戶界面 (UI) 用于控制注冊(cè)表鍵設(shè)置并提供關(guān)于現(xiàn)有日志的信息。當(dāng)在 UI 中設(shè)置了應(yīng)用程序和測(cè)試并單擊"Save"按鈕時(shí),將進(jìn)行 Registry 設(shè)置。然后需要重新啟動(dòng)該應(yīng)用程序,這將啟動(dòng)監(jiān)視操作。需要注意的重要一點(diǎn)是,這些設(shè)置將一直持續(xù)到應(yīng)用程序從 AppVerifier 中移除。
當(dāng)發(fā)現(xiàn)一個(gè)問題時(shí),驗(yàn)證器將停止。提供的編號(hào)用于標(biāo)識(shí)問題發(fā)生的實(shí)質(zhì)和原因。要更好地了解停止操作,參見 AppVerifier Help 文件中包含的詳細(xì)解釋:appverif.chm。
頁面堆技術(shù)細(xì)節(jié)
為了檢測(cè)堆損壞(上溢或下溢),AppVerifier 將修改內(nèi)存分配方式,方法是在分配內(nèi)存之前和之后使用完整的不可寫的頁或特殊標(biāo)記填充所請(qǐng)求的內(nèi)存。
當(dāng)使用完整的不可寫的頁填充所請(qǐng)求的內(nèi)存時(shí)(在頁面堆的屬性部分啟用 FULL 設(shè)置并使用默認(rèn)設(shè)置),AppVerifier 將使用大量虛擬內(nèi)存,而且它具有個(gè)優(yōu)勢(shì),即當(dāng)上溢或下溢發(fā)生時(shí),將實(shí)時(shí)緩存堆損壞事件。謹(jǐn)記,該模式中的內(nèi)存可能如下所示?
堆檢查將根據(jù)?Backward?屬性在分配的開始或結(jié)尾放置一個(gè)保護(hù)頁。如果?Backward?設(shè)置為 False(默認(rèn)值),則它將在分配的末尾放置一個(gè)保護(hù)頁以捕獲緩沖區(qū)溢出。如果它設(shè)置為 True,則該保護(hù)頁放置在分配的開始以捕獲緩沖區(qū)的不足。
當(dāng)使用特殊標(biāo)記(通過清除堆屬性中的"Full"復(fù)選框項(xiàng)來啟動(dòng))填充所需的內(nèi)存時(shí),如果釋放該內(nèi)存,AppVerifier 將進(jìn)行檢查并向您發(fā)出警告。使用這些技巧時(shí)的主要問題是,有時(shí)內(nèi)存損壞只能在內(nèi)存釋放時(shí)(最小的內(nèi)存塊是 8 字節(jié))進(jìn)行檢測(cè),因此操作一個(gè) 3 字節(jié)的變量或發(fā)生 5 字節(jié)溢出時(shí),不會(huì)立即檢測(cè)到它。
對(duì)于一個(gè)下溢事件,將嘗試寫入一個(gè)只讀頁。這將引發(fā)一個(gè)異常。請(qǐng)注意,僅當(dāng)目標(biāo)應(yīng)用程序在調(diào)試器中執(zhí)行時(shí)才引發(fā)該異常。還需注意,完整的頁面堆模式也將檢測(cè)這些錯(cuò)誤,因?yàn)樗褂锰畛?#43;保護(hù)頁。使用輕量級(jí)頁面堆的原因是,防止計(jì)算機(jī)無法承受完整頁面堆的高內(nèi)存約束。
對(duì)于內(nèi)存密集型應(yīng)用程序,或者需要長(zhǎng)期使用 AppVerifier 時(shí)(例如,壓力測(cè)試),最好運(yùn)行常規(guī)(輕量)堆測(cè)試而非完整的模式,以防止性能降低。但當(dāng)您遇到問題時(shí),請(qǐng)打開完整的頁面堆進(jìn)行深入研究。
返回頁首?附錄 A:Driver Verifier
Driver Verifier 是一個(gè)在驅(qū)動(dòng)程序運(yùn)行時(shí)在其中(內(nèi)核模式軟件)檢測(cè)錯(cuò)誤的工具。典型的檢測(cè)結(jié)果是:池?fù)p壞(包括緩沖區(qū)溢出)、對(duì)不信任數(shù)據(jù)的錯(cuò)誤驗(yàn)證、錯(cuò)誤的內(nèi)核模式操作等。無論 Driver Verifier 何時(shí)發(fā)現(xiàn)問題,它都會(huì)以受控方式 (bugcheck) 中斷系統(tǒng),而內(nèi)核調(diào)試器需要了解該問題。Driver Verifier 是一個(gè)操作系統(tǒng)組件,在 Windows 2000 及其更高版本的系統(tǒng)中可用。
Driver Verifier 使用方案
-
安裝:使用 verifier.exe 建立 Driver Verifier 的設(shè)置,前者是任何 Windows 系統(tǒng)中默認(rèn)安裝的系統(tǒng)工具。要運(yùn)行該用戶界面,打開一個(gè)命令窗口并鍵入?verifier.exe,或轉(zhuǎn)到 windows\system32\verifier.exe。
-
設(shè)置:您需要進(jìn)行如下所述的設(shè)置,然后重新啟動(dòng)系統(tǒng)以便開始測(cè)試啟用的 Driver Verifier。這些設(shè)置在明確刪除之前一直保留。
使用 Driver Verifier
下面的方案展示推薦的命令行和用戶界面選項(xiàng)。這些選項(xiàng)應(yīng)該在執(zhí)行代碼的所有測(cè)試中運(yùn)行以確保完全覆蓋。對(duì)于這些方案的預(yù)期目標(biāo)是,驅(qū)動(dòng)程序不?產(chǎn)生系統(tǒng)中斷,而且所有測(cè)試具有與不啟用 Driver Verifier 時(shí)相同的通過率。
-
啟用要進(jìn)行測(cè)試的驅(qū)動(dòng)程序(一個(gè)或多個(gè))的標(biāo)準(zhǔn)設(shè)置,然后重新啟動(dòng):
從命令行:verifier /flags 0x1FB /driver MyDriver.sys
從用戶界面:
-
a. 單擊初始屏幕上的 Create Standard Settings。
-
b. 單擊 Next 按鈕。
-
c. 單擊 Select driver names from a list。
-
d. 選擇要測(cè)試的驅(qū)動(dòng)程序(一個(gè)或多個(gè)),并單擊?Finish?按鈕。
-
-
運(yùn)行執(zhí)行驅(qū)動(dòng)程序(一個(gè)或多個(gè))的所有測(cè)試。
-
分析遇到的任何系統(tǒng)中斷。任何系統(tǒng)中斷都是驗(yàn)證器發(fā)現(xiàn)的錯(cuò)誤,您需要了解并修復(fù)它。
使用 Driver Verifier Low Resource Simulation(錯(cuò)誤注入)
這些方案的預(yù)期目標(biāo)是,當(dāng)啟用 Driver Verifier 時(shí),驅(qū)動(dòng)程序不?產(chǎn)生系統(tǒng)中斷。請(qǐng)注意,由于隨機(jī)錯(cuò)誤引入系統(tǒng)中,這些測(cè)試的通過率可能會(huì)顯著降低。
-
啟用 Low Resource Simulation(低資源模擬,錯(cuò)誤注入)并重新啟動(dòng):
從命令行:verifier /volatile /flags 7
從用戶界面:
-
a. 在初始屏幕上單擊 Create custom settings [for code developers] 并單擊 Next 按鈕。
-
b. 選擇 Low resource simulation 并單擊 Next。
-
c. 確保像在前面的方案中那樣選擇這些驅(qū)動(dòng)程序并重新啟動(dòng)。
-
-
再次運(yùn)行執(zhí)行該驅(qū)動(dòng)程序的所有測(cè)試。
-
分析遇到的任何系統(tǒng)中斷。
-
禁用 Low Resource Simulation(低資源模擬,錯(cuò)誤注入)并重新啟動(dòng):
從命令行:verifier /reset?將刪除所有設(shè)置,?verifier /volatile /flags 3?將只關(guān)閉錯(cuò)誤注入。
從用戶界面:
-
a. 單擊?Delete existing settings?并單擊?Finish。
-
b. 重新啟動(dòng)。
-
要調(diào)試驗(yàn)證器系統(tǒng)中斷,運(yùn)行調(diào)試器命令?!analyze。有關(guān)更多信息,請(qǐng)查閱 DDK/LDK (Driver Development Kit) Help。
注?在驅(qū)動(dòng)程序中是否使用錯(cuò)誤注入將會(huì)導(dǎo)致執(zhí)行完全不同的代碼路徑,因此為了完全受益于 Driver Verifier 必須運(yùn)行這兩個(gè)方案。
返回頁首?附錄 B:使用 Application Verifier 測(cè)試安全功能
本節(jié)的作者是?Lauren Lavoie?。
摘要:描述使用 Application Verifier 工具識(shí)別項(xiàng)目代碼中的常見安全問題。
代碼查看和威脅模型提供優(yōu)秀的靜態(tài)測(cè)試工具,有助于發(fā)現(xiàn)所測(cè)試應(yīng)用程序中的安全性錯(cuò)誤。當(dāng)在應(yīng)用程序上運(yùn)行一組常規(guī)測(cè)試時(shí),AppVerifier 可以在后臺(tái)動(dòng)態(tài)運(yùn)行測(cè)試。AppVerifier 監(jiān)視應(yīng)用程序的行為,方法是部署 Windows_ shim 引擎以便掛鉤應(yīng)用程序編程接口 (API) 調(diào)用。
最初的 AppVerifier 檢測(cè)引起應(yīng)用程序中斷的行為。然后,該工具的新增功能使它能夠驗(yàn)證更精細(xì)的運(yùn)行時(shí)行為,例如,與 Windows 的兼容,查看通用 API 的正確使用,以及查看與安全有關(guān)的基本功能。
有時(shí),開發(fā)人員只是錯(cuò)誤地設(shè)置了安全屬性或誤用了通用的 API 功能,從而無意中編寫了容易遭受特洛伊木馬程序攻擊的代碼。AppVerifier 緩存并記錄可能允許惡意代碼執(zhí)行的那些情況,這樣開發(fā)人員可以使他們的代碼更安全。
查看 DACL 的正確使用
開發(fā)人員使代碼易受攻擊的最常見情況是不恰當(dāng)?shù)厥褂米杂稍L問控制列表(Discretionary Access Control Lists,DACL),該列表指定哪些組可以訪問特定的資源以及它們具有什么類型的訪問權(quán)。很多創(chuàng)建或訪問資源的 API 將 DACL 作為其參數(shù)之一。 AppVerifier:
-
截獲這些 API 調(diào)用并查看 DACL 參數(shù)是有效的。這是 AppVerifier 查看資源具有安全訪問權(quán)限的最簡(jiǎn)單、最有效的方式之一。
-
無論何時(shí)遇到一個(gè) NULL DACL 或?yàn)樗杏脩籼峁┓潜匦璧臋?quán)限(例如,允許所有用戶更改訪問權(quán)限或刪除資源)的任何 DACL,都會(huì)記錄錯(cuò)誤。此外,AppVerifier 認(rèn)為允許非管理員的任何用戶更改訪問權(quán)限或資源所有者都是錯(cuò)誤的。
-
當(dāng)文件打開(因?yàn)橛善渌M(jìn)程創(chuàng)建的文件在創(chuàng)建時(shí)不可能進(jìn)行上面的 AppVerifier 檢查)或刪除(因?yàn)橐瞥募r(shí)不復(fù)制文件的安全屬性)時(shí)查看訪問權(quán)限。
查看 CreateProcess 的正確使用
如果未正確地指定參數(shù),針對(duì) CreateProcess API 函數(shù)的調(diào)用就容易受到攻擊。如果 CreateProcess(或其他相關(guān)的 API 函數(shù))使用 NULL lpApplicationName 參數(shù)和包含空格的 lpCommandLine 參數(shù)進(jìn)行調(diào)用,則 AppVerifier 將生成一個(gè)錯(cuò)誤。例如,它不允許以下代碼作為命令行參數(shù):
c:\program files\sample.exe –t –g c:\program files\sample\test使用該命令行時(shí),如果一個(gè)惡意用戶將其程序安裝到 C:\Program,則應(yīng)用程序可能會(huì)在無意中執(zhí)行惡意代碼。
強(qiáng)制安全使用套接字 API
AppVerifier 查看調(diào)用套接字函數(shù)的應(yīng)用程序是否使用 SO_EXCLUSIVEADDRUSE 標(biāo)記。這樣做可防止使用 SO_REUSEADDR 的惡意主機(jī)綁定到一個(gè)端口并對(duì)主機(jī)進(jìn)行黑客攻擊。
獲取和使用 AppVerifier
謹(jǐn)記,無需將任何測(cè)試添加到測(cè)試套件即可利用 AppVerifier。它配置 Windows 以便隨時(shí)監(jiān)視應(yīng)用程序的所有活動(dòng),直到您通知它停止為止。查看 AppVerifier Help 可獲知其測(cè)試的詳細(xì)信息,以及關(guān)于 AppVerifier 如何報(bào)告錯(cuò)誤的信息。最新版本的 AppVerifier 可以從?Microsoft Download Center?下載。
總結(jié)
以上是生活随笔為你收集整理的在软件开发生命周期中使用应用程序验证器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USF MSDS501 计算数据科学中文
- 下一篇: Bracket Sequencing