天天看點

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

網易視訊雲是網易傾力打造的一款雲服務産品,提供穩定流暢、低延遲時間、高并發的視訊直播、錄制、存儲、轉碼及點播等音視訊的PAAS服務,線上教育、遠端醫療、娛樂秀場、線上金融等各行業及企業使用者隻需經過簡單的開發即可打造線上音視訊平台。現在網易視訊雲的技術專家給大家分享一則技術文章:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複。

背景

HTTP 的 Slow Attack 有着悠久曆史的 HTTP DOS 攻擊方式,最早大約追溯到 5 年前,按理說早該修複了,但是 Apache 的預設配置中仍然沒有添加相關配置,或者他們認為這是 feture 不是 bug,是以至今預設安裝的 Apache 中還存在着 Slow Attack 的威脅。

Slow Attack 大緻可分為以下幾種:

  • Slow Header (slowloris):每個 HTTP 請求都是以空行結尾,即以兩個 (\r\n)結 尾 。 若将空行去掉 ,即以 一個 (\r\n) 結尾,則伺服器會一直等待直到逾時。在等待過程中占用線程(連接配接數),伺服器線程數量達到極限,則無法處理新的合法的 HTTP請求,達到DOS目的。
  • Slow Read:向 Web 伺服器發送正常合法的 read 請求,請求一個很大的檔案,并将 TCP 滑動視窗 size 設定很小如 1 或 2,伺服器就會以非常緩慢的速度發送檔案,檔案将長期滞留在伺服器記憶體中,消耗資源,造成DOS。
  • Slow Post:攻擊者向伺服器發送 POST 請求,告訴伺服器它将要 POST 的資料為 n,伺服器将配置設定長度為 n 的空間來等待接收資料。當 n 足夠大, POST 的請求足夠多的時候,這種攻擊會占用伺服器的大量記憶體,進而降低伺服器性能,甚至導緻癱瘓。
  • 以及多年前的 Apache Range Attack(現已修複):在 HTTP 請求的 RANGE HEADER 中包含大量字段,使得伺服器在服務端将一個很小的檔案分割成大量的更小的片段再壓縮。分段壓縮過程消耗大量的伺服器資源,導緻 DOS。

漏洞證明

測試環境

Debian7 x86_64 & Apache 2.2.22

Debian8 x86_64 & Apache 2.4.10

配置和測試工具

(1) 在 Debian 中通過 apt 安裝預設的 Apache

apt-get -y install apache2
           

(2) 在預設的 DocumentRoot 目錄裡面放一個測試檔案,serverlist.txt

(3) 更換監聽端口為 8889(程式 GG 們是不是有似曾相識的感覺)

(4) 用 slowhttptest 工具對 debian7 測試上面四種攻擊方法,工具 wiki

結果如下:

slow header

給 Apache 發送的請求如下(Header 少了一個換行,表示 Header 一直沒發完):

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複
網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

Apache 中充斥着這樣的連接配接,導緻 DOS

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

slow read

給 Apache 發送的是合法的請求(但是視窗很小)

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複
網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

最終導緻占滿了連接配接,依然 DOS

slow post

給 Apache 發送的請求如下(以很慢的速度來發送 message body)

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

同樣也導緻 DOS

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

Apache Range Attack

已失效的攻擊方法,可以看一下它給 Apache 發送的請求是什麼樣的

網易視訊雲:HTTP Slow Attack 科普和 Apache DOS 漏洞的修複

要求伺服器将檔案分成很多很多的小段,用來消耗伺服器資源,理論上 CPU 和 Memory 會增加

漏洞修複方法

(1) 根據作者的文章:[How to Protect Against Slow HTTP Attacks]

對于 Apache 可以做以下優化:

  1. 設定合适的 timeout 時間(Apache 已預設啟用了 reqtimeout 子產品),規定了 Header 發送的時間以及頻率和 Body 發送的時間以及頻率
  2. 增大 MaxClients(MaxRequestWorkers):增加最大的連接配接數。根據官方文檔,兩個參數是一回事,版本不同,

    MaxRequestWorkers was called MaxClients before version 2.3.13. The old name is still supported.

  3. 預設安裝的 Apache 存在 Slow Attack 的威脅,原因就是雖然設定的 timeoute,但是最大連接配接數不夠,如果攻擊的請求頻率足夠大,仍然會占滿 Apache 的所有連接配接

(2) 根據這篇文章:[How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server]

可以使用 Apache 的子產品來緩解 Http Slow Attack

  • mod_reqtimeout:預設已啟用。設定 header 和 body 的發送時間及頻率
    <IfModule reqtimeout_module>
    RequestReadTimeout header=-,minrate=
    RequestReadTimeout body=,minrate=
    </IfModule>
               
  • mod_qos:開源子產品,需額外安裝。可設定多個參數來控制用戶端的連接配接,如最大 IP 數、每個 IP 最大連接配接數等
    <IfModule mod_qos.c>
     # handle connections from up to 100000 different IPs
     QS_ClientEntries 
     # allow only 50 connections per IP
     QS_SrvMaxConnPerIP 
     # limit maximum number of active TCP connections limited to 256
     MaxClients 
     # disables keep-alive when 180 (70%) TCP connections are occupied
     QS_SrvMaxConnClose 
     # minimum request/response speed (deny slow clients blocking the server, keeping connections open without requesting anything
     QS_SrvMinDataRate  
    </IfModule>
               
  • mod_security:開源子產品,需額外安裝。性能較好,可以為 Web 應用提供一個外部安全層來檢測和抵禦攻擊
SecRule RESPONSE_STATUS "@streq 408" "phase:5,t:none,nolog,pass,
setvar:ip.slow_dos_counter=+1, expirevar:ip.slow_dos_counter=60, id:'1234123456'"

SecRule IP:SLOW_DOS_COUNTER "@gt 5" "phase:1,t:none,log,drop,
msg:'Client Connection Dropped due to high number of slow DoS alerts', id:'1234123457'"
           

根據上面的配置, mod_security 記錄每個 IP 讓 Apache 傳回 408(request timeout) 的次數,當一分鐘内超過 5 次時,那個 IP 的請求會在 5 分鐘内全部被丢棄。 當然也可以根據實際情況配置其他的安全政策。

(3) serverlist 使用場景下最簡單的修複方法

剛剛的使用場景僅僅是從 Apache 擷取 serverlist,每個 IP 隻需要一個短連結就可以滿足需求,是以直接在 iptables 中限制每個 IP 的連接配接數可以解決以上絕大部分問題,除非攻擊者擁有衆多殭屍電腦,否則單 IP 的攻擊将失去效果。

iptables -A INPUT -p tcp --syn --dport  -m connlimit --connlimit-above  -j REJECT --reject-with tcp-reset
           

用 iptables 設定了每個 IP 的最大連接配接數後,測試結果顯示 Attacker 隻能建立 20 個連接配接,所有攻擊方法失效。

繼續閱讀