本文將說明 2022 年「Common Weakness Enumeration常見弱點清單」前 25 名最常見且嚴重的軟體弱點。這些弱點因為易於發現與利用,且傷害力高,使得攻擊者能藉此機會完全接管系統、竊取數據或阻止應用程式運行。
2022 CWE 排名前 1-14
資料來源:Common Weakness Enumeration, 2022
2022 CWE 排名前 15-25
資料來源:Common Weakness Enumeration, 2022
2021年與2022年CWE前 25 個弱點變化驅勢圖
資料來源:Common Weakness Enumeration, 2022
相較於2021年的排名,2022年前10名的排名相對穩定,只有小幅度地變化,大部分與2021年相同,有三項新增的風險,也有三項移出排名;並不代表它們不重要,只是相對來說可能因為普遍防禦認知已完善,或是有其他更可怕的弱點。
2022 年與 2021 年排名相比新出現的漏洞弱點項目為:
CWE-362 資源競爭 (Race Condition):從 #33 到 #22
CWE-94 程式碼注入攻擊 (Code Injection):從 #28 到 #25
CWE-400 未受控的資源消耗 (Uncontrolled Resource Consumption):從 #27 到 #23
2022 年與 2021 年排名相比消失的漏洞弱點項目為:
本文將2022年列舉的25個弱點,依其特性分類為四大項目,分別摘述如下:
一、 Injection 注入攻擊相關的弱點:
[2] 跨網站腳本攻擊 (Cross-Site Scripting (XSS))
[3] SQL語法注入攻擊 (SQL Injection)
[4] 不正確的輸入驗證 (Improper Input Validation)
[6] 作業系統命令注入攻擊 (OS Command Injection)
[8] 檔案路徑遍歷 (Path Traversal)
[10] 未限制危險檔案上傳 (Unrestricted Upload of File with Dangerous Type)
[12] 對不受信任的資料進行反序列化 (Deserialization of Untrusted Data)
[17] 命令指令注入攻擊 (Command Injection)
[21] Server請求偽冒 (Server-Side Request Forgery (SSRF))
[25] 程式碼注入攻擊 (Code Injection)
注入攻擊一直都是弱點的核心問題,前25個弱點中就涵蓋了10個項目,高達4成的風險都在這裡,其根本原因是未掌握零信任原則,導致不可信的資料直接被應用程式引用,這些資料可能包含API串接的資料、外部使用者輸入的字串、檔案、甚至是從資料庫取出的原始資料等。以下舉例的情境中可能會引發不同類型的問題且被攻擊者利用。零信任原則的概念很簡單,就是「永不信任,持續檢驗」,面對所有系統以外的資料來源皆抱持懷疑的立場,進行過濾、驗證、消毒等行為,確保在引用應用程式時,資料是符合預期的,並定義好信任邊界(Trust boundary),做好防護的準備。
而提到資料驗證,更要提及白名單(Whitelisting)驗證,設計時要想到合理的內容。最終以零信任原則執行驗證後再信任資料來運行系統。
二、 身分驗證、授權相關的弱點:
[9] 跨網站請求偽冒 (Cross-Site Request Forgery (CSRF))
[14] 不當的身分驗證 (Improper Authentication)
[15] 使用寫死固定的憑證 (Use of Hard-coded Credentials)
[16] 缺少授權檢查 (Missing Authorization)
[18] 重要功能缺少身分驗證 (Missing Authentication for Critical Function)
[20] 不正確的預設權限 (Incorrect Default Permissions)
有關身分驗證、授權相關的弱點,在2022年前25個弱點中包含6個項目,可能導致管理者身分被冒用、執行未經使用者同意的行為或是敏感資料被竊取等,無論是哪一種都將導致嚴重的資訊安全問題。系統的每個環境或頁面中皆具備有權限驗證機制,或是在使用者執行重大功能前,再次與使用者確認,而系統的預設參數更是需要多加注意的環節。
以下提供危險的Sample Code供大家參考,攻擊者可以透過已存在且有效的 Session 偽造請求以下HTML,欲允許用戶更新配置文件。
三、 與記憶體存取相關的弱點:
[1] 記憶體越界寫入 (Out-of-bounds Write)
[5] 記憶體越界讀取 (Out-of-bounds Read)
記憶體越界寫入或讀取是指應用程式將資料引用記憶體緩衝區之外的存取位置,後續的讀取與寫入會產生未定義或意外的結果。這類的弱點通常是使用了不安全的方法所致,例如:memcpy、Strcpy。
[7] 使用已釋放的記憶體 (Use After Free)
[19] 記憶體緩衝區不當的操作 (Improper Restriction of Operations within the Bounds of a Memory Buffer)
在應用程式上使用已釋放的記憶體區塊,相較於已經有儲存數值的記憶體區塊,由於此區塊已經被釋放了數值且有可能被其他的數值所覆蓋,這個錯誤可能會造成無法預估的結果。例如:記憶體毀損、服務阻斷,有時被釋放及使用中的記憶體會被用來當成決定執行流程,而這種錯誤也可能誘發被攻擊的機會,用來執行惡意程式。
四、 不安全的系統設計、不明確的類型定義或不當的系統流程:
[11] 參與/引用空指標 (NULL Pointer Dereference)
[13] 整數溢位或負數 (Integer Overflow or Wraparound)
[22] 資源競爭 (Race Condition)
[23] 未受控的資源消耗 (Uncontrolled Resource Consumption)
[24] XML 外部實體引用不當 (Improper Restriction of XML External Entity Reference,(XXE))
應用程式出現不如預期的狀況並未能妥善處理時,將會拋出 NULL pointer exception。如果攻擊者提供一個格式正確的IP位址,但是該位址未能取得正確的主機名稱,那呼叫 gethostbyaddr() 方法將會回傳 null ,而程式碼並未先行判斷是否為 null ,接續執行 Strcpy 方法將會拋出 NULL pointer exception;無論在執行什麼功能,在引用任何參數前的資料驗證仍是非常重要的,切記要小心!
以上是這次整理的常見25大風險,提醒大家時時注意外部資安風險的變化,以及內部不定期資安檢視、掃描程式,以強化資安全。
關於 Checkmarx
在現代企業軟體開發方面, Checkmarx 是軟體安全解決方案的全球領導者。Checkmarx 提供業界最全面的軟體安全平台,該平台與 DevOps相互整合,提供靜態和互動式的應用程式安全測試、軟體組成分析,以及開發者 AppSec 覺察意識與訓練計劃,減少並補救軟體漏洞所致的風險。