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]
原文地址:
https://www.owasp.org/index.php/IOS_Developer_Cheat_Sheet
相關文章
- [譯] 新手開發者須知2018-09-28
- 整理:iOS開發知識點2020-06-17iOS
- iOS開發如何避免安全隱患2019-07-29iOS
- BAT面試須知:Java開發的招聘標準2018-09-07BAT面試Java
- iOS上開發的一個安全鍵盤2018-03-14iOS
- 多執行緒安全-iOS開發注意咯!2019-05-06執行緒iOS
- 多執行緒安全-iOS開發注意咯!!!2019-05-06執行緒iOS
- iOS開發基礎109-網路安全2024-07-17iOS
- iOS 開發:『Runtime』詳解(一)基礎知識2019-07-02iOS
- Web前端開發工程師必須瞭解的HTTP知識2018-10-11Web前端工程師HTTP
- 零程式設計開發資料視覺化大屏須知2023-10-09程式設計視覺化
- 使用 Flutter 開發知識小集 iOS/Android 客戶端2018-05-16FlutteriOSAndroid客戶端
- iOS開發·runtime原理與實踐: 基本知識篇2019-10-14iOS
- 安全開發規範:開發人員必須瞭解開發安全規範(一)(涉及安全問題,以及解決方法和程式碼實現)2019-08-29
- iOS 開發2019-06-11iOS
- 值得注意的安全開發知識總結2019-08-28
- 做iOS自動化測試必須知道的一些知識2021-08-23iOS
- iOS開發基礎——執行緒安全(執行緒鎖)2019-02-19iOS執行緒
- 玩轉iOS開發:iOS中的NSOperation開發(一)2019-02-20iOS
- iOS開發:UIAlertView2020-04-06iOSUIView
- iOS 開發薪水2020-04-07iOS
- iOS開發- RunLoop2024-07-26iOSOOP
- iOS開發-UIButton2024-07-05iOSUI
- iOS開發-MVC2024-10-28iOSMVC
- 前端須知的 Cookie 知識小結2019-05-10前端Cookie
- 前端工程師須知的CORS知識2019-04-20前端工程師CORS
- Git 行尾設定須知2023-11-08Git
- Swoole 程式設計須知2022-06-23程式設計
- 直播平臺開發難嗎?自己開發須謹慎2019-06-11
- iOS開發之FuckingBlockSyntax!2018-08-15iOSBloC
- iOS 開發加密做法2020-04-07iOS加密
- Flutter混合開發-iOS2020-04-18FlutteriOS
- iOS藍芽開發2019-05-08iOS藍芽
- iOS開發框架--SDWebImage2024-10-23iOS框架Web
- iOS開發框架--AFNetwork2024-10-24iOS框架
- iOS開發框架--MyLayout2024-10-20iOS框架
- iOS開發小tip2018-04-17iOS
- iOS開發-手勢2024-07-08iOS