摘要:針對現(xiàn)有格式化串讀寫越界防御存在的問題,設(shè)計(jì)一種能夠防御格式化串讀寫越界的虛擬機(jī)。通過分析格式化串讀寫越界防御虛擬機(jī)的行為,提出一種新的格式化串讀寫越界防御模型,給出了格式化串讀寫越界防御虛擬機(jī)的概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)。實(shí)驗(yàn)表明,該防御虛擬機(jī)能夠加載和執(zhí)行用戶程序, 能控制程序的執(zhí)行流程,記錄越界發(fā)生時(shí)進(jìn)程內(nèi)的內(nèi)容,并提供保護(hù)、檢測、響應(yīng)和恢復(fù)功能。
關(guān)鍵詞:格式化串;讀寫越界防御;虛擬機(jī)
中圖分類號(hào):TP309.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)03-0026-04
Research of Reading-writing-cross-border Defense Virtual Machine for Format String
HUANG Yu-wen
(College of Computer Science and Information Engineering,HeZe University,Heze 274015, China)
Abstract: Aim to the probelems of reading-writing-cross-border defense for format string, design a virtual machine that can defense reading-writing-cross-border action for the formatted string. By analyzing the reading-writing-cross-border action of the formatted string, puts forward a new kind of reading-writing-cross-border defense model for format string, and gives the summary and detailed design the reading-writing-cross-border defense virtual machines. Experiments show that the defense virtual machine can load and execute the user programs, and can control the execution process, record the content of the cross-border occurs within a process, and provide the function of the protection, the detection, the response and the recovery.
Key words:format string;reading-writing-cross-border defense;virtual machine
1 研究背景
1999年9月, Tymm Twillman發(fā)現(xiàn)第一個(gè)格式化串讀寫越界漏洞,當(dāng)時(shí)沒有引起重視。2000 年6月, BugTraq公開發(fā)布wu-ftpd2.6.0軟件的格式串讀寫越界漏洞,格式串讀寫越界漏洞的危害開始逐漸被引起重視[1]。截止到2013年10月,中國國家安全漏洞庫網(wǎng)站已發(fā)布格式化串讀寫越界漏洞362個(gè),Common Vulnerabilities and Exposures(CVE)網(wǎng)站已發(fā)布格式化讀寫越界漏洞740個(gè)。格式化讀寫越界漏洞出現(xiàn)的歷史雖然比較短,但攻擊者可以利用這些漏洞進(jìn)行遠(yuǎn)程攻擊,并可以往任意地址寫任意內(nèi)容,格式化串讀寫越界攻擊是非常致命的[2]。
現(xiàn)有格式化讀寫越界防御方法包含靜態(tài)和動(dòng)態(tài)兩種方式,靜態(tài)防御方法不執(zhí)行源程序,通過詞法分析方式檢測格式化串讀寫漏洞的存在,常用的靜態(tài)檢測工具有Pscan和Cqual等[3]。動(dòng)態(tài)防御方法在程序運(yùn)行中進(jìn)行,常用的動(dòng)態(tài)防御工具有Libformat、FormatGuard、Whitelists[4]和FormatShield[5]等。靜態(tài)防御方法對源程序進(jìn)行檢測,而很多時(shí)候源程序無法獲取,并且靜態(tài)防御方法存在較多誤報(bào)?,F(xiàn)有動(dòng)態(tài)防御方法在程序運(yùn)行過程中檢測到錯(cuò)誤,但并不能阻止程序的執(zhí)行。針對現(xiàn)有格式化串讀寫越界防御存在的問題,本文設(shè)計(jì)一種能夠防御格式化串讀寫越界的虛擬機(jī),虛擬機(jī)在程序的執(zhí)行過程中,通過時(shí)刻檢測、控制部分關(guān)鍵指令來防御格式化串讀寫越界。當(dāng)讀寫越界發(fā)生時(shí),能控制程序的執(zhí)行流程,記錄越界發(fā)生時(shí)進(jìn)程內(nèi)的內(nèi)容,并提供保護(hù)、檢測、響應(yīng)和恢復(fù)功能。
2 格式化串讀寫越界防御虛擬機(jī)的行為
格式化串讀寫越界防御虛擬機(jī)系統(tǒng)的總體行為是其若干有序活動(dòng)組成的若干有序子集,按彼此關(guān)系構(gòu)造出來的從系統(tǒng)輸入到輸出的所有映射。
定義 2-1格式化串是指含有格式化參數(shù)的字符串。記為:
[format_string:=(αβ)?]
其中,[format_string]表示格式化串, [α]代表普通字符串, [β]代表格式化參數(shù)。格式化參數(shù)以%作為起始點(diǎn),以格式字符作為終結(jié)點(diǎn),起始點(diǎn)和終結(jié)點(diǎn)之間可以含有格式說明符號(hào)。
定義2-2 格式化串讀活動(dòng)是將外部數(shù)據(jù)流由格式化函數(shù)影射到進(jìn)程內(nèi)存的變量列表空間中。記為:
[δread:out_data×fuction→memory]
其中,[δread]表示格式化串讀活動(dòng), [out_data]代表外部數(shù)據(jù)流,[fuction]表示通過格式化函數(shù)進(jìn)行的操作, [memory]代表正在運(yùn)行的進(jìn)程內(nèi)存區(qū)域。
定義 2-3格式化串寫活動(dòng)是將進(jìn)程內(nèi)存的變量列表空間中的數(shù)據(jù)由格式化函數(shù)影射到外部數(shù)據(jù)流中。記為:
[δwrite:memory×fuction→out_data]
其中,[δwrite]表示格式化串寫活動(dòng)。
定義 24 格式化串讀寫越界行為是指當(dāng)執(zhí)行格式化串讀寫操作時(shí)數(shù)據(jù)超過內(nèi)存地址邊界,從而影射相鄰內(nèi)存塊的活動(dòng)。記為:
[ψsrwover:=(memory,out_data,?srwover,ξsrwover)]
[ψsrwover_act:δread:out_data×fuction→memoryδwrite:memory×fuction→out_data]
[?srwover:={δread,δwrite,δtrue_act,δnormal_act}]
[ξsrwover:=δread,δtrue_act,δread,δnormal_act,δwrite,δtrue_act,δwrite,δnormal_act]
[ψsrwover]代表格式化串讀寫越界行為,[ψsrwover_act]代表格式化串讀寫越界活動(dòng)的映射關(guān)系,[?srwover]是格式化串讀寫越界的基本活動(dòng),[ξsrwover]活動(dòng)之間的關(guān)系,[δtrue_act]代表正?;顒?dòng),[δnormal_act]代表越界活動(dòng)。
定義2-5程序加載行為是指分析文件、管理內(nèi)存布局、內(nèi)存映像和指令地址重定位四個(gè)活動(dòng)集合及其活動(dòng)序列。記為:
[ψload:=dfovm_load, file,?load,ξload]
[ψload_act: dfovm_load, file→process,heap]
[?load:=δanalysis,δmanager,δimagine,δrelocate]
[ξload:=δanalysis?δmanager?δimage?δrelocate]
[ψload]代表程序加載行為,[ψload_act]代表程序加載活動(dòng)的映射關(guān)系,[?load]代表程序的加載活動(dòng)集合,[ξsrwover]活動(dòng)之間的關(guān)系,[δanalysis]代表分析文件活動(dòng),[δmanager]代表管理內(nèi)存布局活動(dòng),[δimagine]代表內(nèi)存映像活動(dòng),[δrelocate]代表地址重定位活動(dòng)。
定義2-6指令執(zhí)行行為是將用戶程序的目標(biāo)狀態(tài)映射為機(jī)器的行為狀態(tài),是取指令、識(shí)別指令和解析指令3個(gè)活動(dòng)集合及其活動(dòng)序列。記為:
[ψrun:=dfovm_cpu,heap_code,?run,ξrun]
[ψrun_act:{dfovm_cpu,heap_code}→{dfovm,action}]
[?run:=δfetch,δrecognize,δinterpret]
[ξrun:=δfetch?δrecognize?δinprect]
[ψrun]代表指令執(zhí)行行為,[ψrun_act]代表指令執(zhí)行活動(dòng)的映射關(guān)系,[?run]代表指令執(zhí)行行為活動(dòng)集合, [ξrun]活動(dòng)之間的關(guān)系,[δfetch]代表取指令活動(dòng),[δrecognize]代表識(shí)別指令活動(dòng),[δinprect]代表解析指令活動(dòng)。
定義2-7 系統(tǒng)調(diào)用行為是裝載動(dòng)態(tài)庫、獲取引用函數(shù)和釋放動(dòng)態(tài)庫活動(dòng)的集合及其活動(dòng)序列。記為:
[ψsyscall::=file,lib_function,?syscall,ξsyscall]
[ψSyscall_act:file,lib_function→dfovm,action]
[?syscall=δloadlib,δgetpro,δfreelib]
[ξsyscall:=δloadlib?δgetpro?δfreelib]
[ψsyscall]代表系統(tǒng)調(diào)用行為,[ψSyscall_act]代表系統(tǒng)調(diào)用活動(dòng)的映射關(guān)系,[?syscall]代表系統(tǒng)調(diào)用活動(dòng)集合, [ξsyscall]代表活動(dòng)之間的關(guān)系,[δloadlib]代表裝載動(dòng)態(tài)庫活動(dòng),[δgetpro]代表獲取引用函數(shù)活動(dòng),[δfreelib]代表釋放動(dòng)態(tài)庫活動(dòng)。
定義2-8:格式化串讀寫越界防御行為是指在格式化串讀寫越界過程中對進(jìn)程中堆棧信息的保護(hù)、檢測、響應(yīng)和恢復(fù)活動(dòng)的集合及其活動(dòng)序列。記為:
[ψdefend?=over_action,measure,?defend,ξdefend]
[ψdefend_act:{dfovm,over_action}→measure]
[?defend:=δprotect,δdetect,δrespond,δrecover]
[ξdefend:=φprotect?δdetect?δrespond?δrecover]
[ψdefend]代表系統(tǒng)調(diào)用行為,[ψdefend_act]代表系統(tǒng)調(diào)用活動(dòng)的映射關(guān)系,[?defend]代表系統(tǒng)調(diào)用活動(dòng)集合, [ξdefend]代表活動(dòng)之間的關(guān)系,[φprotect]代表保護(hù)活動(dòng),[δdetect]代表檢測活動(dòng),[δrespond]代表響應(yīng)活動(dòng),[δrecover]代表恢復(fù)活動(dòng)。
定義 2-9:格式化串讀寫越界防御虛擬機(jī)系統(tǒng)的行為是虛擬機(jī)加載用戶程序、執(zhí)行用戶程序、進(jìn)行系統(tǒng)調(diào)用和防御格式化串讀寫越界的活動(dòng)集合及其活動(dòng)序列。記為:
[ψdfovm:=dfovm,file,?dfovm,ξdfovm]
[ψdefovm_act:defovm,file→over_action,mersure]
[?dfovm:=δload,δrun,δsyscall,δdefend]
[ξdfovm=δload?δrun?δcallsys?δdefend]
[ψdfovm]代表格式化串讀寫越界防御虛擬機(jī)系統(tǒng)的行為,[ψdefovm_act]代表防御虛擬機(jī)系統(tǒng)活動(dòng)的映射關(guān)系,[?dfovm]代表防御虛擬機(jī)系統(tǒng)活動(dòng)集合, [ξdfovm]代表活動(dòng)之間的關(guān)系,[δload]代表加載用戶程序活動(dòng),[δrun]代表執(zhí)行用戶程序活動(dòng),[δcallsys]代表進(jìn)行系統(tǒng)調(diào)用活動(dòng),[δdefend]代表防御格式化串讀寫越界的活動(dòng)。
3系統(tǒng)模型
格式化串讀寫越界防御虛擬機(jī)從初始化狀態(tài)開始,經(jīng)過保護(hù)狀態(tài)、檢測狀態(tài)、運(yùn)行狀態(tài)、判定狀態(tài)和相應(yīng)狀態(tài),最后到達(dá)恢復(fù)狀態(tài)。格式化串讀寫越界防御虛擬機(jī)的系統(tǒng)模型如圖1所示。
圖1 格式化串讀寫越界防御虛擬機(jī)的系統(tǒng)模型
相應(yīng)狀態(tài)設(shè)置三類響應(yīng),分別對讀出錯(cuò)、寫出錯(cuò)和系統(tǒng)調(diào)用出錯(cuò)進(jìn)行相應(yīng)?;謴?fù)狀態(tài)從存儲(chǔ)文件中取出保存的數(shù)據(jù)信息,能夠使系統(tǒng)恢復(fù)到格式化串讀寫越界之前的狀態(tài)。
4 格式化串讀寫越界虛擬機(jī)的概要設(shè)計(jì)
4.1 設(shè)計(jì)目標(biāo)
格式化串讀寫越界防御虛擬機(jī)設(shè)計(jì)目標(biāo)可以通過格式化串讀寫越界防御虛擬機(jī)用例圖來描述。格式化串讀寫越界防御虛擬機(jī)用例圖如圖2所示。
1) 虛擬機(jī)能夠加載用戶程序并為用戶程序提供所需的運(yùn)行時(shí)環(huán)境。如設(shè)置程序運(yùn)行時(shí)所需的文本段、數(shù)據(jù)段、堆棧段等,并初始化運(yùn)行環(huán)境。
2) 虛擬機(jī)和正常機(jī)器一樣對程序進(jìn)行執(zhí)行,對指令進(jìn)行分析和執(zhí)行,并且虛擬機(jī)能夠進(jìn)行系統(tǒng)調(diào)用。
3) 能夠檢測、防御格式化串讀寫越界行為,能夠記錄格式化串讀寫越界發(fā)生時(shí)內(nèi)存中的內(nèi)容,為防御者提供第一手資料。當(dāng)虛擬機(jī)檢測到發(fā)生格式化串讀寫越界時(shí),虛擬機(jī)能夠?yàn)榉烙咛峁┫鄳?yīng)的選擇處理,是繼續(xù)執(zhí)行用戶程序還是終止程序的運(yùn)行。
圖 2 格式化串讀寫越界防御虛擬機(jī)用例圖
4.2虛擬機(jī)的基本體系結(jié)構(gòu)
根據(jù)系統(tǒng)的設(shè)計(jì)目標(biāo)和虛擬機(jī)系統(tǒng)要達(dá)到的功能,設(shè)計(jì)虛擬機(jī)的基本體系結(jié)構(gòu)如圖3所示:
圖3 格式化讀寫越界防御虛擬機(jī)的基本體系結(jié)構(gòu)
該虛擬機(jī)采用模塊化設(shè)計(jì),利用操作系統(tǒng)提供的功能,建立運(yùn)行文件的虛擬平臺(tái),并在進(jìn)程執(zhí)行過程中進(jìn)行格式化串讀寫越界防御。裝載器模塊負(fù)責(zé)加載程序,創(chuàng)建進(jìn)程運(yùn)行時(shí)內(nèi)存空間, 為程序正常運(yùn)行建立必要的初始環(huán)境,并且重定位指令,把指令首地址交付給虛擬cpu負(fù)責(zé)識(shí)別和解釋。虛擬CPU模塊:是虛擬機(jī)的核心,主要仿真真實(shí)的CPU對程序的機(jī)器指令碼進(jìn)行取指、譯碼和解釋執(zhí)行,并且在指令的執(zhí)行過程中完成格式化串讀寫越界的防御。當(dāng)用戶地址超出正文段范圍時(shí),系統(tǒng)調(diào)用模塊完成系統(tǒng)函數(shù)的調(diào)用。防御模塊負(fù)責(zé)當(dāng)虛擬機(jī)檢測到格式化讀寫越界發(fā)生時(shí),起到防御越界攻擊的功能。
4.3系統(tǒng)程序流程圖
根據(jù)系統(tǒng)的設(shè)計(jì)目標(biāo),設(shè)計(jì)規(guī)劃格式化串讀寫越界防御虛擬機(jī)系統(tǒng)的程序流程圖,如圖4所示。
圖 4 虛擬機(jī)的系統(tǒng)程序流程圖
5 詳細(xì)設(shè)計(jì)
虛擬機(jī)在指令運(yùn)行過程中,通過時(shí)刻檢測、控制關(guān)鍵指令的執(zhí)行以及驗(yàn)證地址信息的完整性動(dòng)態(tài)檢測和防御格式化串讀寫越界。
5.1程序加載模塊設(shè)計(jì)算法
程序加載模塊通過兩次加載實(shí)現(xiàn),第一次操作系統(tǒng)把虛擬機(jī)程序加載到其內(nèi)存空間,第二次虛擬機(jī)加載用戶所要執(zhí)行程序到虛擬機(jī)的內(nèi)存。虛擬機(jī)加載用戶程序的算法如下:
1)分析文件結(jié)構(gòu),計(jì)算文本段、數(shù)據(jù)段所占有空間,申請內(nèi)存空間,如果需要內(nèi)存超出操作系統(tǒng)提供的內(nèi)存,則退出虛擬機(jī)的運(yùn)行,并做日志記錄。
2)劃分文本段、數(shù)據(jù)段、構(gòu)造堆/棧,把文本段設(shè)置可讀、可執(zhí)行、不可寫,數(shù)據(jù)段設(shè)置可讀、可寫,不可執(zhí)行,堆和棧段設(shè)置可讀可寫,不可執(zhí)行;為各段內(nèi)存空間設(shè)置邊界寄存器,以防虛擬機(jī)在執(zhí)行讀寫期間發(fā)生異常;
3)把文件中的數(shù)據(jù)和指令寫到設(shè)置好的數(shù)據(jù)段和文本段中。
4)虛擬機(jī)重定位程序映像指令地址,對正文段的指令進(jìn)行重新定位,并把結(jié)果保存在正文段。
5)將程序首指令地址賦于虛擬機(jī)的IP寄存器;
5.2 指令運(yùn)行模塊設(shè)計(jì)算法
指令運(yùn)行模塊負(fù)責(zé)對用戶程序中的指令運(yùn)行情況,該模塊通過監(jiān)測關(guān)鍵指令的運(yùn)行來判斷是否發(fā)生格式化串讀寫越界,并把指令執(zhí)行的結(jié)果和出錯(cuò)情況寫進(jìn)日志記錄文件中。指令執(zhí)行模塊首先進(jìn)行指令識(shí)別,并把識(shí)別的信息保存到指令結(jié)構(gòu)體變量中,以供指令解釋時(shí)用到,指令執(zhí)行算法描述主要包括以下幾個(gè)步驟:
1) 首先取出虛擬機(jī)IP寄存器的值,并獲取各種常用寄存器的數(shù)值。
2) 根據(jù)IP值從文本段中取出當(dāng)前指令,并放到結(jié)構(gòu)體變量中。
3)進(jìn)行操作碼的判斷,從內(nèi)存中取出的操作碼和存儲(chǔ)文件中預(yù)定義的二進(jìn)制編碼比較,判斷屬于那個(gè)功能指令。
4)進(jìn)行指令操作數(shù)判定,依據(jù)具體的指令,判斷源操作數(shù)和目的操作數(shù),并判斷該操作數(shù)的尋址方式。確定源和目的操作數(shù)操作數(shù)的基址、變址和比例因子;判斷該指令的長度。
5)對指令進(jìn)行解釋并進(jìn)行格式化串讀寫越界的判定。指令解釋首先根據(jù)操作碼,識(shí)別出來該指令屬于指令編碼中的那個(gè)變化形式,如果該指令操作中含有地址信息,還要保存地址信息,用于判斷格式化串讀寫越界的發(fā)生,按照指令本身的含義進(jìn)行解釋并做日志記錄。在解釋的過程中加入判斷格式化串讀寫越界發(fā)生的條件和顯示讀寫越界發(fā)生時(shí)的結(jié)果,進(jìn)行格式化串讀寫越界防御。在解釋過程中,如果發(fā)生系統(tǒng)調(diào)用,還會(huì)執(zhí)行系統(tǒng)調(diào)用算法。在指令解釋過程中,并把出錯(cuò)信息寫進(jìn)日志記錄中。
6) 根據(jù)指令的長度,IP=IP+n。
5.3系統(tǒng)調(diào)用模塊設(shè)計(jì)
當(dāng)跳轉(zhuǎn)指令的執(zhí)行地址跳出用戶程序正文段的范圍時(shí),則判定發(fā)生系統(tǒng)調(diào)用,系統(tǒng)調(diào)用模塊就負(fù)責(zé)執(zhí)行用戶程序涉及到系統(tǒng)調(diào)用,具體設(shè)計(jì)如下:
1) 首先裝載所調(diào)用的動(dòng)態(tài)庫。
2) 獲取所調(diào)用的動(dòng)態(tài)庫函數(shù)。
3) 釋放所調(diào)用的動(dòng)態(tài)庫。
5.4防御和日志模塊設(shè)計(jì)
指令運(yùn)行期間,格式化串讀寫越界防御虛擬機(jī)把運(yùn)行過程中出現(xiàn)的讀寫越界信息記錄到日志。格式化串讀寫越界防御虛擬機(jī)利用日志判定中下一步的操作,如果判定是屬于格式化讀寫越界錯(cuò)誤,則根據(jù)標(biāo)志位判斷是否允許用戶干涉虛擬機(jī)的運(yùn)行情況:終止程序還是繼續(xù)按照發(fā)生讀寫越界前的地址狀態(tài)正確運(yùn)行。繼續(xù)執(zhí)行所獲取的地址信息是從預(yù)先保存的地址列表中取出,該地址列表也是判斷讀寫越界的參考點(diǎn)。
6格式化串讀寫越界防御虛擬機(jī)系統(tǒng)驗(yàn)證
圖5 虛擬機(jī)申請內(nèi)存情況
然后驗(yàn)證虛擬機(jī)的指令執(zhí)行功能,包括格式化函數(shù)調(diào)用情況,近c(diǎn)all指令執(zhí)行情況和遠(yuǎn)call指令執(zhí)行情況。當(dāng)調(diào)用格式化函數(shù)時(shí),指令的執(zhí)行結(jié)果如圖6所示。
圖 6 格式化函數(shù)調(diào)用情況
圖 7 讀寫越界時(shí)的執(zhí)行結(jié)果
最后驗(yàn)證讀寫越界防御功能和日志功能。當(dāng)發(fā)生格式化串讀寫越界的時(shí)候,虛擬機(jī)暫停,有用戶程序負(fù)責(zé)選擇下一步的執(zhí)行結(jié)果,是繼續(xù)執(zhí)行還是終止程序的運(yùn)行。格式化串讀寫越界時(shí)的執(zhí)行結(jié)果如圖7所示。
DFOVM和其余格式化讀寫越界檢測工具的比較結(jié)果如圖8所示。
從上述比較結(jié)果可以看出,DFOVM不僅不需要程序源代碼,而且還能控制程序執(zhí)行流程,并具有日志和恢復(fù)功能。
7 結(jié)論
根據(jù)驗(yàn)證虛擬機(jī)的加載功能的運(yùn)行結(jié)果和測試記錄,虛擬機(jī) DFOVM系統(tǒng)達(dá)到了內(nèi)存申請、程序映象Image及指令重定位功能,程序加載功能達(dá)到了系統(tǒng)的設(shè)計(jì)目標(biāo)。根據(jù)驗(yàn)證虛擬機(jī)DFOVM的運(yùn)行結(jié)果和測試記錄,DFOVM能夠做到讀取指令、分析指令、識(shí)別指令和運(yùn)行指令等功能。DFOVM能夠通過檢測關(guān)鍵指令來判斷溢出并能檢測到格式化讀寫越界的發(fā)生,能夠達(dá)到保護(hù)、檢測、響應(yīng)和恢復(fù)功能,虛擬機(jī)DFOVM達(dá)到了系統(tǒng)的設(shè)計(jì)目標(biāo)。
參考文獻(xiàn):
[1] S T TESO. Exploiting Format String Vuluerabilities [EB/OL].[2001-09-01/2008-09-10]. http://crypto.stanford.edu/cs155/papers/formatstring-1.2.pdf.
[2] 匡春光,王春雷,何蓉暉.一種格式化字符串脆弱性動(dòng)態(tài)檢測技術(shù)[J].微電子學(xué)與計(jì)算機(jī), 2012,29(2):107-110.
[3] 黃玉文,劉春英,李肖堅(jiān). 基于可執(zhí)行文件的緩沖區(qū)溢出檢測模型[J].計(jì)算機(jī)工程,2010,36(2):130-134.
[4] Kohli P,Bruhadeshwar B. Formatshield: A Binary Rewriting defense against rormat string Atacks[C]. Proceedings of the 13th Astralasian conference on information Seeurity and Privaey,Darlinghurst,2008.
[5] Ringenburg F,Grossman D. Preventing format string attacks via automatic and efficient dynamic checking[C]. New York:Proceedings of the 12th ACM conference on computer and communications security, 2005.