DOS攻擊可能的原因和分析與預防
關于安全的三個最核心的元素CIA,也就是:
Confidentiality(保密性):信息只能被授權的人查閱。
Integrity(完整性):信息沒有被意外地修改。
Availability(有效性):信息或者資源在需要的時候,總是可以使用的。
不同的產品對有效性的要求是不一樣的,有的要求三個9,有的要求4個9。一個產品的可用性對客戶的影響非常大,如果服務經常不可以使用,客戶將可能選擇其它產品。可用性對一個系統來說是十分關鍵的,如果一個系統經常不可用,就像12306那樣,你會覺得很郁悶,客戶也會覺得很郁悶。本片文章著重分析和總結了幾種導致DOS的原因,作為參考。
DOS產生的主要原因有以下幾種:
1)系統存在耗資源的操作,包括內存和CPU以及帶寬
當一個操作需要消耗大量的CPU或者內存的時候,首先需要想的是:是否有其他不需要耗費這么多資源的方法可以實現?如果有則是最好的啦。如果沒有,需要注意這個操作是那些角色可以操作?是內部接口還是外部接口?誰可以觸發這個操作?如何避免被一般用戶出發這個操作?
舉個例子:一個搜索的頁面,對于用戶來說,可以設置每個頁面顯示多少條記錄。某些別有用心的用戶可能會嘗試修改一個頁面顯示的最大記錄數為一個很大的值,例如:10000。如果在服務器端沒有控制好,通過了驗證,而且系統確實有大量的數據,這樣的查詢是非常耗資源的。也許你會認為10000條記錄沒什么,那么,如果修改為1000,000呢?
2)使用共享資源的操作,容易導致死鎖
現在的系統都是并發量很大的系統,而一個系統又難免會有一些資源是共享的,如果系統存在一個線程需要使用兩個共享的資源,在其他線程也需要使用這些資源,就有可能導致死鎖,進而使得系統停止工作。而且,這樣的問題還非常難以調查具體的原因,貌似程序運行的很好,其實,很多功能都已經停止工作。監控程序也可能漏掉這樣的監控。所以,其危害比較大。
因此,在使用共享資源時,應該盡量減少保持的時間,用完快速釋放。必須要同時使用多個資源時,必須保證以同樣的順序使用,最好是能夠封裝在一個API之內,統一處理。另外,一些系統的API也有可能會導致阻塞,在調用可能導致阻塞的API之前,必須保證不上鎖任何資源。例如:訪問數據庫有可能會因為數據庫服務器的原因導致阻塞,這時,就可以采用先訪問數據庫,得到數據之后,再使用共享資源進行下一步操作。當然,最好的方法還是通過設計盡量避免在同一個線程里同時訪問多個共享資源。
3)緩沖區溢出
緩沖區溢出是一個眾所周知的導致程序不可用的原因。其危害性,不用說,可能大多說的C/C++c程序員也都知道,也都對峙耿耿于懷。其避免方法也很簡單,通過有效的inputvalidation避免其發生,這一點很難做到。不過,還有另外一個比較好的方法就是:使用安全的庫是最好的方法,例如:STL,Safe C。
4)內存泄漏
使用C/C++語言編程時,需要使用malloc/free和new/delete分配和釋放內存。很容易犯的錯誤就是:
分配和釋放不匹配:例如使用new分配,使用free釋放,
這樣會導致內存泄漏。
重復釋放 :例如new 分配一塊內存之后,delete兩次,這樣會導致程序crash。
不正確地釋放: 使用new[]分配內存,使用delete釋放,
這樣會導致內存泄漏。
對于一些客戶端程序來說,一點內存泄漏可能結果不是很嚴重。但是,對于后臺程序來說,一點點的內存泄漏,都可能導致嚴重的Crash。因為,后臺程序是常年累月地在運行,泄漏的內存會越來越多(這個根據泄漏內存的操作的頻度有關),進而導致程序的內存不足。所以,嚴格按照語言設計的理念,正確地使用接口很重要。
5)不正確的緩存機制
a)不常用的對象就不要緩存
如果對象不經常使用而被緩存,則意味著經常使用的對象可能會因為內存的原因被從緩存中清除,這樣當再次被使用時,有需要再次導入到內存。這樣會消耗很多CPU資源和內存資源。使得整個系統的效率變得很低。所以,在決定需要緩存那些對象時,最好先調查對象使用頻率。根據緩存的大小和使用頻率決定緩存那些對象。
b)不需要記錄的日志,就不要記錄
首先,關于保存日志的文件,最好單獨保存在一個單獨的分區,使得系統不會因為日志太多占滿磁盤而影響程序的正常工作。
其次,記錄日志要選擇性記錄,對于沒有用的日志,盡量不要記錄,否則,可能因為無用的日志太多,導致有用的日志被覆蓋,影響程序bug的分析和審計。
可見,日志雖然不像具體的業務邏輯模塊那么重要,但是,正確地實現日志功能,可以對bug分析和審計提供很大的輔助作用。
6)服務使用的工具或者系統的配置不當
Web服務器的配置對于系統的穩定也至關重要,如果配置不當,也很容易導致系統被DOS攻擊,例如:TOMCAT如果配置成開發模式,很容易導致內存耗盡;Oracle 如果連續插入兩個同樣的主鍵的值可能導致死鎖等。另外,像建立連接的Timeout時間設置不當,也可能導致連接被使用完而不能提供服務。
關于Web服務器和數據庫等第三方軟件的配置最重要的莫過于默認的用戶名和密碼,這些用戶名和密碼是公開的,一些攻擊者也會首先嘗試這些用戶名和密碼。如果服務器上沒有修改,攻擊者可以通過這些用戶名和密碼控制系統。當然,控制系統之后,DOS攻擊也就非常簡單。
所以,關于使用第三方工具時,關于配置方面的每一個配置項,都要搞清楚,以免有漏網之魚損害系統。
7)沒有備份,一旦主系統掛掉,沒有備份的系統無縫接替
如果系統沒有很好的備份機制,一旦系統出問題就會是一個很麻煩的事情。當然,是否需要備份需要根據系統提供服務來定。至于是備份整個系統還是備份整個系統的數據,這個需要根據系統和備份的成本和收益率來權衡。只要做一個在線服務的系統,備份是必須考慮的。
8)存在注入問題,如SQL注入,命令行注入等,一旦被利用,很容易使得攻擊者控制系統,當然DOS就更不在話下
一個最典型的SQL注入字符串如下:
aaaa’ or ‘1’=’1’--
這樣的注入相對來說還是比較友善一些的。
如果一個非常惡意的攻擊者,注入的代碼如下:
aaaa’ or ‘1’=’1’;drop tableuser;--
結果會怎么樣?
關于SQL Server數據庫,由于可以執行一些系統的命令,如果注入系統的命令,可以使攻擊者控制系統,啟動一些服務等操作,危害也非常嚴重。
對于一些輸入作為腳本語言或者解釋語言的一部分時,一定要謹記,要做好輸入驗證和特殊字符轉義。
9)數據庫連接配置不當
一個數據庫請求要有合適的超時配置,否則,可能導致阻塞。
在一般的產品線上,數據庫是非常關鍵的組件,一切應用皆需要數據。如果數據庫配置不當,超時沒有設置為合適的值,在網絡不是很好或者數據庫系統有些小問題的時候,很有可能導致,數據庫操作阻塞。如果阻塞的時間比較長,就可能導致很多請求被堆積在服務端。不但,占用大量內存,還使得請求不能及時得到響應,而導致DOS。
10)訪問控制做的不好,也可以讓攻擊者提升權限控制系統,進而發動DOS攻擊
訪問控制做的不好的最嚴重的例子,就是管理員訪問的一些操作控制不當??赡苡行┤苏J為將管理員的入口,從頁面上隱藏或者刪除,就可以有效地控制,防止一般人員可以訪問這些操作。但是,總是有些好事者,喜歡琢磨一些事情,他們會很有耐心地琢磨出管理員可能的訪問的接口。通過組裝這些接口,嘗試直接訪問并且查看效果。如果你只是隱藏或者不顯示,這很容易導致問題的出現。一旦攻擊者可以進行管理員的操作,后果可想而知。所以,訪問控制不能依靠隱藏,而是靠具有嚴格的、合適粒度的訪問控制,保證每一個訪問接口都被正確地控制。
11)實現邏輯導致的DOS攻擊
舉個最典型的例子就是:登錄幾次失敗之后,鎖住用戶(目前國內仍然有不少網站使用這個策略)。這很有可能導致的后果就是,使用自動發送請求的工具,針對一個網站很多用戶發送登錄請求,就會導致很多用戶被鎖住。當真正的用戶登錄的時候,反而,因為用戶被鎖住而不能登錄。當然,使用Captcha是一個很好的解決方案。
12)協議級別的攻擊
針對協議的攻擊有很多,例如,TCP SYN flood攻擊,針對ICMP協議的攻擊, 這些攻擊都有一些特征,可以通過防火墻定制規則過濾這些包。也有一些是通過防火墻不能處理的,例如:SSL Beast攻擊,是利用低版本的SSL和TLS的實現上的缺陷發動的攻擊,這就需要升級使用最新版的協議;還有就是是利用SSL/TLS協議的再協商漏洞,可以使用單機就可以發送DOS攻擊,這樣的攻擊就需要修改服務器配置,禁止使用再協商機制才可以避免。
總之,導致DOS的原因有很多,必須在編程過程中時刻牢記一些容易導致DOS攻擊的原因,在設計和編碼的初始階段就注意預防,才是最有效的方法。希望本文能夠對讀者關于DOS攻擊的預防有所幫助。





















