ASP.NET 老人們應該知道 web.config 有個 <compilation debug="true/false" /> 設定,啟用後網站會跑得比較慢,但能提供較多偵錯資訊,有利於開發測試。

ASP.NET 啟用偵錯模式(Debug Mode)後會出現以下行為差異

  1. 程式碼因啟用偵錯路徑執行變慢
  2. 編譯因產生偵錯資訊(如 .pdb)耗費較多時間,而在執行期間也會佔用較多記憶體 參考
  3. 執行逾時會延長至 30,000,000 秒 (噗,347 天,不知有沒有人等到過)
  4. 透過 WebResource.axd 及 ScriptResource.axd 回傳的 Script 及圖檔不會被快取,每次都要重新下載
  5. 編譯最佳化將被停用

基於以上差異,一般建議在正式環境不要啟動偵錯模式,但主要都著眼怕拖累效能,例如:MS Learn 的 ASP.NET 部署注意事項也包含停用 ASP.NET 應用程式的偵錯,理是:在偵錯模式中編譯的應用程式可執行無誤,但應用程式的效能會受到影響。為了避免對效能造成影響,最好只在開發人員射茶包除錯階段才啟用偵錯。

今天學到新知識 - 從資安角度,網站啟動偵錯模式可能提高資安風險,而攻擊者可透過一些手法偵測 ASP.NET 網站是否啟用偵錯模式。

偵測方法是送出一個 HTTP 請求,指定特殊 HTTP 方法 DEBUG,並附上 Header Command: stop-debug,若對方為 ASP.NET 站台且傳回 OK,即代表該網站已啟用偵錯模式。不少弱掃軟體都支援這段檢測,例如:NessusNmap

我寫了一小段 PowerShell 模擬偵測動作,由於 Invoke-WebRequest 不支援 DEBUG 這類自訂 HTTP 方法 (要 PowerShell 7+ 才支援 -CustomMethod 參數,我改用 HttpWebRequest 實作:

$ErrorActionPreference = "Stop"
[Net.HttpWebRequest]$req = [Net.HttpWebRequest]::Create("http://localhost/aspnet")
$req.Method = "DEBUG"
$req.Headers.Add("Command", "stop-debug")
$resp = $req.GetResponse()
$sr = New-Object IO.StreamReader($resp.GetResponseStream())
$sr.ReadToEnd()
$sr.Close()
$resp.Close()

分別測試 debug="false" 及 "true",未啟用偵錯模式時會傳回 403,若啟用偵錯則會得到 OK 二字:

另外我也嘗試了 Command: start-debug 得到 HTTP 401,依據查到的資料,這會用於 Visual Studio Attach to Process 偵錯,需要切換成系統管理者身分執行,Debugger 會以 RPC 與 ASP.NET 程序溝通而非 HTTP。

而啟用偵錯模式有什麼危害呢?查到一些說法如下:

  1. HTTP Verbs and Their Security Risks by CYBERWHITE

    • 網站因偵錯模式效能變差,DoS 攻擊時更容易得手。(註:DoS 要成功難度不高,應該沒差這點效能才對,但長達一年的 Timeout 是個好切入點沒錯)
    • 真正的偵測功能 / API 需透過 RPC 呼叫,倒無法透過 HTTP 伸手。
    • 偵錯模式可能導致透露過多系統訊息(例如:Stack Trace、程式碼片段... 等等),被攻擊者蒐集利用。(註:前題是未設定 customError 導致詳細錯誤訊息外洩)
  2. Ensure 'debug' is turned off - Applications by Tenable (弱掃產品廠商)
    著眼點也是在會讓惡意人士取得內部系統資訊。

  3. CVE-2021-35235
    ASP.NET debugging enabled by PortSwigger
    這兩則 CVE 寫得比較聳動,提到「若攻擊者能成功啟用偵錯 Session」將可取得有價值的資訊進行後續攻擊,但沒提出可攻擊途徑。(推敲要以成功破解存取身分認證為前題)

  4. Vulnerabilities / ASP.NET debugging enabled by Probely
    指出可能洩露內部敏感資訊(程式碼片段、環境變數、安全金鑰... 等等),有利於發動後續攻擊。

【結論】

ASP.NET 偵錯模式主要的風險來自於偵錯資訊會造成程式碼片段、系統架構等內部資訊外流,對攻擊者進攻極具參考價值,但前題是未設 customError 隱藏詳細錯誤資訊(相較之下,這個漏洞更要命)。效能變差會增加 DoS 攻擊成功率的說法我不太買單,認為實現 DoS 本身不是難事,偵錯模式不至於是關鍵。

但話說回來,正式環境本來就該關閉偵錯模式以求效能最大化,實在沒什麼理由堅持開啟 debug="true",關閉為上。

Survey of security issues of ASP.NET debug mode.


Comments

Be the first to post a comment

Post a comment