處理安全漏洞時,把它們歸入幾個明確的類別很有幫助,因為這能讓你評估「這個漏洞被利用後,風險有多大」。以下五類是你最常遇到的分類;它們不是窮盡清單,但足以涵蓋日常分析所需。
遠端程式碼執行(Remote Code Execution)#
遠端程式碼執行(remote code execution, RCE)是個統稱,泛指任何允許攻擊者在協定實作程式的執行環境中執行任意程式碼的漏洞。它可能透過劫持應用程式的執行邏輯達成,也可能是影響應用程式正常運作時所建立的子行程命令列。
RCE 通常是最關鍵的一類漏洞,因為它讓攻擊者能夠攻陷應用程式所在的整台系統。攻擊者將取得該應用程式能存取的一切,甚至可能連帶攻陷所在的網路。
阻斷服務(Denial-of-Service)#
應用程式的存在目的通常是提供服務。若有漏洞被利用後會讓應用程式崩潰或失去回應,攻擊者就能藉此拒絕合法使用者存取該服務。這類阻斷服務(denial-of-service, DoS)漏洞往往只需極少資源,有時甚至只要一個網路封包就能癱瘓整個應用程式。
阻斷服務漏洞可再分為兩種:
- 持續性(persistent):利用漏洞會破壞某些已儲存的狀態,導致應用程式重啟後依然崩潰。除非管理員介入修正,否則合法使用者永遠無法存取服務。
- 非持續性(nonpersistent):效果只持續到攻擊者停止送出攻擊資料為止。應用程式自行重啟或給予足夠時間後,服務通常就會恢復。
資訊洩漏(Information Disclosure)#
許多應用程式是黑盒子,正常運作時只會透過網路給你特定的資訊。若有辦法讓應用程式吐出它原本不打算提供的資訊——例如記憶體內容、檔案系統路徑或身分驗證憑證——就存在資訊洩漏(information disclosure)漏洞。
這類資訊往往對攻擊者直接有用,因為它能協助後續的利用。舉例來說,洩漏的資訊可能揭露記憶體中重要結構的位置,而這正是達成遠端程式碼執行所需要的線索。
身分驗證繞過(Authentication Bypass)#
許多應用程式要求使用者提供驗證憑證才能完整存取。有效憑證可以是使用者名稱加密碼,也可以是更複雜的驗證方式,例如具密碼學安全性的交換流程。身分驗證除了限制資源存取,也能在攻擊者尚未通過驗證時縮小應用程式的攻擊面。
若應用程式存在某種途徑,讓人不必提供完整憑證就能通過驗證,就是身分驗證繞過(authentication bypass)漏洞。成因可能非常單純,例如應用程式比對的是密碼的簡單檢查碼(checksum),而該檢查碼很容易被暴力破解;也可能來自更複雜的問題,例如 SQL 注入。
授權繞過(Authorization Bypass)#
使用者並非生而平等。應用程式可能透過同一個介面支援唯讀、低權限、管理員等不同類型的使用者。若應用程式提供檔案之類的資源存取,就需要依驗證結果限制存取範圍——這需要內建一套授權流程,決定使用者被指派了哪些權限與資源。
當攻擊者能取得額外權限、或存取到他無權存取的資源時,就發生授權繞過(authorization bypass)。例如攻擊者可能直接改變已驗證的使用者身分或使用者權限,也可能是協定沒有正確檢查使用者權限。
別把授權繞過與身分驗證繞過搞混。兩者最大的差別在於:身分驗證繞過讓你在系統眼中成為某個「特定使用者」;授權繞過則讓攻擊者在錯誤的驗證狀態下存取資源——那個狀態甚至可能根本是未驗證。
定義完這些漏洞分類之後,接下來的各節會逐一深入它們的成因,以及你會在哪些協定結構中找到它們。