應用或服務的安全編碼很重要,但若事關處理個人數據的系統,那就不僅僅是重要,而是至關重要了。
軟件分析公司CAST分析了1380個軟件應用,在代碼中發現了驚人的130萬個漏洞。
有點網絡安全常識的人都知道,軟件漏洞就是向網絡罪犯敞開的大門。
身份管理可以說是所有技術門類中風險最大的服務。身份盜竊事件常伴我們左右。咨詢公司 Javelin Research 從事身份盜竊事件研究多年,其《2018身份欺詐》報告將2017年身份盜竊統計數據描述為“歷史新高”,揭示身份盜竊繼續困擾著這個行業。
身份管理中我們常會談及所謂“武器化身份”的概念,也就是強化系統中的接入點和用戶與服務交互的位置。然而,武器化過程需分層實施,而其中一層就是代碼層。
身份管理安全編碼
數字身份平臺可能會非常復雜,因為這些平臺往往得依賴外部數據源,并與第三方API集成。消費級身份與訪問管理(IAM)甚至更為復雜。這類平臺需要擴展功能來上傳、存儲和共享文檔與圖片。很多身份服務還融入移動設備App,或者說完全基于移動App。依靠身份生態系統各組件間通信所用協議的固有安全是不夠的。此類生態系統的底層代碼必須盡可能安全,同時又不能對其功能造成影響。
開發身份平臺時可以采用如下幾種最佳安全編碼實踐:
1. 使用良好資源
從安全編碼入門經典資源開始。開放網絡應用安全計劃(OWASP)是安全編碼實際上的入門資源。其安全編碼“快速參考指南”是個極好的起始點,可作為開發過程中的復核工具使用。放心充分利用他們的資源。
2. 采用防御性編程技巧
這么做可以一定程度上避免出現可利用漏洞。其中一招是等價比較:把常量放到比較語句的前端。常量前置的話,如果不小心把比較操作符(兩個等號“==”)誤敲成賦值操作符(一個等號“=”),在編譯或運行時階段就會報錯。舉個例子:
if ($result == ‘SUCCESS’) {
if (‘SUCCESS’ == $result) {
3. 清洗數據
數字身份,尤其是消費級數字身份系統,往往會調用外部數據源。來自外部源或由用戶提供的所有數據都應該被當成不可信的。對Web客戶端來說,這些數據包括從查詢字符串或散列參數、cookie、本地存儲等等獲取的數據;對服務器端應用來說,這些數據包含通過POST、GET、cookie等等提交的數據。原生應用常會讀取配置文件,而這些配置文件有可能被故意篡改。
無論如何,第一道防線都是數據清洗:確保數據中僅含有經允許的字符/格式。其中一個重點是檢查最大數據域長度,避免緩沖區溢出攻擊。
數字身份平臺安全檢查的另一個重要領域是圖片上傳。隨著證件照片的存儲和共享越來越廣泛,IAM和CIAM服務也變得越來越重要。用戶上傳照片之類的文件上傳行為可能會特別危險,必須嚴格檢查以確保文件真的只是單純的圖片而沒有隱藏的可執行內容。
4. 篩查
文檔和其他文件存儲是數字身份生態系統的重要部分。放到存儲中的所有數據都必須經過可執行內容篩查。篩查過程無關底層數據庫技術。比如說,雖然非SQL數據庫對SQL注入攻擊免疫,但仍有自身弱點,仍然要經過篩查。
5. 過濾
類似的,不應直接接受外部命令字符串。應設置過濾器,總是檢查命令是否有效且適用于相應上下文。
6. 防止未經驗證的代碼執行
避免使用eval()類函數,因為此類函數允許未經驗證的代碼執行。內嵌eval()函數的函數也不應采用,比如JavaScript的SetTimer()。
7. 彈性為王
開發面向消費者的數字身份服務往往意味著需要覆蓋大量用戶。你得允許各種各樣的值。應用開發編程的時候要考慮彈性,這樣才能在外部數據值超出預期范圍或類型時不會發生故障或允許代碼注入。良好的單元測試或功能測試通常能檢測出此類問題。
8. 謹慎使用開源代碼
產品中引入最新版開源代碼有可能同時引入了惡意軟件。使用開源代碼包時,最好在包管理器中設置特定版本號,以免誤用未經驗證的版本。編譯過程應包含對所有外部文件的散列檢查。
9. 錯誤響應
錯誤響應是數字身份服務的關鍵部分,因為可以告知用戶問題點并改善可用性。然而,這一功能也可能被惡意黑客用于摸清系統行為。要確保錯誤響應動作不會向攻擊者泄露信息。客戶端-服務器錯誤響應應僅包含知會用戶的最少信息,而不是協助攻擊者窺探應用。
10. 審計日志
如果攻擊確實發生了,你會想要知道到底結果如何以及確保攻擊事件可以復現。但日志記錄需有效,用無意義的審計數據填充日志可能會適得其反。
11. 數字簽名
盡可能采用數字簽名來驗證數據完整性。散列消息驗證碼(HMAC)是經濟實惠且有效的驗證方式。類似的,如果數據十分敏感,比如包含PII,那么需要確保數據存儲和傳輸過程中加密。通過公共或私人網絡傳送任何東西都應使用TLS。
12. 使用令牌進行安全通信
進程間通信可以考慮使用令牌而不是口令進行身份驗證。
13. 移動應用
移動設備應用越來越多地被用于數字身份證明和交易。最好假定設備是可以被越獄的。仔細檢查你處理的數據并評估所涉風險。在可能的情況下引入越獄檢測代碼。
14. 漏洞檢查
每次新升級完成都要做漏洞檢查。有很多專業公司提供這項服務。CheckMarx或CAST之類的公司提供獨立源代碼分析器服務。此類解決方案是安全編碼實踐的重要組成部分,盡管它們不應被當做人工代碼檢查的替代品,而應作為附加檢查完成。
15. 最重要的
緊跟最新漏洞。嚴重漏洞總會出現在 CVE Details 上。必須注意到新威脅并采取行動,確保自己的代碼中不存在這些漏洞。
應用或服務的安全編碼很重要,但若事關處理個人數據的系統,那就不僅僅是重要,而是至關重要了。如果你設計或開發數字身份系統,安全和可用性總會成為難以平衡的兩難選擇。但良好的安全編碼習慣可助你在管理網絡攻擊威脅的同時確保消費者身份系統的復雜功能不受影響。
CAST軟件應用分析報告:
Javelin《2018身份欺詐》報告:
https://www.javelinstrategy.com/coverage-area/2018-identity-fraud-fraud-enters-new-era-complexity
OWASP《安全編碼實踐快速參考指南》:
https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide
CVE Details: