压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

騰訊馬勁松:WannaCry病毒事件的反思

 

馬勁松,騰訊安全反病毒實驗室的負責人,實驗室主要是做TAV殺毒引擎的研發和運維,加入騰訊之前在瑞星工作

本文是對于WannaCry事件的一些反思。

小病毒 大影響

WannaCry病毒爆發在一夜之間產生了非常大的社會影響,“勒索”“比特幣”“暗網”等關鍵詞在一夜之間耳熟能詳。

我們先簡單的回顧一下勒索軟件的歷史。最早可以追溯到1989年,真正的有一個歷史標志性的事件實際上是在2013年,2013年的時候,真正的是勒索軟件和比特幣結合起來了。當勒索軟件和比特幣結合之后,真的形成了一個有大力可圖的黑色產業。在2017年5月12日以前,勒索軟件只是個小眾的關鍵詞,而此次的WannaCry事件是勒索軟件被大眾所熟知。

其實國內敲詐病毒也是在嘗試階段,比如這個上面提到的Windows的敲詐,這應該是在兩年以前的一個病毒。這一頁是一個手機敲詐,其實大家如果細看的話可以看到,里面都有一個QQ號,因為它里面有一個很大的問題不能解決,就是支付問題。就是你敲詐,把別人鎖定了,怎么收復贖金呢?這是一個很麻煩的事情,他們把QQ號都寫在上面了。所以這個東西,你說它是一個敲詐病毒也好,說是一個惡作劇其實更確切一些。因為寫了QQ號,基本上定位你就是分分鐘的事情,我們更認為它是一個惡作劇的東西。

具體到這次WannaCry事件,為什么影響這么大?基本上可以歸結成兩點。第一點就是這次的敲詐勒索病毒和漏洞結合起來了,這是一個質量非常好的漏洞,微軟在3月14日已經發了補丁,但是打補丁的時候大家知道有一個空檔期,這個被充分利用了。另外比較重要的原因就是利用方式公開了,把整個完整的利用的辦法都公開了,你可以任意的替換里面的組件,想做任何的事情都可以,這個一公開之后,這些作惡者用起來就非常容易了。地區個其實也是比較重要的,就是這個漏洞是Windows的系統漏洞,基本上你只要用Windows,它就一定有這個漏洞,分布很廣。不像某些應用漏洞,不裝這個應用或者不開啟這個應用就可以規避這個漏洞。這個不是,只要Windows啟動了,就一定會暴露在這個漏洞之下。第二點影響比較大的就是這次針對的目標是我們PC上的數據文件,大家知道,一臺PC也好,一臺手機也好,真正有價值,有意義的可能是里面的數據,硬件的成本是固定的,而且隨著摩爾定律,隨著社會的發展是越來越降低的。真正重要的是你的數據,這次的發力點,破壞的也是你的數據,大家的感觸非常深,非常疼。鎖定被敲詐之后贖回之路非常漫長,我不知道在座的各位有沒有人做過這方面的嘗試,就是真正你點那個軟件,按它的提示是非常麻煩的,就是國內因為一些特殊的網絡,一些管理的因素,對于訪問暗網都很成問題。就是你中招了,想贖回基本上都是沒有辦法的,很麻煩。如果我們用暴力破解,用技術手段幾乎是不可解決的,這里打了“幾乎”兩個字,那就是說,在某些特殊的情況下,可能還是有一線希望,可能還原回來的。

具體到這個漏洞,Shadow Brokers公布這個漏洞方式是4月中旬,公布之后我們也緊急的利用它的一些信息做了一款漏洞的檢測工具,可以直接輸入IP或者輸入一個IP列表進行檢測。這個工具其實是有參考代碼,還是很簡單的。我想說的是,這個工具我們在5月12日之后,5月13日這個病毒真正爆發了,應該是在上班以后,周一或者是周二的樣子,我們把這個工具給到了一個合作單位,不方便說這個單位的名稱。讓他們去檢測一下內網的情況,大家可以看到,這是一個枚舉,從.1開始一直到255,命中率其實還是很高的,隨便就找到了一個沒打補丁的。下面這一張我不知道后面的同事能不能看清,是他們單位里面把知道的IP寫到一個配置文件里面,用這個工具去掃,基本上是把把中,大家可以看到。回到這一頁大家也能看到,漏洞的利用方式是公開的,分布是很廣的,這就是讓敲打、勒索的這種危害的病毒,實際上是搭載了一個非常高效,非常好用的一個傳播工具,可以快速的進行傳播。

剛才分析了病毒為什么影響這么大,因為它的漏洞分布很廣。下面我們來討論一下關于破解的一些事情,被勒索以后真的就不能破解嗎?其實也不完全是這樣。這里面舉了兩個簡單的Case,這是我們實驗室曾經處理過的兩個敲詐的病毒。第一個是作者實現的時候,算法沒有問題,算法在理論層面上是不可逆的。但是在它的具體實現上,有了一個小小的瑕疵,找到了一個破解的辦法,就是把它的破解強度一下子降低了很多。Tesla這個東西,因為一些原因,作者把Key放出去了。舉這兩個例子是說明什么呢?就是我們看起來一些不可解、不可破的危害或者是樣本,只要追下去,可能就會有一絲的希望。

具體到這一次的敲詐,有沒有可能找到曙光?我們也對整個加密流程做了一個詳細的分析,簡單的在這里進行了一下整理。這是一個加密流程,作者會把一個公鑰放出來,在本機里面,在每一臺中招的機器上面會生成一個RSA的公密鑰,還有一個使AES,會把AES隨機的密鑰用生成的RSA的私鑰加密起來。對應生成的這個RSA的公鑰,用病毒做的公鑰加密起來,這樣形成的加密鏈導致是不可破解的。這張圖如果大家熟悉SSL通訊的,可能也能看到,跟這個也是比較像的,你在建立一個SSL通訊的時候,基本上也是先通過證書拿到一個確認的公鑰,然后進行后面的流程。

我們重點關注的是在這里,生成本地的RSA私鑰的時候。大家看AES,這是一個對稱加密的,這個密鑰是一串隨機的數,生成之后,這個數拿到下面去用了,再去碰這個數的機會實際上在算法里面是不多的,會把它拆解來使用,從產生到使用流程非常簡短,所以在AES這個部分,找到漏洞的可能性是非常小的。但是在RSA這邊不是,RSA要能夠產生出來一個可用的公司鑰,其實還是會經過幾步的過程,我后面會提到。在這幾步的過程當中,某一步如果在具體實現的時候有瑕疵和漏洞,還是會可能被利用到。

這里可能要簡單的回顧一下RSA的算法。這個我就不詳細的去讀這個東西了,總之有幾個關鍵點,就是首先要有兩個大的素數P和Q做下面的運算。最關鍵的大家看這句話,當你產生了一對公鑰和一對私鑰之后,一定要把P和Q銷毀掉,這是很關鍵的。如果有一個沒有銷毀,用N除以那個數,這兩個質數就拿到了。拿到了兩個質數,整個RSA的加密體系就能夠破解掉。下面這張表格是我在網上找到的,我覺得這個可能是目前為止我看到的解釋最清楚的一個RSA的加解密的算法。所以我們也是在想,在整個RSA使用的過程中,有沒有可能有漏洞或者有缺陷能被我們利用呢?那幾天我們的同事一直在做這一方面的逆向,這種研究工作,終于看到了轉機。

我特別打了一個標題,向Adrien這個人表示敬意,他把他研究的成果及時的公開了,讓我們很多人的工作速度和進程加快了很多。在他公開的文檔里面,其實比較重要的是下面我打橫線的這兩句。簡單來說,就是說Windows Crypt的API在具體實現的時候,在XP這個版本上沒有把質數清除,在內存里面還是存在的,有一定的可能性,就是只要這個進程不做其他的事情了,通過枚舉可能還是有辦法的,這是很關鍵的一點。這里有一個很大的條件,就是在XP系統上,我們后來在Win7、Win10上都做了反復的驗證,發現這個Key其實是被很好的清除掉了。這里其實也有一個比較有意思的事情,就是我們的同事在逆向WannaCry的時候,發現這個是非常高明的,很多人也有逆向的愛好和能力,非常建議大家能夠去逆向一下這個Windows Crypt的API,那個實現還是非常嚴謹的。

破解流程。

會在整個加密進程的空間里面搜索所有的內存,每次讀取128個字節,大家可以算一下,乘以8正好是1024。他每次會讀128個字節,先假定它就是那個質數。最精彩的是在這里,怎么判斷這128個字節是一個質數呢?他算了一下熵值,這是非常高明的。因為大家知道,算一段8分的熵值這個速度是非常快的,如果熵值大于0.8,也就是說這一段內存是比較混亂的,他認為就是質數了。如果它是質數了怎么辦?后面就去看,再確認一下是不是真的是素數,然后對PE×Q那個大N做一下除法。我的同事后來發現,在新的版本里面已經把這個去掉了,Block是不是質數這個判斷已經去掉了,因為前面靠熵值這個辦法已經能夠比較快的判定一個大數是不是質數了。如果能正除,那就找到了這個質數。剛才提到了,放到外面的公鑰是E和N,私鑰是D跟N,E是P×Q,都找到了,整個加密的東西就已經全部解開了。這是截屏的過程,非常精彩,大概試了3次,就找到了這個P。找到之后,后面的整個流程就非常的規范了。

在整個Adrien公開的代碼過程當中,有兩點是值得注意的,如果不認真的讀代碼,對于加解密這一塊沒有比較深厚的積累,可能也不太容易發現問題。在公開的代碼里面,第一版把OpenSSL里面,有一套加密的算法庫,大家可能都知道,剛才公開的代碼第一版的時候,找到了那個素數,后面使用的過程當中,是按照OpenSSL規范使用的,而不是按照Windows Crypt使用的,就導致后面質數的使用過程當中不對,病毒清除的時候質數沒法用。這是怎么回事?可能作者一邊調試一邊做,他發現找到這個質數了,可能就沒有做進一步的事情了,代碼就提交了,這是一個值得注意的點。

代碼里面大量的使用Auto類型,這個其實也是新版本,或者C++這種新的規范,是比較推薦的。就會導致你的版本如果和他的版本不Match的話,就有可能導致不匹配。他定義的Auto的變量其實都是一個大整數。如果你的邊系和作者的邊系不匹配的時候,就會導致大整數被截斷,后面所有的就被匹配掉了。這樣小的瑕疵是無傷大雅的,并不能夠掩蓋作者的貢獻和超凡的能力,還是要向作者表示敬意。

因為有了作者的貢獻,所以我們的小伙伴在很短的時間之內找到了一個實現的方法,這個也是我們這個團隊在那一天的時候,應該是5月19日那一天,在全網是首發了XP版的破解工具。那個時候還發生了一件非常精彩的事情,我們發了這一條微博之后,別的廠商也快速跟進,導致微博的操作都出現了一點遲鈍,那天是非常精彩的一個場景。這是關于破解這一塊。

如何減少安全的漏洞。這里有三點:

一是優化關鍵漏洞檢查機制,剛才給大家看了,那個單位里面像篩子一樣的整個漏洞情況。這里面有一個很大的問題,就是這種安全檢查都是單向的,沒有交叉檢驗,只是一個口徑,比如某個軟件上報,這是不好的。我們建議后面比如可以搞這種檢測和模擬攻擊結合,檢測發現打或者是沒打補丁,這個沖擊力是非常有限的,但是如果用模擬攻擊這種打進去了,或者說探測出來了,這個沖擊力是非常強的。所以我們建議,后面能夠有一些更優化的檢測和攻擊手段的結合。減小攻擊面,其實大家也能看到,凡是中招的用戶里面,一定是打開了445這個端口,而且在大多數情況下,其實445是不用的,大多數情況下是這樣,當然某些局域網的情況下某些文件分享可能會用到,整體而言使用率是不高的,應該把不用的端口關閉掉,特別是高危的端口,減少攻擊面。

二是作為開發者,就是老老實實的啃代碼,認認真真的看文檔。隨著作者把代碼公開出來了,如果不能一行行的閱讀,理解里面的邏輯就不能發現問題,就是所謂的黑盒測試一樣去驗證,達不到一個很好的效果。包括在座的各位也是,很多年輕人,現在這種技術開發的成本實際上是非常低的,可能你用到的幾乎所有的算法或者核心功能的代碼在網絡上都能找到。但是找到之后是不是一行行的去閱讀?這個其實是一個很大的問題。通過認真嚴謹的閱讀,會發現很多變量、實現細節這些邏輯。認認真真的看文檔也是,剛才我截的那個截圖,其實里面的很多信息是MSDN里面已經標清楚的,已經標明的。但是很多人閱讀的時候,可能沒有這么認真,或者是注意到這些細節,這可能也是技術從業人員應該具備的一個基本素質,就是讀代碼、寫代碼的能力和嚴謹的、海量文檔的閱讀能力。

三是一些方法論的東西,就是永不放棄。只要有一分希望,那就是百倍努力,你長期關注它,長期去研究它。當有一些別人或者同行有一點點進展的時候,你能第一時間感知到,你能第一時間把他們的成果和你的積累結合起來,這樣也會讓我們的工作能夠取得更大的成效。

上一篇:ADLAB朱錢杭(大菠蘿):其實它們近在咫尺

下一篇:騰訊徐少培:瀏覽器地址欄之困