Secure Code Scanning 靜態程式碼掃描
關於 Code Review
這篇文章主要討論如何針對程式碼用自動化的工具作分析,了解程式碼潛在的問題
例如:Memory leak、SQL Injection 等
首先,我們先了解程式碼分析工具可以分析什麼問題,不能分析什麼問題?
程式碼分析擅長的是…
- 基本資料型態的問題 (例如:數值or 字串 overflow等)
- 記憶體管理 (memory leaks)
- 安全性風險的 API (例如:已知的 Buffer overflows)
- 錯誤或是例外處理
- 合法字元的輸入檢查 (e.g. SQL Injection)
程式碼分析不擅長的是…
- 程式整體架構上的問題
- Account 驗證的問題
- 商業邏輯上的關係,例如折扣優惠的期間控制
- 隱私資訊內容的加密
- 動態程式碼,特別是 JavaScript/ PHP web-based 的語言
掃描結果
程式碼掃描工具結果的瑕疵
不一定表示真的是有問題的瑕疵,有可能是 (False Positive)
也不一定每一個瑕疵都表示弱點
因此,當收到這樣的掃描報告之後,研發團隊必須要再次檢視:
- 該問題是會導致潛在的資訊安全風險
- priority 每一個問題
五大程式碼瑕疵的種類
接下來要探討五大程式碼瑕疵:
- 資料型態的問題
- 資料同步的問題
- 記憶體管理的問題
- 例外與錯誤處理的問題
- 輸入合法性的驗證
1. 資料型態的問題
這類問題通常是因為資料型態 Size 所導致,例如數值的資料型態,但是該資料超過該資料型態所容納的最大值與最小值。
2. 資料同步的問題 (thread Safe)
這類的問題主要因為 multiple thread 時,同步資源讀取所造成的 lock 問題。
3. 記憶體管理
這類的問題主要是 Buffer Overview,造成這樣的原因可能為:
例如:local variable 在記憶體中被複寫
例如:Call by Value, Call by Address ,記憶體內容的資料或是記憶體位址被寫錯
例如:程式指標記憶體位址指錯
4. 輸入的合法性驗證
從基本的 Injection 的資訊安全檢查,例如 SQL Injection, Command Injection 等,
到資料來源的驗證,自動程式碼的分析對於資料來源無法完全模擬,
特別是Web-based application
資料的來源例如:
- Cookie
- 使用者輸入參數
- 資料透過 sockets 傳輸
- 資料輸入透過指令
Top 20程式碼問題
(根據CWE,Top 25程式碼的問題列表如下)
Rank | Score | ID | Name |
---|---|---|---|
[1] | 93.8 | CWE-89 | Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’) |
[2] | 83.3 | CWE-78 | Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’) |
[3] | 79.0 | CWE-120 | Buffer Copy without Checking Size of Input (‘Classic Buffer Overflow’) |
[4] | 77.7 | CWE-79 | Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’) |
[5] | 76.9 | CWE-306 | Missing Authentication for Critical Function |
[6] | 76.8 | CWE-862 | Missing Authorization |
[7] | 75.0 | CWE-798 | Use of Hard-coded Credentials |
[8] | 75.0 | CWE-311 | Missing Encryption of Sensitive Data |
[9] | 74.0 | CWE-434 | Unrestricted Upload of File with Dangerous Type |
[10] | 73.8 | CWE-807 | Reliance on Untrusted Inputs in a Security Decision |
[11] | 73.1 | CWE-250 | Execution with Unnecessary Privileges |
[12] | 70.1 | CWE-352 | Cross-Site Request Forgery (CSRF) |
[13] | 69.3 | CWE-22 | Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’) |
[14] | 68.5 | CWE-494 | Download of Code Without Integrity Check |
[15] | 67.8 | CWE-863 | Incorrect Authorization |
[16] | 66.0 | CWE-829 | Inclusion of Functionality from Untrusted Control Sphere |
[17] | 65.5 | CWE-732 | Incorrect Permission Assignment for Critical Resource |
[18] | 64.6 | CWE-676 | Use of Potentially Dangerous Function |
[19] | 64.1 | CWE-327 | Use of a Broken or Risky Cryptographic Algorithm |
[20] | 62.4 | CWE-131 | Incorrect Calculation of Buffer Size |
[21] | 61.5 | CWE-307 | Improper Restriction of Excessive Authentication Attempts |
[22] | 61.1 | CWE-601 | URL Redirection to Untrusted Site (‘Open Redirect’) |
[23] | 61.0 | CWE-134 | Uncontrolled Format String |
[24] | 60.3 | CWE-190 | Integer Overflow or Wraparound |
[25] | 59.9 | CWE-759 | Use of a One-Way Hash without a Salt |
“動態”程式碼分析
除了”靜態”程式碼分析之外,另外一個方法是”動態”程式碼分析,
動態程式碼分析指的是需要執行時整體的分析,例如 Web Application,
從使用者Web UI輸入,前端 HTTP/JavaScript 執行檢查,
網路傳輸透過 HTTP/HTTPS request GET/Post,
資料傳輸到後端 Web Server Application 程式(PHP/Java/C#)執行
到資料庫 Query 執行,
再將執行結果回傳至使用者 Browser WebUI
這整過過程需要的技術就是 “動態” 程式碼分析
單純掃描 Javascript 或是某一部分的 Web Application 無法有效的偵測到資訊安全漏洞
相關程式語言的建議
Android
Android Java 程式的建議可以參考:
http://developer.android.com/training/articles/security-tips.html
程式碼掃描的工具可以使用:lint
http://developer.android.com/tools/debugging/improving-w-lint.html
PHP
PHP 本身其實是 Web 相關的的服務,
所以程式碼的掃描需要整體的配合使用 “動態”掃描的方式進行
針對 PHP 語言,程式語言撰寫的建議可以參考:
https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet
JavaScript
JavaScript 也是屬於 Web 的服務內容之一,程式語言的建議可以參考:
http://html5sec.org/#javascript
iOS
Apple 對於程式語言所會造成的弱點,主要分為
- buffer overflows
- unvalidated input
- race conditions
- access-control problems
- weaknesses in authentication, authorization, or cryptographic practices
細節可以參考
https://developer.apple.com/library/mac/documentation/security/conceptual/SecureCodingGuide/Articles/TypesSecVuln.html#//apple_ref/doc/uid/TP40002529-SW2
自動化掃描工具可以 Clang Analyzer
http://clang-analyzer.llvm.org/
總結
這篇文章說明靜態程式分析的目的與限制
常見的靜態程式分析可以找出的程式瑕疵
也列出幾種程式語言的安全建議與參考工具
最後,也簡介Web Application 動態程式分析
都會讓程式的品質有一定的提升
工具分析的結果提供的主要是參考,最後還是要靠專業的研發人員判斷如何解決