隨著記憶體保護機制成熟,攻擊者轉向 DoS 勒索。正則表達式 DoS (ReDoS) 成為新威脅:編寫不當的 Regex 可能因惡意輸入導致指數級回溯,癱瘓服務。本文解析成因並提供模糊測試工具程式碼。
安全範例:^\d+$ 匹配 123456X,僅回溯 6 次(線性)。
危險範例:^(\d+)$ 加上捕獲群組,同樣輸入導致回溯路徑爆炸,處理時間隨字元數呈指數增長。
(a+)+、(a*)*(a|a?)+(?:...)。Regex.Match(input, pattern, RegexOptions.None, TimeSpan.FromSeconds(1))。public static void FuzzRegex(string pattern, int iterations = 10000)
{
var regex = new Regex(pattern);
var random = new Random();
for (int i = 0; i < iterations; i++)
{
var input = GenerateRandomString(random, 100);
var sw = Stopwatch.StartNew();
regex.IsMatch(input);
sw.Stop();
if (sw.ElapsedMilliseconds > 100)
Console.WriteLine($"Slow: {sw.ElapsedMs}ms | Input: {input}");
}
}
ReDoS 雖不竊取資料,卻能癱瘓服務。開發者應將 Regex 視為潛在攻擊面,納入安全開發週期 (SDL) 進行靜態掃描與執行期超時防護。