資訊安全程式設計與代碼審查 (Java)

資訊安全程式設計與代碼審查 (Java)

這篇文章者要特別針對 Security Code Review的一些做法討論,Code Review 其實很花時間,

特別是一個大型的軟體專案,程式碼可能會有上百萬行的情況下,

要如何有效率的做程式碼的檢查,盡早找出潛在的資訊安全風險就是一個挑戰。

筆者舉一些實務上的作法,並且分享一些小技巧。最後以 Java 為例子,

說明如何從 Java 程式”關鍵字”中連結到潛在要注意的資訊安全風險。

介紹幾種”測試”程式碼的策略。

 

Secure Coding 基本原則

一個不管是企業內部大型的應用系統、互聯網電子商務網站、雲端服務等,基本的安全設計守則大致分為幾大類。

認證 最常見的就是帳號與密碼的登入認證不外乎是利用下列方式之一:

  • 你知道什麼:例如帳號密碼
  • 你有什麼:例如自然人憑證,或是手機識別碼。
  • 你是誰(生物特徵):例如指紋辨識
授權 授權指的是哪些功能再經過認證之後可以用哪些不可以用?例如:系統管理者權限、一般使用者權限等。例如:薪資資訊每個人只能看到自己的資訊。
錯誤處理 為什麼錯誤處理在資訊安全領域中很重要? 因為駭客利用這些不當的錯誤處理造成系統異常,或是得知額外系統資訊。
加密 針對敏感性資訊的加密。加密除了確保只有經過授權的使用者可以存取外,另外也避免資料因為儲存或是傳輸時讓其它第三者未經授權的讀取。
資料驗證 資料的輸入有效性驗證。例如,價格  x 數量 = 金額如果駭客將付款價格巧妙的輸入負數,那麼就會得到負數的金額。在資料的驗證不僅僅只有  client 端要做,Server 端、後端伺服器、資料庫更要檢查。
交易與資料傳輸的處理 當認證成功資料,client/server就會建立連線。這邊特別指的是每一次建立的交易 Session的處理。因為這樣的 Session 有可能被駭客務
歷史記錄

Secure Coding

 

UnitTest

程式碼完成時,研發團隊通常會根據功能面做 unitTest 。每種程式語言都有相對應的 unitTest 。

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

 

Leave a Reply

Your email address will not be published. Required fields are marked *