資訊安全程式設計與代碼審查 (Java)
這篇文章者要特別針對 Security Code Review的一些做法討論,Code Review 其實很花時間,
特別是一個大型的軟體專案,程式碼可能會有上百萬行的情況下,
要如何有效率的做程式碼的檢查,盡早找出潛在的資訊安全風險就是一個挑戰。
筆者舉一些實務上的作法,並且分享一些小技巧。最後以 Java 為例子,
說明如何從 Java 程式”關鍵字”中連結到潛在要注意的資訊安全風險。
介紹幾種”測試”程式碼的策略。
Secure Coding 基本原則
一個不管是企業內部大型的應用系統、互聯網電子商務網站、雲端服務等,基本的安全設計守則大致分為幾大類。
認證 | 最常見的就是帳號與密碼的登入認證不外乎是利用下列方式之一:
|
授權 | 授權指的是哪些功能再經過認證之後可以用哪些不可以用?例如:系統管理者權限、一般使用者權限等。例如:薪資資訊每個人只能看到自己的資訊。 |
錯誤處理 | 為什麼錯誤處理在資訊安全領域中很重要? 因為駭客利用這些不當的錯誤處理造成系統異常,或是得知額外系統資訊。 |
加密 | 針對敏感性資訊的加密。加密除了確保只有經過授權的使用者可以存取外,另外也避免資料因為儲存或是傳輸時讓其它第三者未經授權的讀取。 |
資料驗證 | 資料的輸入有效性驗證。例如,價格 x 數量 = 金額如果駭客將付款價格巧妙的輸入負數,那麼就會得到負數的金額。在資料的驗證不僅僅只有 client 端要做,Server 端、後端伺服器、資料庫更要檢查。 |
交易與資料傳輸的處理 | 當認證成功資料,client/server就會建立連線。這邊特別指的是每一次建立的交易 Session的處理。因為這樣的 Session 有可能被駭客務 |
歷史記錄 |
UnitTest
程式碼完成時,研發團隊通常會根據功能面做 unitTest 。每種程式語言都有相對應的 unitTest 。
- Java – JUnit, (www.junit.org), TestNG (http://beust.com/testng/), JTiger (www.jtiger.org)
- Microsoft .NET – NUnit (www.nunit.org), .NETUnit (http://sourceforge.net/projects/dotnetunit/), ASPUnit (http://aspunit.sourceforge.net/), CSUnit (www.csunit.org) and MS Visual Studio Team Edition
- PHP – PHPUnit (http://pear.php.net/package/PHPUnit), SimpleTest (www.simpletest.org)
- Python – PyUnit (http://pyunit.sf.net), doctest (included in standard library)
- C++ – CPPUnit (http://cppunit.sf.net), cxxtest (http://cxxtest.sf.net)
UnitTest 優點是可以針對該特定的 Class or Method 做驗證。
要透過unitTest 要測試相關資訊安全風險必須額外注意:
- 設計資訊安全相關的測試個案
- UnitTest 無法取代其他資訊安全風險的測試。i.e. 整體系統的 Penetration Testing
程式碼掃描
由於 Code Review 通常會花很多時間,因此通常程式碼會先透過工具來掃描。
這類的工具掃描大致分為兩類。
靜態程式碼掃描:
程式碼掃描根據所定義好的資訊安全風險規則掃描程式。最後有個風險報告分析。筆者經驗這樣的報告還需要經過”人”的審查。因為會有超過 50%的掃描結果是可以忽略。可以忽略的原因到不完全是這樣的工具掃描誤判。多半原因是因為這些在特定程式碼找到的風險,有可能因為整體系統的設計或是其它模組交互作用下,這個風險暴露的機率變得很低。
商用比較知名的工具像是:
- Klocwork
- IBM AppScan Source
動態網頁掃描:
這類主要指的是網頁、互聯網、Web service 等就必須進行”動態”掃描。
為什麼叫做”動態”掃描呢?
因為這類的掃描工作多半需要資安專業人士的介入。無法完全自動進行。
舉例來說,帳號密碼的登入測試。資安專家可能運用動態掃描的工具外,設計特別的資料輸入。再針對掃描的結果設計其他資料輸入等。
整個測試過程就會比較接近駭客入侵的過程。通常這樣的掃描我們會用兩種以上的工具掃描相互比對掃描的結果。
比較知名的工具像是:
- IBM appScan
- HP Web Insepect
- Burp Suite
- OWASP ZAP (open source)
Code Review 優先順序
當”自動化”工具都執行之後,針對這別有資訊安全風險的模組會進行 Code Review,
大型專案由於程式碼過多,不可能全部進行,因此建議下列的重點執行
- 處理認證與授權相關的模組,例如登入
- 資料庫資料更新
- 敏感性資料處理
Java 關鍵字與資訊安全風險
對於一個大型的專案來說進行 Code Review 有沒有其他小技巧? 更快的鎖定要專注的模組呢?
這邊提供另外一個”關鍵字”搜尋法。舉 Java 開發的系統來說,Java 有些特殊的 API關鍵字是在資訊安全上我們會希望專注的。
資訊安全類別 | Java 關鍵字 |
輸入與輸出 | Java.io java.util.zip java.util.jar FileInputStream ObjectInputStream FilterInputStream PipedInputStream SequenceInputStream StringBufferInputStream BufferedReader ByteArrayInputStream CharArrayReader File ObjectInputStream PipedInputStream StreamTokenizer getResourceAsStream java.io.FileReader java.io.FileWriter java.io.RandomAccessFile java.io.File java.io.FileOutputStream mkdir renameTo |
其它 | password ; key ; connection ; session ; todo ; exec ; system Hack ; Bypass ; Steal ; Stolen ; Divert ; Broke ; Trick ; FIXME ; ToDo ; Password ; Backdoor |
Http Request 相關 | javax.servlet.* ; getParameterNames ; getParameterValues ; getParameter ; getParameterMap ; getScheme ; getProtocol ; getContentType ; getServerName ; getRemoteAddr ; getRemoteHost ; getRealPath ; getLocalName ; getAttribute ; getAttributeNames ; getLocalAddr ; getAuthType ; getRemoteUser ; getCookies ; isSecure ; HttpServletRequest ; getQueryString ; getHeaderNames ; getHeaders ; getPrincipal ; getUserPrincipal ; isUserInRole ; getInputStream ; getOutputStream ; getWriter ; addCookie ; addHeader ; setHeader ; setAttribute ; putValue ; javax.servlet.http.Cookie ; getName ; getPath ; getDomain ; getComment ; getMethod ; getPath ; getReader ; getRealPath ; getRequestURI ; getRequestURL ; getServerName ; getValue ; getValueNames ; getRequestedSessionId |
XSS | javax.servlet.ServletOutputStream.printjavax.servlet.jsp.JspWriter.print
java.io.PrintWriter.print |
REDIRECTION | sendRedirect setStatus addHeader, setHeader |
SQL & DATABASE | jdbc ; executeQuery ; select ; insert ; update ; delete ; execute ; executestatement ; createStatement ; java.sql.ResultSet.getString ; java.sql.ResultSet.getObject ; java.sql.Statement.executeUpdate ; java.sql.Statement.executeQuery ; java.sql.Statement.execute ; java.sql.Statement.addBatch ; java.sql.Connection.prepareStatement ; java.sql.Connection.prepareCall |
SSL | com.sun.net.ssl SSLContext SSLSocketFactory TrustManagerFactory HttpsURLConnection KeyManagerFactory |
SESSION MANAGEMENT | getSessioninvalidate
getId |
技術參考文件
DHS: Secure Coding Pocket Guide
https://buildsecurityin.us-cert.gov/swa/downloads/Secure_Coding_v1.1.pdf
SAFECode: Fundamental Practices for Secure Software Development, 2nd Edition
http://www.safecode.org/publications/SAFECode_Dev_Practices0211.pdf
Microsoft: Writing Secure Code, 2nd Edition
http://www.microsoft.com/learning/en/us/book.aspx?ID=5957&locale=en-us
CERT: Secure Coding in C and C++
http://www.cert.org/books/secure-coding
Viega/McGraw: Building Secure Software
http://collaboration.csc.ncsu.edu/CSC326/Website/lectures/bss-ch1.pdf
OWASP: Secure Coding Principles
http://www.owasp.org/index.php/Secure_Coding_Principles