1. 程式人生 > >從公司伺服器C盤被刪說起

從公司伺服器C盤被刪說起

事情起因

一個陽(嚴)光(重)明(霧)媚(霾)的週二,對於我們從週二到週六的班次來說,這是新的一週開始。我像往常一樣,開啟電腦,倒上一杯水,開始翻閱從大洋彼岸發來的各種郵件。突然看到一封緊急的郵件,內容大致是線上的所有API伺服器全部宕機了,原因IT正在查,所有的API都被緊急遷移到了一臺新的伺服器上,讓我們協助修改各種配置。剛坐下沒多久,美國那邊就打電話過來了,告訴我們,WEB程式伺服器上的C盤被刪除了很多檔案,然後又強調了郵件中的內容,讓我們協助。

在協助線上處理完了各種配置的修改後,我們在週會上討論了各種可能性,大家一致認為黑客入侵了我們的伺服器,認為一般的WEB程式不會有這麼大的許可權,能把C盤給搞掛了。這也是因為我們在大約一個月前,剛被黑客入侵過一次(

http://www.sohu.com/a/255005663_354899),大家都覺得是黑客在其他機器中留了種子,後續在黑五期間又專門搞我們一下~~

幕後真凶

然而事情並沒有那麼簡單,過了一天後,IT通過Windows上的LOG,找到了真凶,就是下面的一段C#程式碼:

image

看起來也很樸素是不?path是某個業務相關的資料夾路徑,在某些操作完成後,刪除業務資料夾,除了刪除前沒有判斷資料夾存在性外,是不是看起來也並沒有什麼問題?

然而並不是~

該程式碼中,沒有對非法的輸入進行Check,當path為空字串時,該程式碼會自動給字串後面加上 “\\”,導致最終執行刪除的程式碼為:Directory.Delete(”\\”,true);

在.NET 4.0中,該程式碼將刪除當前驅動器中的所有檔案 (原來如此)

那麼這麼危險的操作為啥一個WEB程式竟然有許可權執行呢?

再來看看我們的IIS中的設定:image

在這個應用程式池的配置中,我們所有的應用程式池都是用LocalSystem這個身份在跑的,這個身份一般來說許可權是比較高的,所以也是導致我們本次事故的一個重要因素。

小結

程式碼的非法性檢查一定要做到位,一個健壯的程式應該不僅能在資料正常時正常執行,在資料異常時,也應該能夠正確執行,並對外丟擲錯誤。

程式在執行的過程中,一定要以最小許可權執行,很多文章都提到過這點,但很多人在實際操作時,為了方便,就直接給比較高的許可權了,這點我自己也喜歡這樣幹,需要以後多注意一些。

本次有問題的程式碼其實並不是我們組的,但是不同業務組的專案都部署在同一臺機器上,最終別的組的大失誤導致了我們的API宕機,可以利用Docker等容器技術來規避這些問題,Docker在這種程式的隔離性上會體現出明顯的優勢。