ReDoS? 可不是再次的阻斷服務攻擊 (Re-DoS),而是正規表示式阻斷服務攻擊 (Regular Expression DoS),是阻斷服務攻擊的一種手法。對於一般的程式開發,雖然不見得常使用到正規表示式的應用,但是正規表示式卻常見於各式各樣的過濾器上。所以像是網站應用程式的輸入檢查、快取伺服器或其他類型閘道器的存取過濾功能,通常都有正規表示式的存在。
正規表示式最基本的應用就是用來尋找資料中是否含有特定樣式的內容,例如我們可以透過正規表示式來判斷一個文字檔內是否含有手機號碼,而判斷條件就是以0為開頭的連續10個數字 (這個條件可能不適合用來找出所有可能的手機號碼,但是無損於說明性)。也因此正規表示式的應用至少含有兩個部分,一個就是用來當做搜尋的樣式 (Pattern,通常這部份也稱為正規表示式),以前述的例子而言就是”以0為開頭的連續10個數字”。另外一部分則是用來被搜尋的輸入目標,以前述的例子而言就是文字檔的內容。而正規表示式阻斷服務攻擊發生在利用某些樣式進行搜尋時將有可能會產生大量消耗運算資源的情況,因而使得系統無法處理其他的請求。這也是它為什麼被稱為阻斷服務攻擊的原因了。
至於”某些樣式”是哪些樣式,在 OWASP 上面的說明文件舉了一些例子,包含
- (a+)+
- ([a-zA-Z]+)*
- (a|aa)+
- (a|a?)+
- (.*a){x} | for x > 10
而前些日子 Microsoft 則推出了一個 Regex Fuzzer 的工具,宣稱可以用來驗證所輸入的正規表示式是否存在遭受正規表示式阻斷服務攻擊的隱憂。不過根據我測試的結果,這個工具的執行結果跟 OWASP 上面的例子並沒有完全一致。以目前的情況而言,想要避免正規表示式阻斷服務攻擊最保險的作法似乎就是限制被搜尋目標的內容長度。如果內容長度過長甚至無法加以限制時,自行利用 Fuzzing 的概念 (或利用 Regex Fuzzer,如果你相信它的話) 加以測試將會是比較安全的作法。
相關連結:
沒有留言:
張貼留言