一個陽(嚴)光(重)明(霧)媚(霾)的週二,對於咱們從週二到週六的班次來講,這是新的一週開始。我像往常同樣,打開電腦,倒上一杯水,開始翻閱從大洋彼岸發來的各類郵件。忽然看到一封緊急的郵件,內容大體是線上的全部API服務器所有宕機了,緣由IT正在查,全部的API都被緊急遷移到了一臺新的服務器上,讓咱們協助修改各類配置。剛坐下沒多久,美國那邊就打電話過來了,告訴咱們,WEB程序服務器上的C盤被刪除了不少文件,而後又強調了郵件中的內容,讓咱們協助。服務器
在協助線上處理完了各類配置的修改後,咱們在週會上討論了各類可能性,你們一致認爲黑客入侵了咱們的服務器,認爲通常的WEB程序不會有這麼大的權限,能把C盤給搞掛了。這也是由於咱們在大約一個月前,剛被黑客入侵過一次(http://www.sohu.com/a/255005663_354899),你們都以爲是黑客在其餘機器中留了種子,後續在黑五期間又專門搞咱們一下~~blog
然而事情並無那麼簡單,過了一天後,IT經過Windows上的LOG,找到了真兇,就是下面的一段C#代碼:字符串
看起來也很樸素是不?path是某個業務相關的文件夾路徑,在某些操做完成後,刪除業務文件夾,除了刪除前沒有判斷文件夾存在性外,是否是看起來也並無什麼問題?部署
然而並非~get
該代碼中,沒有對非法的輸入進行Check,當path爲空字符串時,該代碼會自動給字符串後面加上 「\\」,致使最終執行刪除的代碼爲:Directory.Delete(」\\」,true);it
在.NET 4.0中,該代碼將刪除當前驅動器中的全部文件 (原來如此)容器
那麼這麼危險的操做爲啥一個WEB程序居然有權限執行呢?配置
在這個應用程序池的配置中,咱們全部的應用程序池都是用LocalSystem這個身份在跑的,這個身份通常來講權限是比較高的,因此也是致使咱們本次事故的一個重要因素。程序
代碼的非法性檢查必定要作到位,一個健壯的程序應該不只能在數據正常時正常運行,在數據異常時,也應該可以正確運行,並對外拋出錯誤。
程序在運行的過程當中,必定要以最小權限運行,不少文章都提到過這點,但不少人在實際操做時,爲了方便,就直接給比較高的權限了,這點我本身也喜歡這樣幹,須要之後多注意一些。
本次有問題的代碼其實並非咱們組的,可是不一樣業務組的項目都部署在同一臺機器上,最終別的組的大失誤致使了咱們的API宕機,能夠利用Docker等容器技術來規避這些問題,Docker在這種程序的隔離性上會體現出明顯的優點。