閱讀筆記 - 開發人員該知道的 OWASP 十大資安風險與 TOP 25 軟體常見弱點
0 |
Open Web Application Security Project (OWASP) 是個非營利組織,透過開放社群模式整合網站資安資訊與資源,而其定期更新的 OWASP TOP 10,網站十大資安風險排行,幾乎已是網站開發人員的基本常識。
2021 Q4 OWASP 發佈了 2021 版 TOP 10,離上次的 2017 版已有五年,新版做了一些修正,有四個分類更名或修正範圍,合併了一些分類並增加了三個新分類:
圖片來源:OWASP Top 10 2021 介紹
OWASP TOP 10 的排行依據來自 CWE 事件統計。CWE 是 Common Weakness Enumeration 的縮寫,是一份社群整理的軟硬體弱點清單,在看 OWASP TOP 10 前建議先看過 2023 最危險軟體弱點前 25 名 感受一下:
- Out-of-bounds Write
寫入資料時超出預定範圍,最典型的例子即 Buffer Overflow,可造成資料毁損、當機或塞入惡意程式並執行,這在 C/C++ 等需要自行管理記憶體位址的中階語言較常見。 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
未確實檢核輸入,導致網頁被惡意插入程式碼在其他使用者主機執行。 - Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
天殺的 SQL Injection 已是老掉牙的漏洞,但至今仍是眾多駭客事件被突破的主因,令人生氣又無奈,不知道它是什麼的開發者請去走廊罰站。(但我小時侯也有過黑歷史,現已改過自新) - Use After Free
繼續使用已釋放的記憶體導致當機、資料錯亂或執行到不該執行的程式,一樣多見於 C/C++ 等需自行管理記憶體的語言。 - Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')
概念跟 SQL Injection 類似,將使用者輸入內容串接成 OS 指令,導致被插入惡意指令在主機上執行。 - Improper Input Validation
未妥善檢核輸入值,導致後續資料處理出錯或被操縱利用。 - Out-of-bounds Read
在定義範圍以外讀取資料,攻擊者可能因此取得機密或敏感資料,或是因讀取無效資料導致當機。 - Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
程式利用外部輸入值決定檔案或目錄路徑,因未正確過濾特殊符號與驗證規則,導致攻擊者存取到預期範圍之外的檔案。經典案例是原本要上傳或下載特定目錄檔案,攻擊者使用..\..\web.config
或C:\Windows\System32
存取系統相關檔案,這點常被忽略,結果也很要命。 - Cross-Site Request Forgery (CSRF)
網站未使用機制檢核使用者送出請求的有效性,導致攻擊者可輕易捏造請求內容。延伸閱讀:ASP.NET MVC 防止 AJAX POST CSRF 攻擊 - Unrestricted Upload of File with Dangerous Type
上傳圖檔或文件功能因未限定上傳檔案型別,被用來上傳後門、木馬、XSS 網頁... 等程式檔。除限制檔案型別,禁止外界直接透過 URL 存取所上傳檔案亦有防護效果。延伸閱讀:善用 App_Data 的隱身特性 - Missing Authorization
存取受限制資源或執行動作前沒檢查使用者是否被授權。 - NULL Pointer Dereference
存取到未預期為 NULL 的變數/指標,造成程式當機或結束。 - Improper Authentication
未妥善檢核使用者身分而被冒用。 - Integer Overflow or Wraparound
計算整數時發生溢位或繞回(Wraparound),當計算結果是用於資源管理或執行控制,即可能被攻擊者利用。 - Deserialization of Untrusted Data
攻擊者可能透過修改序列化資料埋入 Gadget Chain 形式的惡意程式,在反序列化時觸發執行。PHP 範例、Java 範例 - Improper Neutralization of Special Elements used in a Command ('Command Injection')
程式用上游元件所提供輸入值建構指令傳至下游元件,除了 DB 跟 OS 指令外,開發者可能末意識到在其他環節資料也會變成指令被用來攻擊。 - Improper Restriction of Operations within the Bounds of a Memory Buffer
讀取或寫入到定義範圍之外的 Buffer 記憶體位置,一樣較常發生於可直接存取記憶體位址的語言,如 C。 - Use of Hard-coded Credentials
將密碼或加密金鑰寫死在程式裡,讓系統管理者難以掌控管理,例如:管理者無法修改密碼、密碼可能隨程式外流、一旦外流安裝在各處的系統全面失守。 - Server-Side Request Forgery (SSRF)
網站透過 URL 或相關請求由上游元件取得請求內容並轉發到目的地,卻未檢核發送轉發目的地是否合法,此漏洞可能讓系統變成攻擊跳板,穿透防火牆限制或冒用其 IP 傳送請求,得到額存取權限。 - Missing Authentication for Critical Function
執行關鍵功能或讀取大量資料時未確實驗證使用者身分,若發生於雲端資料,稍有不慎會整盤被端走。 - Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
原本必須依特定順序處理的共享資源,在多組程式同時存取時因時間差造成資料被不當修改,導致資料錯亂或被攻擊者利用(例如:趁餘額數字未反應前超額提取)。 - Improper Privilege Management
未妥善指定、修改、追蹤及檢查操作者的權限。例如:檢查使用者是 Guest 跟 User 時禁止操作,否則放行,原以為只限定 Admin,但忘了還有 Operator 群組,通常是低級錯誤。 - Improper Control of Generation of Code ('Code Injection')
程式碼產生器引用外部提供資料決定產生的程式碼內容,因未檢查不當輸入被植入惡意片段轉為程式被執行。 - Incorrect Authorization
存取限制資源的檢查沒寫好,導致攻擊者得以跳過檢查。 - Incorrect Default Permissions
例如:預設開放所有人有權修改。
看完 CWE 再回頭看 OWASP TOP 10,概念上共是將 CWE 分類彙整,並依統計進行排序,例如:A03 Injection 囊括了 33 項 Injection 相關 CWE。
要深入了解 OWASP TOP 10,可查看個別 CWE 得到較詳細的解釋,甚至有程式範例說明。嚴格來說,OWASP TOP 10 比較偏大方向,概略性說明,若想研究透徹,CWE 資訊可提供更多協助,例如在 Home About CWE List Mapping Top-N Lists Community News Search CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') 可以查到範例解說:
最後,來看一下 OWASP TOP 10,就想成是絕世武功的目錄吧,還是很有參考價值!
A01 權限控制失效
CSRF、上傳下載案路徑沒控好、預設權限沒設好都算在內,另外如偷改 URL、用自訂 API 工具繞過檢查、改個參數偷看或偷改其他人資料、動點手腳變成管理者、改 Cookie 拿到權限、CORS 沒設好錯收非法 API 請求、POST/PUT/DELETE 操作忘了檢查身分... 等低級錯通通歸在這類。
預防措施:
- 非公開資料預設拒絕存取
- 統一建置存取管控機制並重複利用,少用 CORS
- 強化資料所有權觀念,不應讓使用者讀寫增刪任意資料
- 禁止在網頁顯示網站資料夾功能,避免中繼資料(如.git)及備份資料留在 Web 根目錄
- 記錄存取被拒事件並適時通知管理人員(例如:重複發生)
- 為 API 和 Controller 加上限流,減少自動化工具攻擊帶來的損害
- JWT 登出後應要在伺服器端強制失效
A02 加密機制失效
重點在避免明碼傳輸、淘汰老舊加密演算法及強度不足的金鑰、驗證憑證有效性... 等。
預防措施:
- 對系統涉及的資料進行分類,識別哪些是敏感資料,對不同分類採行不同的管控措施
- 非必要不保存敏感資料,不得不存時考慮打馬賽克(資料記號化Tokenization)或截斷(Truncation)。「不存下來就不會被偷!」 (說得好!)
- 確保所有靜態敏感資料有加密
- 使用新版且夠強的加密演算法,並妥善保存金鑰
- 使用 TLS/HSTS 加密傳輸
- 網頁包含敏感資料時禁用 Cache
- 使用雜湊迭代次數因素(Work Factor/Delay Factor)的加鹽雜湊儲存密碼,如:Argon2, scrypt, bcrypt或PBKDF2,延伸閱讀:密碼要怎麼儲存才安全?該加多少鹽?-科普角度
A03 注入式攻擊
SQL、NoSQL、OS 指令、ORM、LDAP、表達式語言 (EL)、對象導航圖語言 (OGNL) 的注入都算,源碼檢測是有效的發現手段。
預防措施:
- 將命令跟資料徹底分開,就不用擔心了,對 SQL Injection 來說,外界輸入內容一律使用 DbParameter 傳送就對了,或改用 EF 等 ORM 技術
註:若連資料表、欄位名稱都要由外部指定,這部分無法參數化,可讓使用者僅能由伺服器端選項或陣列中挑選,不要開放自由輸入 - Stored Procedure 中如要動態組裝指令,請用 sp_executesql (Transact-SQL)
- 考慮用白名單在伺服器端驗證輸入資料(如果可行的話)
- 使用 LIMIT 或 TOP 限制筆數,萬一受到 SQL Injection 攻擊時減少洩漏資料量
A04 不安全設計
這條有點廣泛及抽象,簡言之,就是設計時犯蠢沒想好。例如:忘記密碼時用問題與回答驗證身分(小學讀哪裡應該不難知道吧?)、預訂餐廳未經任何驗證(Email/電話)包場還免付訂金、演唱會搶票網站沒加 CAPTCHA 防機器人驗證。
預防措施:
- 設計階段找專家參與評估及複核
- 使用安全可靠的函式庫及元件
- 對關鍵認證、存取控制、商業邏輯與關鍵缺陷進行威脅模型分析
- 撰寫單元測試與整合測試驗證所有關鍵流程能對抗威脅
A05 安全設定缺陷
指程式設計及系統架構上的不當設計與設定,例如不必要的 Port、帳號或權限、未改掉預設帳號密碼、錯誤訊息曝露 Stacktrace 程式檔資訊、忘了設定安全參數、未移除具安全缺陷的預設範例程式... 等等。
預防措施:
- 建立可重複的安全強化流程,並力求自動化
- 平台上不要夾帶用不到的功能、套件、工具、檔案、範本
- 落實變更管理,依據資安公告、安全更新、弱點資訊進行安全審核
- 採用可分割的應用程式架構,達成管理及安全上的隔離
- 使用安全 Header (CSP...) 提高安全性
- 檢查環境中各類安全設定自動化機制(例如:弱點掃瞄)
A06 易受攻擊和已淘汰的組件
預防措施:
- 刪除不必要的相依套件、不需要的功能、組件、檔案及文件
- 盤點客戶端及伺服器端組件及相依套件版本 持續監控 CVE 和 NVD 通報,找出已知有安全疑慮的組件並即時修補。若無法立刻修補,考慮部署虛擬修補程式來監控、檢測或防禦
- 管控組件來源,一律由官方下載、選擇有數位簽章的更新包
A07 認證及驗證機制失效
常見狀況為因防禦不足被由其他來源取得帳密名單的攻擊者自動化撞庫攻擊、被自動化暴力破解、允許強度不足的密碼、使用脆弱的忘記密碼或重設密碼機制、密碼以明碼/加密或強度不足的雜湊儲存、缺乏多因素認證、URL 洩漏 Session ID、未正確註銷 Session... 等等。
預防措施:
- 使用多因素認證或 CAPTCHA 防止自動化撞庫攻擊、暴力破解或冒用竊取的認證資訊(此項只能靠多因素)
- 不提供預設認證資訊(尤其是管理者)
- 阻擋脆弱密碼(例:用黑名單拒絕前 10,000 個易被猜中密碼),制定密碼強度要求、定期更換政策
- 使用模糊回應避免攻擊者蒐集資訊(例如:不告知是帳號不存在還是密碼不對)
- 隨機化 Session ID,確實註銷登出、閒置、逾時 Session
A08 軟體及資料完整性失效
如 CWE 第 25 項反序列化攻擊、CDN 夾帶惡意程式庫、透過自動更新散佈惡意程式... 等等。
預防措施:
- 用數位簽章及完整性檢查(如檔案雜湊比對)防止檔案被加料或竄改
- 確保程式庫及相依套件來自受信任的 Repository
- 使用軟體供應鏈安全工具(如 OWASP Dependency Check 或 OWASP CycloneDX)確保元件沒有已知弱點
- 在 CI/CD 流程加入必要檢查
A09 資安記錄及監控失效
常見狀況:未記錄登入成功/失敗/重要交易之稽核事件、警告或錯誤未留下日誌或保存訊息不足、未監控程式或API日誌之可疑活動、日誌只保存在本地端、滲透測試及DAST(Dynamic Application Security Test)工具未發揮效果、未能偵測及通告進行中的攻擊,導致重大損失。
預防措施:
- 記錄登入、存取失敗記錄,日誌應包含足夠資訊並保留一定期限供日後鑑識需求
- 日誌應採用業界通用格式
- 確保日誌正確編碼,防止日誌/監控系統被注入或攻擊
- 重要交易需保留稽核軌跡,防止竄改或刪除(可考慮只允許新增不能更新的資料表設計)
- DevSecOps Team 應有效監控偵測可疑活動並即時應變
- 進入事件應變及復原計劃(如 NIST 800-61r2)
A10 伺服端請求偽造
即 SSRF,Server-Side Request Forgery,攻擊者操縱請求內容,成功克服防火牆、VPN 或存取控管,控制網站發送捏造的請求給對非預期對象。例如:對內部網路掃瞄 IP、Port 或主機狀態、讀取到限定內網存取的機敏資料、對內網主機進行 DoS 攻擊等。
預防措施:
- 嚴格過濾及驗證來自用戶端的所有輸入值
- 轉送請求到後方系統時,不將其原始回應直接傳給使用者,以免讓攻擊者得以推測 IP、服務狀態
- 停用 HTTP 重新導向
- 避免 DNS Rebinding、TOCTOU 攻擊 等攻擊
註:透過 DNS 查詢 IP 合法才呼叫,攻擊者操縱 DNS 第一次回傳合法 IP,真正呼叫時回傳攻擊對象 IP。TOCTOU 也是利用檢查跟真正使用的時間差動手腳。
Comments
Be the first to post a comment