詳解Windows、Linux中“可信路徑”安全機(jī)制
計(jì)算機(jī)系統(tǒng)中,用戶在一般情況并不直接與內(nèi)核打交道,中間還有一層應(yīng)用層作為接口在用戶與內(nèi)核之間相互作用著,但這種設(shè)計(jì)能夠保護(hù)內(nèi)核不會(huì)被用戶肆意修改窺測,但也隨之帶來了安全問題,由于應(yīng)用層并不是能完全信任之的,因此在操作系統(tǒng)安全功能中,往往會(huì)提供可信路徑這一功能[這也是橘皮書 B2 級(jí)的安全要求]。
可信路徑[trusted path]是怎么樣的概念?顧名思義,它就是這么一種功能的實(shí)現(xiàn):避過應(yīng)用層,在用戶與內(nèi)核之間開辟一條直接的可信任的交互通道。真的有必要那么麻煩,不得不在進(jìn)行高風(fēng)險(xiǎn)操作時(shí)使用可信路徑與內(nèi)核互動(dòng)嗎?遺憾地告訴你:確實(shí)是!有經(jīng)驗(yàn)的系統(tǒng)管理員普遍都很清楚來自網(wǎng)絡(luò)的威脅有多么嚴(yán)重。黑帽子們能使用特洛伊木馬[Trojan horse],記錄你在登陸及其它敏感操作時(shí)的行動(dòng),從而竊取你的寶貴口令。
你一定對(duì)"ctrl + alt + del"三鍵序列極有印象,在DOS年代,我們用它快速重啟機(jī)器,并稱之為"熱啟動(dòng)",而在WINDOWS 9X時(shí)代,我們則用它查看進(jìn)程,不過也許你沒有注意到,在WINDOWS9X 向WINNT過渡后,我們的PC也運(yùn)行著NT內(nèi)核的WIN2000/XP時(shí),事實(shí)上"ctrl + alt + del"三鍵的職能已經(jīng)有了些微改變,微軟在它的官方文檔中,稱"ctrl + alt + del"為SAS[Secure Attention Sequence],并且將之列為安全功能-可信路徑的構(gòu)成部分,而在linux下,也有著類似的按鍵序列可用。
Linux 環(huán)境下的安全留意鍵—— SAK[Secure Attention Key],這個(gè)SAK是一組鍵, 在我們常見的X86平臺(tái)下,它是"alt+sysrq+k",而在SPARC下,SAK則是"alt+STOP+k", SAK默認(rèn)不打開,需要用 echo "1" > /proc/sys/kernel/sysrq 這條命令激活,當(dāng)然,你也可以將它寫進(jìn)登錄腳本中,這樣就不必每次麻煩了。對(duì)SAK實(shí)現(xiàn)有興趣的朋友,可以參考參考 linux/drivers/char/sysrq.c和 linux/drivers/char/tty_io.c::do_SAK
SAK序列鍵其實(shí)是被稱做"magic sysrq key" 中的一組,"magic sysrq key" 還有一些特殊鍵,與SAK一樣,它們都是使用"alt + sysrq + ..."格式,其中的...可換為某些特殊的字母比如"i",在《MAGIC SYSRQ KEY DOCUMENTATION v1.32》手冊(cè)上,"alt + sysrq +i" 所代表的行為是"Send a SIGKILL to all processes, except for init." 意思就是向除了 init 外的所有進(jìn)程發(fā)送一條kill 信號(hào);現(xiàn)在我們看看在《MAGIC SYSRQ KEY DOCUMENTATION v1.32》手冊(cè)中對(duì)"alt + sysrq +k"的解釋吧:
"sa'K' (Secure Access Key) is usefull when you want to be
sure there are no trojan program is running at console and
which could grab your password when you would try to login.
It will kill all programs on given console and thus
letting you make sure that the login prompt you see is
actually the one from init, not some trojan program. "
這段話正是SAK的功能寫照:SAK對(duì)你確定在登陸時(shí)沒有試圖竊取密碼的特洛伊木馬程序運(yùn)行在當(dāng)前控制臺(tái)上,它能殺死當(dāng)前控制臺(tái)上的全部應(yīng)用程序,以此令你確信看到的登陸畫面來自init,而非木馬程序。當(dāng)你按下這組鍵時(shí),也就是引發(fā)了這一特定事件,那么按照設(shè)計(jì)的流程,系統(tǒng)陷入核心狀態(tài),這時(shí)你將可以直接與內(nèi)核溝通,也就是說,出現(xiàn)在你的“理應(yīng)”是如假包換的真實(shí)登陸提示信息,為什么是理應(yīng)?我們下文分析:->
#p#在討論SAK的脆弱點(diǎn)之前,我們先來看看當(dāng)你按下SAK時(shí),系統(tǒng)發(fā)生了什么事情吧,當(dāng)系統(tǒng)處在正常狀態(tài)下時(shí),用戶按下鍵盤時(shí),此事件將進(jìn)入核心以解釋,若其掃描碼對(duì)應(yīng)為SAK,則內(nèi)核將找出引發(fā)此SAK的終端,之后為了創(chuàng)建可信路徑,則需要?dú)⑺浪蟹呛诵倪M(jìn)程,也就是說在此時(shí),任何此終端上用戶建立的進(jìn)程都將死亡,當(dāng)然,可能存在的木馬進(jìn)程也被殺死了,系統(tǒng)最后將重新打開登陸進(jìn)程,使用戶獲得放心的交互。
注意:
1:事實(shí)上這里提到的與內(nèi)核交互,確切地說應(yīng)該是與TCB[Trusted Computing Base,可信計(jì)算基]的軟件部分打交道,包括安全內(nèi)核與可信系統(tǒng)程序,TCB事實(shí)上是個(gè)很廣泛的概念,包括了安全內(nèi)核、特權(quán)程序、系統(tǒng)命令與相關(guān)硬件設(shè)備,甚至在邏輯上包括了系統(tǒng)管理員和安全管理員,離題太遠(yuǎn),請(qǐng)各位對(duì)TCB感興趣的朋友查詢相關(guān)手冊(cè)`:->
2:Q:SAK怎樣判斷該殺死哪些進(jìn)程,以免少殺及誤殺?
A:這可真是一個(gè)好問題,因?yàn)榫幹频顷懩M器木馬的的黑客必須深刻理解SAK殺死應(yīng)用進(jìn)程的實(shí)現(xiàn)方式,已此試圖破壞這機(jī)制,事實(shí)上,SAK命令殺死應(yīng)用進(jìn)程是根據(jù)進(jìn)程的PID來執(zhí)行的,linux系統(tǒng)剛剛啟動(dòng)時(shí)是運(yùn)行在核心狀態(tài)的,這時(shí)只有一個(gè)初始化進(jìn)程,初始化完畢時(shí),初始化進(jìn)程將啟動(dòng)一個(gè)init進(jìn)程,自己進(jìn)入 idle循環(huán),init的PID=1,它是一個(gè)真正的進(jìn)程,也將是進(jìn)程樹上的根,之后的所有進(jìn)程都是init進(jìn)程的“子子孫孫”,可以使用pstree命令查看系統(tǒng)中當(dāng)前的進(jìn)程樹圖,以此了解進(jìn)程間的關(guān)系。
剛剛我們已經(jīng)了解了linux操作系統(tǒng)下的可信路徑的相關(guān)知識(shí),但是我想已經(jīng)有不少朋友更想了解在WINDOWS NT/2000/XP下的可信路徑的情況,Now,let's go.
在NT系列windows操作系統(tǒng)中的可信路徑的引發(fā)方法是把 ctrl+alt+del這三個(gè)鍵同時(shí)按下,這稱為標(biāo)準(zhǔn)SAS[Secure Attention Sequence],當(dāng)系統(tǒng)檢測到一個(gè)標(biāo)準(zhǔn)SAS序列的掃描碼時(shí),將由winlogon 進(jìn)程將系統(tǒng)設(shè)置為已注銷、已登陸、已鎖定三種不同狀態(tài),然后切換當(dāng)前桌面到 Winlogon 桌面。不過要注意到,WINDOWS中的可信路徑的實(shí)現(xiàn)似乎與linux下大不一樣。比如在WIN2000下,按下ctrl+alt+del,切換到winlogon桌面,但是當(dāng)前用戶的進(jìn)程并沒有在這個(gè)時(shí)候被殺死,比如你可以聽著mp3按ctrl+alt+del,這樣做你將在winlogon桌面下,照樣聽mp3,如果其意義是需要注銷再登陸,那自然的,注銷的時(shí)候,當(dāng)前用戶的進(jìn)程都會(huì)被殺死,不過那樣的操作從開始菜單中的關(guān)機(jī)命令有什么區(qū)別,并且,我們也可以在winlogon桌面上邊改密碼邊聽著mp3,不會(huì)有木馬在后臺(tái)偷偷地記錄嗎?對(duì),用戶進(jìn)程并不是像在 linux 下那樣被簡單地殺死,事實(shí)上,在winlogon 桌面初始化過程中,創(chuàng)建了三個(gè)桌面:應(yīng)用程序桌面(\Windows\WinSta0\default)、Winlogon桌面(\Windows\WinSta0\Winlogon)和屏幕保護(hù)桌面(\Windows\WinSta0\ScrenSaver)。而在安全策略上,只有winlogon進(jìn)程可以訪問到winlogon桌面,其它兩個(gè)桌面才允許用戶及其所屬進(jìn)程訪問,因此雖然用戶進(jìn)程在SAS激發(fā)后并不會(huì)被殺死,但它們也不能訪問winlogon桌面以偷竊用戶口令,這就是“Windows特色的可信路徑實(shí)現(xiàn)道路” :->
等等,你也許會(huì)想到GINA木馬,它不就是偽造的登陸窗口嗎?在登陸到windowsNT時(shí),我們按下ctrl+alt+del這個(gè)所謂的可信路徑時(shí),怎么沒有將它殺掉?事實(shí)上,GINA木馬并不是直接擊敗可信路徑這一功能,而是破壞了可信路徑下層的TCB,改變了TCB中軟件結(jié)構(gòu)的一部分!現(xiàn)在我們來回憶一下GINA木馬的一些細(xì)節(jié),還記得吧?
GINA[GINA: Graphical Identification and Authentication,圖形身份驗(yàn)證 ] 在windows中,缺省的GINA就是msgina.dll ,它是運(yùn)行在winlogon.exe的進(jìn)程空間中的,由注冊(cè)表中\(zhòng)HKEY_LOCAL_MACHINE\Softwar
e\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL=yourgina.dll 定義,默認(rèn)情況下則就是msgina.dll,而GINA木馬的實(shí)現(xiàn)機(jī)理則就是通過修改注冊(cè)表,將原來的msgina.dll替換為自己的木馬GINA,以此實(shí)現(xiàn)將截獲的用戶名和密碼保存在某個(gè)文件中,供黑帽子讀取。嚴(yán)格來說這確實(shí)不算是直接擊敗了SAS可信路徑功能,因?yàn)楸仨氂衋dministrator權(quán)限才能進(jìn)行操作注冊(cè)表,完成替換系統(tǒng)文件的工作,而這種方式是微軟提供給客戶的一種功能,方便客戶以自己的方式來進(jìn)行用戶身份驗(yàn)證,比如使用指紋鑒別儀,視網(wǎng)膜掃校儀等非口令驗(yàn)證方式,只要替換msgina.dll為特定的GINA,就可以完成這種銜接工作,因此這只是一種功能,不是缺陷,更不能算是漏洞;并且,在WINDOWS這種操作系統(tǒng)中,若得到了admin權(quán)限,則再也沒有什么不能做的事。在美國foundstone公司編撰的《黑客大曝光》[Hacking Exposed]一書中,也提到了一個(gè)能捕獲ctrl + alt + del 三鍵序列之后的密碼操作的工具,Invisible Keylogger Stealth (IKS),它能遠(yuǎn)程安裝,安裝后需要重啟,之后就能運(yùn)行在后臺(tái),偷偷竊取用戶的密碼,并將其記錄在iks.dat 文件中,且該iks.dat 文件是二進(jìn)制格式,需專用的datview程序解讀,隱蔽性不可謂不好,不過這個(gè)程序仍然不是直接擊敗可信路徑,而是破壞了目標(biāo)機(jī)器的TCB,與GINA木馬類似的,它也需要管理員權(quán)限,因?yàn)樗腔诰幹圃O(shè)備驅(qū)動(dòng)程序來實(shí)現(xiàn)其功能的,而在一臺(tái)WINNT機(jī)器上安全設(shè)備驅(qū)動(dòng),自然必須管理員才能完成操作。因此這仍然不能算是一個(gè)漏洞,從TCB概念的角度來分析也是如此,是TCB中的一部分改變了另一部分,記得我們前面所說的系統(tǒng)管理員也是TCB的構(gòu)成部分嗎?這里指的系統(tǒng)管理員并非具體的人,而是擁有管理權(quán)限的帳戶,機(jī)器、程序是不會(huì)辨別人類的,誰控制了管理帳戶,機(jī)器就聽誰的指揮。
NT系列windows操作系統(tǒng)的啟動(dòng)過程中關(guān)于SAS的定義過程是:
初始化時(shí)GINA已經(jīng)收到VOID WlxUseCtrlAltDel(HANDLE hWlx);這個(gè)函數(shù)它的作用就是通知winlogon.exe,GINA默認(rèn)使用ctrl+alt+del這個(gè)標(biāo)準(zhǔn)SAS.如果要用自己定義SAS序列的話,開發(fā)者必須在編制自己的GINA.dll時(shí)
自行HOOK熱鍵.并且通過:
WlxSasNotify(hGlobalWlx, dwSasType);
這個(gè)函數(shù)來報(bào)告將使用的SAS。
GINA將提供給winlogon.exe一個(gè)函數(shù):
VOID WINAPI WlxDisplaySASNotice(PVOID pContext);
用于顯示歡迎畫面以及驗(yàn)證是否使用了自定義的SAS序列。
【編輯推薦】