標籤:

為什麼你要懂點信息安全(續一)

前天的文章主要講了信息安全中人的因素,以及圍繞人建立起來的「物理安全」,「操作安全」和「社會工程學安全」,最後順帶講了「網路安全」和「應用安全」。對於最後的關於郵件安全的討論,這裡舉個例子:

這是一個經過PGP加密的郵件,以S/MIME(如果不知道請google,很難一句話解釋)的方式嵌入到一個正常的郵件中。它用接收者的公鑰加密,只有接收者才能使用自己的私鑰解密(一旦發出去之後,理論上連發送者都看不到裡面的內容)。這樣即使NSA攻陷了gmail,偷窺你的郵件,它也只能看到上面的密文,而無法得出下面明文中我的身份證號。

PGP和S/MIME在郵件上的應用早(大概十多年前)就有RFC定義,但一直無法推廣開,幾個原因:

(1) 應用了端對端的加密,那webmail就無法使用了(你無法通過mail.163.com/gmail.com等訪問你的郵件了),很不方便。如果真要用,需要用戶將其私鑰上傳給郵件提供商,這樣就導致一種悖論。

(2) 即使你不用webmail,使用郵件客戶端,你也不一定能用。首先你和你的小夥伴需要有各自的公鑰私鑰,其次你們需要知道各自的公鑰,再次你們需要確認各自的公鑰是各自的公鑰。

(3) 即使滿足了(2),如果你換台電腦,如果該電腦里沒有你之前的私鑰,那也看不了別人發過來的郵件。

很麻煩吧?安全的漏洞就產生在各種麻煩中,比如說「操作安全」。

任何軟體都有漏洞。如果一家公司號稱自己的系統在發布時zero bug,那是自欺欺人。軟體工程的常態是 "ship with bugs, as long as they are not easily exploitable"。發布時帶的bug是漏洞(vulnerability),如果不被利用(exploit),就不存在實際的風險。就像windows里臭名昭著的WinNuke攻擊,利用的就是windows里的一個存在了很久的漏洞 —— 但之前好多年,好多個版本的windows一樣活得好好的。

風險管理的要點是:我們無法彌補所有的漏洞,但我們可以讓漏洞無法被利用。所以有漏洞不怕,怕的是漏洞被人發現之後不去彌補。在有漏洞的系統前放台防火牆是一種讓漏洞無法被利用的方法,「操作安全」中的打補丁,是另一種方式。你以為操作系統,各種系統軟體,甚至你開發軟體使用的框架,如django定期發布security patch是逗你玩的么?它們都是被暴露出來的漏洞的應對之策,有些真正解決了漏洞本身,有些只是讓對應的攻擊不奏效(漏洞無法被利用)。如果你的系統沒有對應打補丁,那麼,黑客只要能嗅探出你使用的軟體版本,就能找到對應的方式來玩你。

當然,所謂「匹夫無罪,懷璧其罪」,你如果沒有讓別人覺得有攻擊的價值,那麼你很可能也不會受到攻擊。

對於「社會工程學安全」,很多人不以為然,尤其是我們這群自視甚高的程序員,在知乎里或者微信里噴了我一臉吐沫。你如果真生活在「技術就是一切」的夢想里我也無法阻止,我只是說給願意聽的人。

「物必先腐也,而後蟲生之」,堡壘都是從內部攻破的。社會工程學瞄準的就是這點。為了證明社會工程學離你有多近,程序君寫了個腳本針對程序員做最基本的社會工程學嗅探(沒用之前文章里講得那些常用手段,因為對我而言可操作性差了點)。

我們知道程序員會使用github,很多人會把自己的pet project放在上面。對於web application,基本上都會連接資料庫。所以,如果你用了這些框架:如django,rails,expressjs裡面都會存用戶名,資料庫密碼。理論上作者應該把這些敏感信息屏蔽,但實際呢?我們能否通過代碼找到某個人常用的用戶名和密碼呢?

上圖是我的腳本輸出的信息。本來展示的信息要比圖中的多得多,我可以直接打開有泄漏嫌疑的代碼去進一步嗅探,但內容太多不好一一屏蔽,用gimp(有沒有更好的mac下的免費p圖工具?)改圖太費勁,所以我把很多輸出注釋掉了。

黑色的被我塗掉的內容是作者的密碼,紅色的是我不想讓你看到的可能暴露作者身份的信息。紅色劃線的文字是我可以進一步嗅探這個repo中包含密碼的其它文件。

這個嗅探是針對我的一個朋友。

我還嗅探了一些不認識的人,發現github簡直是找尋一個用戶慣用用戶名和密碼的寶庫。有個哥們的好幾個密碼都是簡單得以某字母開頭,加八位生日,然後有一個資料庫的root的密碼是他的長長的英文名全寫(包括姓)+生日(總共十八位之長),我也有理由相信這樣的密碼他會用在一些比較重要的場合,比如說郵箱密碼 —— 我甚至抑制不住去猜他的gmail,來嘗試這個密碼是否他gmail的密碼(當然我沒功夫試啦)。

整個過程中我沒有用任何高深的黑客知識(在此方向我基本是個小白),但通過探尋人性的弱點,和一點點腳本能力(幾十行代碼而已),我就可以獲取到一些關鍵信息。

如果說看了『為什麼你要懂點信息安全』及本文,你還滿頭霧水不知道該採取什麼樣的安全措施,那麼,程序君總結一下:

(1) 不要使用和自己身份相關的信息作為密碼(設置密碼的一個好方法是記下一個英文常句,然後將其首字母連起來,再用一個固定的規律加鹽,比如說,第三個字母大寫,第七個字母后加一個數字等等。

(2) 如果有敏感信息在網路中傳輸,請確保對方網址的正確性,以及全程是否使用了https。

(3) 對於網銀,能用優盾就用優盾,文件證書在windows下不安全(windows下沒有節操的軟體太多了)

(4) 學些心理學 —— 知道人家怎樣對你施加影響,以及怎麼破

(5) 腦袋裡裝上十萬個為什麼,多質疑查證

今天先寫這麼多,下次再講訪問控制,加密,災備等等。

如果你對本文感興趣,歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每天一篇原汁原味的文章,早8點與您相會。


推薦閱讀:

談談系統設計的面試
架構隨想錄
該讓誰升職?該裁掉誰?
就這樣,在波特蘭跑完了人生第二個馬拉松
談談工作 - 神州數碼篇

TAG:迷思 |