IOS開發安全須知

最近移動端的漏洞見得比較多,正好從OWASP上找到了IOS開發安全須知,翻譯過來,給各位看看。

不安全的數據存儲 (M1)

毫無疑問,移動設備用戶面臨的最大風險是設備丟失或被盜。任何撿到或偷盜設備的人都能得到存儲在設備上的信息。這很大程度上依賴設備上的應用爲存儲的數據提供何種保護。蘋果的iOS提供了一些機制來保護數據。這些內置的保護措施適合大多數消費級信息。如果要滿足更嚴格的安全需求(如財務數據等),可以在應用程序中內置更好的保護措施。

補充

一般來說,一個應用程序應該只存儲執行其功能所必須的數據。包括旁路數據在內,如系統日誌(見M8章節),無論任何形式的敏感數據,都不應該明文存儲在應用的沙箱中(如:~/Documents/*)。消費級的敏感數據應該使用蘋果提供的API存儲在安全的容器中。

  • 少量的消費級敏感數據,如用戶身份認證憑證、會話令牌等,可以安全的存儲在設備的鑰匙扣(Keychain)內(see Keychain Services Reference in Apple’s iOS Developer Library)
  • 對於更大或更一般類型的消費級數據,可以安全的使用蘋果的文件保護機制存儲。(see NSData Class Reference for protection options).
  • 如果數據必須要存儲在本地,數據的安全敏感度會比普通的消費級敏感度更高,這時可以考慮使用不受蘋果的內置加密機制限制(如:keying與用戶設備的四位數字PIN編碼綁定)的第三方加密API。SQLcipher(http://sqlcipher.net)就是這樣一種免費解決方案。在此過程中,適當的密鑰管理是極爲重要的——當然,這超出了本文的討論範圍。
  • 將數據存儲在keychain的最安全的API參數是kSecAttrAccessibleWhenUnlocked(在iOS5/6中是默認值)。
  • 避免使用NSUserDefaults存儲敏感信息。
  • 請注意,使用NSManagedObects存儲的所有數據/實體都是存放在一個未加密的數據庫文件中的。

服務端控制薄弱 (M2)

儘管大多數服務器端控制是在服務器端處理的。我們參考Web Service Security Cheat Sheet,其實有些是可以在移動端做的,同時移動端可以幫助服務器做一些必要的工作。

補充

設計並實現讓移動端和服務端支持的一套共同的安全需求。例如:敏感信息在服務器的處理應該等效於客戶端。對所有的客戶端輸入數據執行積極的輸入檢查和標準化。使用正則表達式和其他機制來確保只有允許的數據能進入客戶端應用程序。如果有可能,對所有的不可信數據進行編碼。

傳輸層保護不足 (M3)

網絡應用程序的敏感數據被竊聽攻擊比較常見,iOS手機應用也不例外。

補充

所有應用程序都可能在開放的Wi-Fi網絡環境中使用,要設計和實現這個場景下的防護措施。列一個清單,確保所有清單內的應用數據在傳輸過程中得到保護(保護要確保機密性和完整性)。清單中應包括身份認證令牌、會話令牌和應用程序數據。確保傳輸和接收所有清單數據時使用SSL/TLS加密(See CFNetwork Programming Guide)。確保你的應用程序只接受經過驗證的SSL證書(CA鏈驗證在測試環境是禁用的;確保你的應用程序在發佈前已經刪除這類測試代碼)。通過動態測試來驗證所有的清單數據在應用程序的操作中都得到了充分保護。通過動態測試,確保僞造、自簽名等方式生成的證書在任何情況下都不被應用程序接受。

客戶端注入(M4)

當移動應用是web應用的時候,數據注入攻擊有可能存在,不過攻擊場景往往有所不同(例如:利用URL來發送扣費短信或撥打扣費電話)。

補充

一般來說,web應用程序的輸入驗證和輸出過濾應該遵循同樣的規則。要標準化轉換和積極驗證所有的輸入數據。即使對於本地SQLite/SQLcipher的查詢調用,也使用參數化查詢。當使用URL scheme時,要格外注意驗證和接收輸入,因爲設備上的任何一個應用程序都可以調用URL scheme。當開發一個web/移動端混合的應用時,保證本地/local的權限是滿足其運行要求的最低權限。還有就是控制所有UIWebView的內容和頁面,防止用戶訪問任意的、不可信的網絡內容。

脆弱的授權和身份認證(M5)

儘管授權和身份認證很大程度上是由服務端來控制的,但是一些移動端特性(如唯一設備標示符)和常見的使用方式也會加劇圍繞安全驗證、授權用戶和其他實體之間的安全問題。

補充

一般來說,web應用程序的身份驗證和授權應該遵循相同的規則。永遠不要使用設備唯一標示符(如UDID、IP、MAC地址、IMEI)來驗證用戶身份。避免可能的“帶外”(out-of-band)身份認證令牌發送到用戶用來登陸的相同的設備(如:將短信發送到同一個iPhone)。實現強壯的服務端身份驗證、授權和會話管理。驗證所有的API請求和支付資源。

會話處理不當(M6)

同樣,會話處理一般主要是服務器端的工作,但是移動端設備往往有通過不可預見的方式放大傳統問題的傾向。例如,在移動端設備上,會話通常要比傳統web應用程序的持續時間要長。

補充

在大多數情況下,你要遵循與web應用程序相同的會話管理安全實踐,兩者只有些許不同。永遠不用使用設備唯一標示符(如UDID、IP、MAC地址、IEME)來標示一個會話。保證令牌在設備丟失/被盜取、會話被截獲時可以被迅速重置。務必保護好認證令牌的機密性和完整性(例如:只使用SSL/TLS來傳輸數據)。使用可信任的服務來生成會話。

通過不可信的輸入進行安全決策 (M7)

雖然iOS沒有給應用很多彼此通訊的渠道,但存在的那些仍有可能通過數據注入攻擊、惡意應用等被攻擊者利用。

補充

輸入驗證、輸出轉義和授權控制相結合可以對付這類缺陷。規範和積極的驗證所有輸入數據,特別是應用程序之間的邊界調用。當使用URL scheme時,要格外小心的驗證和接收輸入數據,因爲設備上的任何應用程序都能調用URL scheme。根據上下文過濾所有不可信的輸出,從而保證沒有改變應用意圖的輸出。驗證是否允許調用者訪問其所請求的資源。如果可能的話,當應用程序訪問請求的資源時,提示用戶,讓用戶選擇允許/不允許訪問。

旁道數據泄露 (M8)

旁道數據通常是指那些用來管理或具有非直接功能性目的的I/O數據。如web緩存(用來優化瀏覽器速度)、擊鍵記錄(用戶拼寫檢查)以及其他類似的數據。蘋果的iOS提供的一些機制,讓一些旁道數據從一個應用程序泄露成爲可能。這些數據能夠被撿到或偷竊被害人設備的人獲取。大多數這類數據都能被應用程序編碼控制。

補充

在設計和實現所有應用時,都要考慮用戶的設備丟失或被盜的情況。首先確認所有的旁道設備數據。這些數據資源至少包括:web緩存、擊鍵記錄、屏幕截圖、系統日誌、剪切緩衝區和第三方類庫使用的數據。不要將敏感數據(身份憑證、令牌、個人身份信息PII)放在系統日誌中。控制iOS的屏幕截圖,防止敏感的應用數據在應用最小化時被截圖。在輸入敏感數據時,禁用鍵盤記錄,防止這類數據被明文存儲到設備上。操作敏感數據時,禁用剪切板緩衝區,防止數據在應用外泄露(被其他應用讀取)。動態的測試應用程序的數據存儲方式和通訊方式,確保沒有敏感信息被不當的傳輸或存儲。

失效的密碼學 (M9)

儘管絕大多數的加密軟件的弱點源於密鑰管理安全性不足,但是加密系統的各個方面都應該精心設計和實現。移動應用也是這樣。

補充

永遠不要將密鑰硬編碼或存儲在攻擊者可以很簡單就能找到的地方:包括明文數據文件、屬性文件和編譯後的二進制文件。使用安全的容器來存儲加密密鑰;此外,當密鑰是由一個安全服務器控制時,構建一個安全的密鑰交換系統,永遠不要存儲在移動設備上。使用強壯的加密算法及算法實現,包括密鑰生成器、哈希等。儘可能使用平臺加密API時,如果不能使用,則使用可信任的第三方加密代碼。消費級敏感數據應該使用蘋果提供的API,將數據存儲在安全容器中。

少量數據,如用戶身份認證憑證、會話令牌等,可以安全的存儲在設備的Keychain內。(更多請看:Keychain Services Reference in Apple’s iOS Developer Library).

較大或一般類型的數據,蘋果的文件保護機制可以保證安全。(更多請看: NSData Class Reference for protection options).

爲了更好的保護靜態數據,可以使用第三方的加密API,這樣就可以不受蘋果加密的固有缺陷的限制(如:keying與用戶設備的四位數字PIN編碼綁定)。SQLcipher是一個免費可用的方案(更多請看:http://sqlcipher.net)。

敏感數據泄露 (M10)

各種敏感數據都能被iOS應用程序泄露。更可怕地是,每個應用程序編譯後的二進制代碼都可以被有能力的對手(攻擊者)實施逆向工程。

補充

所有必須保證私密的東西都不應放在移動設備上;最好將他們(如算法、專有/機密信息)存儲在服務器端。如果私密信息必須存儲在移動設備上,儘量將它們保存在進程內存中,如果一定要放在設備存儲上,就要做好保護。不要硬編碼或簡單的存儲密碼、會話令牌等機密數據。在發佈前,清理被編譯進二進制數據中的敏感信息,因爲編譯後的可執行文件仍然可以被逆向破解。

引用及推薦閱讀

OWASP Top 10 Mobile Risks presentation, Appsec USA, Minneapolis, MN, 23 Sept 2011. Jack Mannino, Mike Zusman, and Zach Lanier.

“iOS Security”, Apple, May 2012, http://images.apple.com/ipad/business/docs/iOS_Security_May12.pdf

“Deploying iPhone and iPad: Apple Configurator”, Apple, March 2012, http://images.apple.com/iphone/business/docs/iOS_Apple_Configurator_Mar12.pdf

“iPhone OS: Enterprise Deployment Guide”, Apple, 2010, http://manuals.info.apple.com/en_US/Enterprise_Deployment_Guide.pdf

“iPhone in Business”, Apple resources, http://www.apple.com/iphone/business/resources/

Apple iOS Developer website.

"iOS Application (in)Security", MDSec - May 2012, http://www.mdsec.co.uk/research/iOS_Application_Insecurity_wp_v1.0_final.pdf

作者與主編

Ken van Wyk ken[at]krvw.com

翻譯

G8dSnow [email protected]

英文原文地址:IOS Developer Cheat Sheet

[原文地址]

本文“IOS開發安全須知”,來自:Nuclear'Atk 網絡安全研究中心,本文地址:http://lcx.cc/?i=4094,轉載請註明作者及出處!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章