TouchEn nxKey鍵盤加密應用程序出現的許多漏洞很容易使其被黑化
TouchEn nxKey是韓國安全軟件公司Raonsecure開發的端到端加密應用程序,用于保證鍵盤使用時的全方位安全,目前這個應用程序主要用于韓國的金融業務,在韓國幾乎所有電腦上都安裝了這款軟件。如果你想在韓國操作網上銀行業務,就必須使用它。不過韓國人對它的安全性并不認可,TouchEn nxKey確實在設計上包含了關鍵日志記錄功能,但它未能充分限制外界對它的訪問。此外,研究人員發現其中存在的七個安全漏洞,可以讓攻擊者實現從簡單的拒絕服務攻擊到遠程代碼執行攻擊。
2005年韓國一個黑客組織通過遠程訪問木馬從人們的銀行賬戶中竊取了5000萬韓元(當時約合5萬美元)。通過這種方式,他們不僅獲得了用戶的登錄憑證,還獲得了他們安全卡上的信息。這種安全卡類似于索引TAN,這是一種第二因素認證方法,2012年在歐盟被禁止,原因是很容易被銀行木馬攻破。
那用戶的計算機是如何被這個惡意應用程序攻擊的?這聽起來像是在用瀏覽器訪問惡意網站時進行的驅動程序下載,很可能是瀏覽器漏洞被利用了。但是也有可能是用戶被誘導安裝了應用程序。如今,上述攻擊場景已經不那么常見了,一是網絡瀏覽器變得更加安全,二是銀行已經完全采用了雙因素驗證。至少在很多國家,你通常需要另一臺設備來確認交易。并且在確認時可以看到交易細節,因此不會貿然確認向其他人轉賬的信息。
韓國則在2006/2007年強制銀行交易使用TouchEn Key,當你在網頁中輸入數據時,該應用程序聲稱可以保護你的敏感數據。最終,TouchEn nxKey被擴展到支持非微軟瀏覽器的使用場景中。
TouchEn nxKey的實際用處
TouchEn nxKey是通過加密鍵盤輸入來預防鍵盤記錄。
依賴TouchEn nxKey的網站運行nxKey SDK,該SDK由兩部分組成:一組運行在網站上的JavaScript代碼和一些服務器端代碼。下面是它的工作原理:
1.在使用nxKey SDK的網站上輸入密碼字段;
2.nxKey SDK的JavaScript代碼會檢測到它并通知你的本地nxKey應用程序;
3.nxKey應用程序在Windows內核中激活它的設備驅動程序;
4.設備驅動程序現在攔截所有鍵盤輸入,鍵盤輸入不是由系統處理,而是被發送到nxKey應用程序。
5.nxKey應用程序加密鍵盤輸入并將其發送給nxKey SDK的JavaScript代碼;
6.JavaScript代碼將加密的數據放入隱藏的表單字段中。實際的密碼字段只接收虛擬文本。
7.輸入完登錄憑證后,點擊“登錄”;
8.加密的鍵盤輸入與其他數據一起發送到服務器。
9.nxKey SDK的服務器端部分對其進行解密,并從中檢索純文本密碼。常規登錄程序接管。
一個試圖記錄輸入到這個網站的數據的鍵盤記錄器只能看到加密的數據。它可以看到網站使用的公鑰,但沒有相應的私鑰。所以沒有辦法解密,密碼是安全的。
網站如何與TouchEn nxKey通信?
網站如何知道計算機上安裝了特定的應用程序呢?它是如何與之溝通的?
最初,TouchEn nxKey需要安裝其瀏覽器擴展。該瀏覽器擴展使用本機消息將請求從網站轉發到應用程序,并將響應發送回網頁。
然而,使用瀏覽器擴展作為中間體已不再是最先進的技術。目前的最佳方法是網站使用WebSockets API直接與應用程序通信,不再需要瀏覽器擴展。

雖然花旗銀行韓國分行等一些網站專門使用新的WebSocket方法,但釜山銀行等其他網站仍然運行完全依賴瀏覽器擴展的舊代碼。
這不僅僅意味著用戶仍然需要安裝瀏覽器擴展,它還解釋了軟件安裝后仍無法識別的頻繁投訴。這些用戶安裝的是不支持WebSocket通信的舊版本軟件。沒有自動更新,目前韓國一些銀行仍然提供這些舊版本的下載。
濫用TouchEn擴展攻擊銀行網站
TouchEn瀏覽器擴展真的很小,它的功能是最少的。通過它的代碼,我們看到了這樣的評論:

目前,危險的eval()調用已經從瀏覽器擴展中被清除了。
研究人員在回調機制中發現了這樣一個問題,網站可以向應用程序發送一個setcallback請求來注冊一些事件。當此類事件發生時,應用程序將指示擴展調用頁面上已注冊的回調函數。從本質上講,頁面上的任何全局函數都可以通過名稱調用。
惡意網頁是否可以注冊其他網頁的回調?有兩個障礙:
目標網頁需要有一個含有id="setcallback"的元素;
回調函數被傳遞到特定的選項卡;
第一個障礙意味著只有使用nxKey SDK的網站會受到攻擊。當通過瀏覽器擴展進行通信時,這些擴展將創建必要的元素。通過WebSockets進行通信不會創建這個元素,這意味著使用更新nxKey SDK的網站不會受到影響。
第二個障礙似乎意味著只有加載在當前選項卡中的頁面才會被攻擊,例如加載在框架中的頁面。除非nxKey應用程序在其響應中設置了錯誤的tabid值。
事實驗證,這非常容易。雖然應用程序使用適當的JSON解析器來處理傳入數據,但響應是通過調用sprintf_s()生成的,不執行轉義。因此,操縱一些響應屬性并向其添加引號可以注入任意JSON屬性。

id屬性將被復制到應用程序的響應中,這意味著響應會突然獲得一個名為x的新JSON屬性。此漏洞允許將tabid的任何值注入到響應中。
惡意頁面如何知道銀行選項卡的ID?它可以使用自己的標簽ID (TouchEn擴展有助于暴露),并嘗試猜測其他標簽ID。或者它可以簡單地將此值留空,在這種情況下,擴展很有幫助:

因此,如果tabid值為空,它將向當前活動的選項卡傳遞消息。
這意味著會發生如下可能的攻擊:
1.在新選項卡中打開銀行網站,它將成為活動選項卡;
2.等待頁面加載,這樣id="setcallback"的元素就出現了;
3.通過TouchEn擴展發送setcallback消息以設置對某個函數的回調,同時用"tabid":""和"reply":"malicious payload"覆蓋JSON響應屬性。
第一個回調調用立即發生。因此,將在銀行網站中調用回調函數,并使用來自reply屬性的惡意有效負載作為參數。
一個可能的回調函數可以是eval,但還有最后一個障礙:TouchEn通過JSON.stringify()將reply屬性傳遞給回調函數。所以我們實際上得到eval("\"malicious payload\"" "),但這沒有任何作用。
另一方面,也許目標頁面有jQuery?調用$('""')將產生預期的結果:

使用TouchEn nxKey的網站很可能也會使用TouchEn Transkey(一種屏幕鍵盤),這依賴于jQuery。總之,所有韓國銀行網站似乎都嚴重依賴jQuery,這及易產生攻擊。
但是update_callback (nxKey SDK的指定回調)也可以被濫用,在傳遞json字符串化的數據時運行任意JavaScript代碼。調用update_callback('{"FaqMove":"javascript:alert(\'Hi, this is JavaScript code running on \'+document.domain)"}')將嘗試重定向到javascript:鏈接,并運行任意代碼進行攻擊。

因此,這種攻擊允許惡意網站破壞任何依賴TouchEn擴展的網站。韓國銀行強制用戶安裝的“安全”應用程序都沒有檢測或防止這種攻擊。
類似TouchEn的瀏覽器擴展
當我開始測試時,Chrome Web Store中有兩個TouchEn擴展。目前這個不太受歡迎但基本上相同的擴展已經被刪除。
研究人員發現了三個幾乎相同的擴展:INISAFE的CrossWeb EX和Smart Manager EX以及iniLINE的CrossWarpEX。CrossWeb EX是其中最受歡迎的,目前有超過400萬用戶。這些擴展同樣會使網站受到攻擊。
我的第一個想法是RaonSecure和INISAFE屬于同一個公司集團。但事實似乎并非如此。
以下是iniLINE軟件開發公司的頁面:

Initech和RaonSecure僅僅是合作伙伴,所以看起來iniLINE是這些瀏覽器擴展的開發者。
通過網站使用鍵盤記錄功能
現在假設有一個惡意網站。讓我們假設這個網站告訴TouchEn nxKey:“你好,用戶現在在密碼字段,我想要他們輸入的數據。”那個網站會得到所有的鍵盤輸入嗎?
是的,會的!它將獲取用戶鍵入的任何內容,無論當前哪個瀏覽器選項卡處于活動狀態,或者瀏覽器本身是否處于活動狀態。nxKey應用程序只是遵從請求,此時不會檢查它是否有意義。事實上,它甚至會向網站提供在用戶訪問控制提示中輸入的管理員密碼。
但肯定會有障礙。首先,這樣的網站需要一個有效的許可證。在使用任何應用程序功能之前,它需要在get_versions調用中傳遞許可證:

此特定的許可證僅對www.example.com有效。所以只能在www.example.com網站上使用。或者被任何聲稱是www.example.com的網站。
看到上面代碼中的origin屬性了嗎?是的,TouchEn nxKey實際上相信,而不是查看Origin HTTP標頭。因此,從一些合法使用nxKey的網站獲取許可證并聲稱自己就是該網站是很簡單的。另一個障礙是:惡意網站接收到的數據不會被加密嗎?如何解密呢?應該可以使用不同的公鑰,即已知私鑰的公鑰。那么人們只需要知道算法,然后解密數據就可以了。
不過,這些都不是必要的。如果TouchEn nxKey根本沒有接收到任何公鑰,它釋放密鑰,這樣該網站將接收明文鍵盤輸入。
概念驗證頁面:

還有第三個障礙,這大大降低了這個漏洞的嚴重程度,被惡意網頁攔截的鍵盤輸入不再到達目的地。當用戶開始輸入密碼時,肯定會感到可疑,但文本字段中卻沒有顯示任何內容。我對nxKey應用程序的分析表明,它只能這樣工作:鍵盤輸入要么到達網頁,要么到達實際目標,但不能同時實現。
攻擊應用程序
如上所述,編寫這個產品JavaScript代碼的人并不精通它。但也許是因為他們所有的專家都有c++背景?我們以前已經看到過這種情況,開發人員試圖盡快放棄JavaScript,將所有任務委托給c++代碼。
遺憾的是,這還只是猜測。與二進制代碼相比,我更習慣于分析JavaScript,但應用程序本身似乎也同樣充滿了漏洞。事實上,它主要使用C而不是c++的典型方法,其中有很多手動內存管理。
上述已經提到過sprintf_s()的使用,關于像sprintf_s()或strcpy_s()這樣的函數,有一個有趣的事實,雖然它們是sprintf()或strcpy()函數的“內存安全”版本,不會溢出緩沖區,但使用起來仍然很棘手。如果沒有給它們足夠大的緩沖區,它們將調用無效的參數處理程序。默認情況下,這會使應用程序崩潰。
nxKey應用程序的緩沖區不夠大,也不會改變默認行為。因此,在許多情況下,發送過大的值會使應用程序崩潰。崩潰總比緩沖區溢出好,但崩潰的應用程序無法再執行其任務。這就會造成,用戶的網上銀行登錄表單似乎正常工作,但它現在以明文形式接收你的密碼。用戶只會在提交表單時注意到某些錯誤,從而導致錯誤消息,此漏洞允許拒絕服務攻擊。
另一個示例是,在所有的JSON解析器中,nxKey應用程序的開發人員選擇了用c編寫的解析器。不僅如此,他們還從2014年1月起隨機選擇了一個存儲庫狀態,并且從未更新過它。空指針解引用在2014年6月修復,現在還在。因此,向應用程序發送](一個方括號)而不是JSON數據足以使其崩潰,這是一個允許拒絕服務攻擊的漏洞。
上面提到的應用程序許可是base64編碼的數據,應用程序需要對其進行解碼。解碼器函數如下所示:

我不確定這個函數來自何處,它與CycloneCRYPTO庫的base64解碼器有明顯的相似之處。但是CycloneCRYPTO將結果寫入預先分配的緩沖區。因此,緩沖區分配邏輯可能是由nxKey開發人員自己添加的。
這種邏輯是有缺陷的,它明確地假設input_len是4的倍數。但是對于像abcd==這樣的輸入,它的計算將導致分配2個字節的緩沖區,盡管實際輸出是3個字節。
本文的概念驗證頁面只是向nxKey應用程序發送隨機生成的許可字符串。這足以在幾秒鐘內使應用程序崩潰。連接調試器顯示了內存攻擊的明顯證據:應用程序崩潰是因為它試圖使用虛假內存位置讀取或寫入數據。
現代操作系統有一些機制,可以使像這樣的緩沖區溢出更難轉化為代碼執行漏洞。但這些機制只有在實際使用時才有幫助。然而,nxKey開發人員在應用程序加載的兩個DLL上關閉了地址空間布局隨機化,在四個DLL上禁用了數據執行阻止。
濫用助手應用程序
到目前為止,這一切都是基于網絡的攻擊。但是,如果惡意軟件應用程序已經將其管理到系統中,并且正在尋找擴展其權限的方法,情況又會如何呢?對于一個旨在幫助對抗此類惡意軟件的應用程序,TouchEn nxKey在保持其自身功能方面表現得非常糟糕。
例如,只要nxKey攔截鍵盤輸入,CKAgentNXE.exe helper應用程序就會啟動。其目的是當nxKey不想處理某個密鑰時,確保它被傳遞到正確的目標應用程序。主應用程序使用的TKAppm.dll庫中的邏輯大致如下:

由于nxKey應用程序是以用戶的權限運行的,所以它將在每個合理的設置中運行CKAgentNXE.exe。助手應用程序在收到命令代碼2后,將調用SendInput()。
研究人員注意到CKAgentNXE.exe為其IPC對象設置了一個安全描述符,以允許從完整性級別為低的進程進行訪問。我還注意到,安裝程序在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy下創建注冊表項,以允許自動提升CKAgentNXE.exe。這就是它點擊的位置,這都是因為Internet Explorer沙盒。
因此,當TouchEn Key在Internet Explorer中作為ActiveX運行時,其完整性級別為Low。以這種方式被沙盒有效地使得無法使用SendInput()。通過允許從Internet Explorer沙箱中運行和自動提升CKAgentNXE.exe,可以繞過這個限制。一旦helper應用程序開始運行,沙盒ActiveX控件就可以連接到它并要求它執行某些操作,比如調用SendInput()。
除了Internet Explorer,這種方法沒有任何意義,然而TouchEn nxKey也將某些任務委托給CKAgentNXE.exe,這無疑會對安全產生影響。
假設我們有一個惡意軟件,運行在完整性級別低。它很可能是通過利用瀏覽器漏洞到達那里的,但現在它被困在了那個沙箱中。唯一能做的就是等待CKAgentNXE.exe啟動(遲早會發生)并使用它來發起攻擊。
本文的概念驗證應用程序要求CKAgentNXE.exe為它生成虛假的鍵盤輸入:Win鍵,然后是C、M、D和Enter鍵。這導致打開一個命令行提示符,該提示符以中等完整性級別(默認級別)運行。然后,真正惡意的應用程序可以輸入任意命令,在沙盒外運行代碼。
并不是說一個真正惡意的應用程序會以這種可見的方式做事。CKAgentNXE.exe還接受命令代碼5,例如,它將把任意DLL加載到任何進程中。這是一種更好的感染系統的方法。
至少這一次,一個強制性安全應用程序決定讓自己變得有用,并標記為威脅:

惡意軟件開發者可能會找出觸發此警告的原因并繞過它。或者他們可以啟動一個web套接字連接,以確保CKAgentNXE.exe啟動,而不需要像真正的銀行網站那樣激活AhnLab應用程序。當用戶點擊刪除惡意應用程序時,為時已晚,攻擊已經成功。
直接訪問驅動程序的鍵盤記錄功能
如上所述,TouchEn nxKey應用程序(它從驅動程序接收的加密鍵盤輸入)以用戶權限運行,它不是一個高級應用程序,它沒有特殊權限,也就無法限制對驅動程序功能的訪問。系統上的任何應用程序都可以訪問這個功能。它只需要知道nxKey如何與它的驅動程序通信,但這個通信協議并不復雜。
TKAppm.dll是執行驅動程序通信的庫,它使用Themida進行了模糊處理,Themida背后的供應商承諾:Themida?使用SecureEngine?保護技術,當以最高優先級運行時,該技術實施了前所未有的保護技術,以保護應用程序免受高級軟件破解。
也許nxKey開發人員認為這將提供足夠的保護,防止逆向工程。然而,在運行時連接調試器允許保存已解密的TKAppm.dll內存,并將結果加載到Ghidra中進行分析。

此時,即使是在安全模式下啟動時,應用程序拒絕工作是沒有用的。
無論哪種方式,我都可以編寫一個小型(70行代碼)應用程序,連接到驅動程序并使用它攔截系統上的所有鍵盤輸入。它不需要提升,以用戶權限運行就足夠了。與網頁不同的是,這個應用程序還可以確保鍵盤輸入傳遞到目的地,因此用戶不會注意到任何內容。創建一個鍵盤記錄器從來沒有這么容易!
這個鍵盤記錄程序很好地集成了nxKey應用程序,因此,nxKey將接收鍵盤輸入,對其進行加密,并將加密數據發送到網站。
在開發內核驅動程序時,有一點你應該知道,驅動程序崩潰會導致整個系統崩潰。這就是為什么你應該特別確保你的驅動程序代碼永遠不會失敗。
nxKey使用的驅動程序是否會失敗?雖然研究人員沒有仔細看它,但卻意外地發現它可以。應用程序將使用DeviceIoControl()請求驅動程序提供一個指向輸入緩沖區的指針。驅動程序通過調用mmmaplockedpagesspecificycache()來創建這個指針。
是的,這意味著這個輸入緩沖區對系統上的每個應用程序都是可見的。但這不是主要問題。如果應用程序再次請求指針會發生什么?那么,驅動程序將簡單地執行另一個mmmaplockedpagesspecificycache()調用。
在循環中執行此操作大約20秒后,整個虛擬地址空間被耗盡,mmmaplockedpagesspecificycache()返回NULL。驅動程序不檢查返回值并崩潰,此時,操作系統自動重新啟動。
總結
通常,當披露漏洞時,它們已經被修復了。不幸的是,截止發文,上述這些漏洞都沒有得到解決。我們不知道供應商計劃何時解決這些問題,也不知道他們計劃如何向用戶推出更新,特別是考慮到銀行已經發布了至少比最新版本落后三代的版本。需要注意的是,保護程序沒有自動更新功能。
參考及來源:
https://palant.info/2023/01/09/touchen-nxkey-the-keylogging-anti-keylogger-solution/