勒索病毒工作原理
序言
前些天藉著Windows上的”永恆之藍“漏洞,本來幾乎快銷聲匿跡的加密勒索病毒又重新回到了公眾視線裡。由於電信等網路運營商早就封堵了可能導致中毒的445埠,所以外網影響不大,但是教育網裡的同學就遭殃了,尤其是很多臨畢業的學生紛紛中招,論文被加密,可能因此被迫延畢。
本文嘗試著還原這些勒索病毒中檔案加解密的原理,來了解為什麼這些病毒這麼難纏,並給出一些“破解”的可能性,雖然條件都比較苛刻。
原理
這類病毒都利用了公鑰加密來加密檔案。關於公鑰加密原理和實現可以看本部落格的其它相關文章,這裡不再贅述。
有的病毒使用RSA加密(比如本次爆發的WannaCry病毒),有的使用橢圓曲線加密(比如CTB Locker),以下簡稱ECC。本文主要講解使用橢圓曲線加密的方式。
ECC的優勢在於,相比RSA加密,達到同樣強度的金鑰要短得多,要達到128位AES的加密強度,RSA金鑰長度需要3072位,而ECC只需要256位。對於病毒來說,體積越小越隱蔽越容易傳播,公鑰自然是越短越好了。
但是相應的RSA實現更加簡單,更加易用。
DH(Diffie–Hellman金鑰交換)
DH(Diffie–Hellman key exchange)通常用於通訊中雙方協商金鑰。利用公鑰系統的特性,雙方只需要向對方公佈自己的公鑰,即可得到同一個只有雙方知道的共享金鑰。
假設小紅跟小明進行一次DH,具體流程是:
小紅生成私鑰
小紅公佈公鑰
小明生成私鑰
小明公佈公鑰
小紅計算共享金鑰
小明計算共享金鑰
至此,流程結束,雙方都得到了相同的共享金鑰
需要注意上面的計算用到的並不是我們平常使用的實數域上的指數運算,如果是實數域上的指數運算,我們可以很方便地對公鑰取對數,從而得到私鑰。它們是在有限域內進行的,所以不能通過簡單地對公鑰求對數來得到私鑰,這也是所謂的公鑰系統中的離散對數難題,DH的安全性即由此保證。
而ECDH(Elliptic Curve Diffie–Hellman key exchange)則是基於橢圓曲線離散對數問題。
CTB Locker病毒中ECDH應用
首先,病毒作者自己生成一對橢圓曲線金鑰對,分別稱為主公鑰(master public)和主私鑰(master private),然後把主公鑰寫到病毒中,主私鑰儲存在作者自己的電腦上。
病毒執行時,搜尋硬碟中特定字尾名的檔案(比如doc、xls、pdf等),每找到一個檔案
- 首先採集檔案建立時間、系統環境等資訊,藉助這些資訊生成一個會話私鑰(session private),然後根據會話私鑰生成會話公鑰(session public)。
- 使用會話私鑰和主公鑰,進行ECDH得到共享金鑰(shared secret)
- 對共享金鑰計算SHA-256摘要,得到AES金鑰
- 使用AES金鑰對檔案進行加密並寫回硬碟,同時向加密後的檔案寫入會話公鑰
- 最後刪掉原檔案
可以看到,硬碟上最後儲存的只有病毒自帶的主公鑰,每一個檔案的會話公鑰,以及被加密的檔案內容。想要解密,唯一的辦法就是使用檔案的會話公鑰和病毒作者的主私鑰進行ECDH,得到共享金鑰。
破解方法
想直接解密檔案內容基本不可能。
病毒使用的加密方案都是目前成熟的解決方案,只要實現沒有明顯漏洞,就不可能被破解,實際上常見的勒索病毒(CTB Locker,WannaCry等)目前都沒有被破解。
但是要找回檔案可以從兩個方面入手:
- 病毒刪除檔案後往往沒有對原檔案進行覆蓋操作,使用資料恢復軟體或者找專門的資料恢復機構有一定機率能找回原檔案。目前很多宣稱能找回WannaCry病毒加密檔案的工具都是這種方式。
- 在Windows XP SP2及以下版本的系統中,隨機數產生器存在漏洞,在產生隨機數後隨機數會被保留在記憶體中,於是可以通過讀取記憶體的方式將裡面的隨機數讀出來,從而獲得會話私鑰,解密檔案。這個方法只對使用系統隨機生產生器的病毒有效,而且對系統版本有要求,中毒後機器也不能重啟過。