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



















