Deny of Service Slowris Apache 拒絕服務 漏洞攻擊 HTTP DoS 資安

防止慢速型DoS拖垮網站 對症下藥阻Slowris攻擊

2017-02-17
近來Slowris頻頻利用HTTP通訊協定的漏洞進行攻擊,讓網站伺服器因為DoS侵擾而整個停擺。其中一個因應之道是善用開源碼的資源,為Apache伺服器加上防禦模組,好讓危害降低到最低。
拒絕服務(Deny of Service,DoS)攻擊經常是網站伺服器所面臨的最大資安威脅之一。一般來說,攻擊者常利用大量的傀儡主機同時向受害者主機發出大量的封包攻擊,來迫使受害者主機無力應付而終止服務。但此類攻擊往往需要大量的主機共同合作才可能攻擊成功,也因此有越來越多的攻擊者也開始利用系統的漏洞,甚至是通訊協定的漏洞進行攻擊,利用此類的攻擊手法,攻擊者不再需要千軍萬馬,在某些情況下甚至只需要一台主機即可能攻擊成功。

因此,本文中將介紹一個利用HTTP通訊協定漏洞名稱為Slowris的攻擊手法,並且以Apache網站伺服器為例進行實作,說明如何利用開源碼的資源,為Apache伺服器加上防禦模組來降低Slowris的危害,本次實作所需的模組如表1所示。

表1 實作所需模組

剖析Slowris攻擊手法

在說明Slowris攻擊手法之前,先行定義要求(Request)和回覆(Response)兩個名詞。

要求(Request)

使用者發出要求(例如利用瀏覽器瀏覽網頁),要求網站伺服器服務,在此階段,使用者端會先行發出要求標頭(Request Header)資訊告知網站伺服器相關特殊的資訊(例如所使用的瀏覽器資訊等等),接著再發送實際的要求內容(Request Body)資料通知網站伺服器。

回覆(Response)

網站伺服器在處理完使用者的要求後,即會將資訊回覆給使用者,同樣地,網站伺服器會先回傳回覆標頭(Response Header)告知使用者相關特殊的資訊(例如網站伺服器的名稱),最後再發送回覆內容(Response Body)給使用者。

如圖1所示,即為使用者發出要求標頭通知網站伺服器。此時可以思考一個問題,要求標頭的資訊通常會有好幾行,網站伺服器如何判別個別行的結尾?接著衍生另外一個問題,使用者須傳送要求標頭及要求內容至網站伺服器上,網站伺服器又該如何判別要求標頭資訊的結尾?


圖1 使用者發出要求標頭通知網站伺服器。

其實,在HTTP的通訊協定上已經定義了以換行符號(\r\n)來當作行資訊的結尾,另外並定義以\r\n\r\n(連續兩個換行符號)做為要求標頭的結束,而Slowris攻擊就是利用其中的漏洞。

惡意攻擊者利用傳送要求標頭至網站伺服器時,故意不傳送或緩慢地傳送兩個換行符號(\r\n\r\n)至網站伺服器上。而造成網站伺服器被迫要長時間保持此連線,也因此造成連線數(以Apache為例,其連線數預設為256個)滿載,因而無法服務其他正常的連線。

認識mod_reqtimeout

mod_reqtimeout是Apache伺服器預設的模組之一,主要的功能在於限定要求(Request)封包傳遞的速率,避免要求連線因傳遞速率過慢而長時間占住網站伺服器的連線。可利用下列指令檢查網站伺服器是否有mod_reqtimeout模組:


如果有回覆reqtimeout_module等字樣,就表示有支援該模組。

由於Slowris應用的技巧在於利用傳送要求標頭(Request Header)時間過久,藉此來占住網站伺服器的連線數,以致於網站伺服器無法服務正常的連線,以達到拒絕服務(DoS)的效果,因此mod_reqtimeout模組即是利用限定傳送要求標頭及要求內容時間的方式,來降低Slowris攻擊的危害。

mod_reqtimeout模組設定相當簡單,僅需設定要求標頭及要求內容(Request Body)的傳輸速率即可,mod_reqtimeout模組提供的組態如下所述:


設定要求標頭必須在時限內完成傳輸,但若有設定MinRate資訊,代表如果要求標頭的傳輸速率高於此設定數值,即可不受限於所設定的時限。



追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!