資安JAVA(二十): 不要相信其他人(Trust Nothing)

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 20 – TRUST NOTHING
作者:John Melton
Don't worry ^_^
What is it and why should I care?


信任感是很有趣的議題,我們潛意識中相信人性本善,開發者也是。看看以下這個例子:

//bad bad do not use
executeDbQuery("select * from my_table where id = " + request.getParameter("my_id"));
//bad bad do not use

開發者相信使用者不會竄改 my_id 所以放心的直接帶入 executeDbQuery()。這太天真了,正確作法應該是用 my_id 參數傳入到 Prepare Statement 以防止 SQL Injection 同時檢查 my_id 的內容是否正確。

為何要如此大費周章?因為我們不能隨便相信輸入值,不能相信使用者會依照我們的期望使用系統。我們必須建造好用的、能承受攻擊的、強壯且吃苦耐勞的系統。無論你的系統是甚麼類型,作者建議不要信任( Trust )系統會接觸到的環境。

「不能信任系統環境」到底代表什麼意涵?是為了避免 XSS 和 SQL injection 嗎?是,但更深一層的意涵是以不同的方式了解應用程式。應用程式其實是規模不同的輸入-處理-輸出的過程,輸入值可能是 request parameters、headers、database input 等等,處理包括身分驗證、邏輯,輸出到資料庫、螢幕、檔案等等。整個應用程式可以當成所有系統元件的輸入值、處理、輸出的結合,並縮放規模到適合的系統和組織。

所謂的「環境」因人而異,「你不能相信任何人」也是因地制宜。作者的建議是我們應分辨可以相信的和不能相信的,不能相信的資料應視之為已經被汙染的資料。

威脅模擬( Threat Modeling )中包含許多此類議題,日後的文章作者會介紹。

What should I do about it?

既然我們已經建立「不能信任的環境」的前提,下一個合理問題就是,「環境中有什麼」?
不同的預設條件可能會有不同長短的答案,典型的Web應用程式可能會有以下的結論:
  • Web請求資料(parameters、headers、body、cookies)
  • 資料庫資料
  • 目錄資料( LDAP )
  • 檔案資料
  • Web Service 資料
  • 外部系統資料
  • 網路資料( 通常接收的是來自 Server 的資料)
  • 使用者輸入
  • 系統環境變數( system environment variables)
  • 第三方軟體( 通常是你呼叫的函式庫 )
請別以為這份清單以十全十美,你了解概念的。除了針對組織或應用程式的特殊設計外,所有使用者輸入的資料都不能信任。以這樣的思維( 白名單 )建立應用程式,才能建立較好的 防禦 、較嚴謹的 稽核和記錄 機制,才能偵測某些規則被打破的瞬間,才是經營應用程式的長久之道。

參考資料
http://www.ruggedsoftware.org/
http://www.schneier.com/book-lo.html
http://en.wikipedia.org/wiki/Robustness_principle
http://www.jtmelton.com/2012/05/01/year-of-security-for-java-week-18-perform-application-layer-intrusion-detection/
http://www.jtmelton.com/2012/04/10/year-of-security-for-java-week-15-audit-security-related-events/

———–———–
資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(八):HTTP強制傳輸安全(HSTS)

以 SharpPcap 實作可收聽封包的 C# 程式

資安JAVA(四):Session Cookie HTTPOnly Flag