鍍金池/ 教程/ iOS/ 為什么今天安全仍然重要
與四軸無人機的通訊
在沙盒中編寫腳本
結(jié)構(gòu)體和值類型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動開發(fā)
Collection View 動畫
截圖測試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進的自動布局工具箱
動畫
為 iOS 7 重新設(shè)計 App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動畫解釋
響應(yīng)式 Android 應(yīng)用
初識 TextKit
客戶端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項目介紹
Swift 的強大之處
測試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計優(yōu)雅的移動游戲
繪制像素到屏幕上
相機與照片
音頻 API 一覽
交互式動畫
常見的后臺實踐
糟糕的測試
避免濫用單例
數(shù)據(jù)模型和模型對象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場
照片框架
響應(yīng)式視圖
Square Register 中的擴張
DTrace
基礎(chǔ)集合類
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計的藝術(shù)
導(dǎo)航應(yīng)用
線程安全類的設(shè)計
置換測試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無人機項目
Mach-O 可執(zhí)行文件
UI 測試
值對象
活動追蹤
依賴注入
Swift
項目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測試 View Controllers
訪談
收據(jù)驗證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場
游戲
調(diào)試核對清單
View Controller 容器
學(xué)無止境
XCTest 測試實戰(zhàn)
iOS 7
Layer 中自定義屬性的動畫
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺
Artsy
照片擴展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫支持
Fetch 請求
導(dǎo)入大數(shù)據(jù)集
iOS 開發(fā)者的 Android 第一課
iOS 上的相機捕捉
語言標簽
同步案例學(xué)習(xí)
依賴注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識別
玩轉(zhuǎn)字符串
相機工作原理
Build 過程

為什么今天安全仍然重要

在寫這篇文章的時候,系統(tǒng)管理員們正忙于確保自己的網(wǎng)絡(luò)足以應(yīng)對 CVE-2014-6271,也就是所謂的 “Shellshock” 漏洞。攻擊報告表明通過漏洞可以獲得 bash shell 的權(quán)限,從而使攻擊者可以控制其運行某些功能。而 bash shell 廣泛存在在大多數(shù) Linux 以及 OS X 甚至是 iOS 系統(tǒng)中(雖然大部分人都不太可能使用它)。實際上,人們從上世紀 60 年代開始設(shè)計相容分時系統(tǒng)(CTTS)時就已經(jīng)開始考慮安全性了,但為何到現(xiàn)在這個問題都沒有解決?為什么軟件系統(tǒng)仍有安全問題?又是為什么我們應(yīng)用開發(fā)者被告誡必須在安全上有所行動?

我們所了解的已經(jīng)變化

CTSS 所面臨的最大挑戰(zhàn)是允許多用戶訪問同一臺計算機而互不干擾,這也影響了之后系統(tǒng)的架構(gòu)設(shè)計,其中也包括衍生了 OS X 和 iOS 的 UNIX 系統(tǒng)。解決的辦法是,每個用戶在一個仿佛是真實電腦的環(huán)境中獨立運行任務(wù),但實際上卻使用的是共享計算機生成的一個沙箱。

當一個用戶需要大量資源,這一解決方案應(yīng)避免對其他用戶的資源產(chǎn)生不利影響。而這個方案也導(dǎo)致了擁有配額資源的多用戶賬戶以及賬戶管理系統(tǒng)的出現(xiàn)。這種想法頗為有效:在 2006 年,我使用了這個系統(tǒng),讓超過 1000 名用戶訪問了共享的 OS X 電腦。

不幸的是,當初對這個問題的看法并不完整。那些防止某個賬號去使用分配給其他賬號的資源的技術(shù)手段,往往并不能防止某個用戶使用分配給其他用戶的資源。如果一個用戶可以獲得其他賬戶的權(quán)限,或者能說服其他用戶運行自己的程序的話,那賬戶和權(quán)限系統(tǒng)將可以被規(guī)避。這也是 Shellshock 漏洞所暴露的問題的根源:攻擊者可以獲得受害者的權(quán)限和資源來運行自己的程序。

問題也已經(jīng)變化

從 UNIX 設(shè)計的時代開始,計算機就開始變得更小、更快和更容易連接。越來越多的情況是當初軟件創(chuàng)建時所沒有預(yù)見到的。當電子郵件的所有用戶都在同一所大學(xué),且所有終端都歸大學(xué)所有時,作為一個有效且公開的純文本系統(tǒng),它能良好的運行。但是當它要支持來自不同組織、不同地點甚至不同網(wǎng)絡(luò)的人進行溝通時,就需要不一樣的解決方案了。

在某種程度上,iOS 仍然算是一個多用戶系統(tǒng)。與 UNIX 設(shè)計的環(huán)境不同,iOS 所有用戶訪問的賬號和手機持有者所操作的賬號是同一個。所有這些用戶都是手機賬號的持有者,他們包括:你、我、手機上所裝應(yīng)用的開發(fā)者以及蘋果。

這的確有點過于簡單粗暴,畢竟許多應(yīng)用的功能不止局限于開發(fā)者提交到應(yīng)用商店的那些。SDK、遠程分析服務(wù)以及開源組件意味著許多應(yīng)用中實際上包含了來自多個機構(gòu)的源碼,并且必須通過網(wǎng)絡(luò)進行通信就有潛在被監(jiān)視的風(fēng)險。游戲規(guī)則已經(jīng)不再是保護不同的人彼此使用同一臺計算機,而是保證同一個人的不同任務(wù)不會互相干擾。

這些聽起來挺糟糕的,就好像有點輕微的偏執(zhí)狂癥狀?,F(xiàn)實情況是,安全能夠成為推動力量,因為它減少了在新的場景和過程中的風(fēng)險,為人們進入更廣闊的空間提供了可能。想象一下如果沒有使用密碼學(xué),移動銀行業(yè)務(wù)將會增加多少風(fēng)險,而又會有多少人(甚至包括銀行)愿意開展這項業(yè)務(wù)。

...但是也有一些事情依然沒變

UNIX 仍然與現(xiàn)代的軟件安全討論息息相關(guān)的唯一原因是,我們?nèi)匀粵]有擺脫這個系統(tǒng),這主要是因為我們從來都沒有嘗試過。計算的歷史充滿了這樣的例子,明明有些系統(tǒng)已經(jīng)暴露出重大的安全問題,但它依然在使用,因為這個行業(yè)在清理自己爛攤子方面集體都表現(xiàn)得很差。即使是最新版本的 iOS,擁有最新的工具和最新的編程語言,我們在其中所調(diào)用的方法,例如 C 語言的字符串庫,也被認為在幾十年前就需要被重構(gòu)。

在軟件系統(tǒng)的演變史中,補丁一直存在。接受不完整的技術(shù)有利于定位已發(fā)現(xiàn)的問題。雖然我們喜歡聲稱我們發(fā)明了未來,而實際上,我們花費了大量時間和資源來堅守過去。當然,也許更換這些系統(tǒng)也會引入許多我們已經(jīng)修復(fù)的問題。

蘋果不能解決我們的問題

蘋果告訴我們每一個版本的 iOS 都比過去更安全,甚至公布了一份系統(tǒng)安全特性細則的白皮書。在其中蘋果介紹它如何使用了不斷更新的(希望是更加先進的)加密算法和協(xié)議,更健壯的鑒定表單以及其他技術(shù)。為什么這樣還是不夠?

操作系統(tǒng)只能提供適用任意應(yīng)用的安全特性;但不能提供你的應(yīng)用所需的一切。雖然蘋果能告訴你,你的 app 連接到了一個提供了一些有效身份證明的服務(wù)器,但它不能告訴你這是否是一個值得你信任的身份。

蘋果可以提供文件保護來加密你的數(shù)據(jù),并且在收到請求時解鎖。但它不會告訴你什么時候可以進行這樣的請求。

蘋果可以限制應(yīng)用之間的溝通方式,使得數(shù)據(jù)只能在受控的方式如 URL scheme 中進行。蘋果既不能決定哪個級別的控制適合你的應(yīng)用,也不能告訴你你的應(yīng)用應(yīng)該接受什么形式的數(shù)據(jù),以及什么形式的數(shù)據(jù)是不合適的。

你不能不管(至少不能完全不管)

和操作系統(tǒng)的特性相似,移動應(yīng)用程序漏洞排行榜能告訴你哪些問題是許多應(yīng)用都遇到的,但卻不能告訴你具體哪些和你的應(yīng)用相關(guān),以及它們是如何暴露的。它們也絕對不會告訴你當你的用戶使用你的應(yīng)用程序時漏洞被利用的詳細情況---漏洞從執(zhí)行的任務(wù)、上下文和環(huán)境中產(chǎn)生并且隨著用戶操作的過程中浮現(xiàn)出來。

安全是你應(yīng)用程序架構(gòu)的一部分:它是一個約束集合,你必須像顧慮 app 的響應(yīng)時間、客戶群的規(guī)?;蛘呤峭獠肯到y(tǒng)的兼容性那樣來考慮安全的問題。這意味著你必須將安全模塊設(shè)計到你的應(yīng)用中,就像你設(shè)計應(yīng)用時遵循的其他約束條件一樣。

一個評估應(yīng)用安全常用的設(shè)計技巧是風(fēng)險建模 :找到黑客們想要攻擊你系統(tǒng)的原因,查出他們在使用現(xiàn)有的資源下的攻擊方式,以及探索在系統(tǒng)設(shè)計中的可能被成功攻擊的漏洞。

即便你已經(jīng)確定了漏洞,還是要使用許多方法來應(yīng)對。拿個現(xiàn)實生活中的例子打比方,假設(shè)你正打算確定假期行程,但在這周你老板仍有需要你保持聯(lián)系甚至隨時準備出現(xiàn)在辦公室以應(yīng)對緊急情況的可能性。你可以做如下應(yīng)對:

  • 接受風(fēng)險 - 無論如何仍然預(yù)定酒店機票之類的假期行程,但隨時接受你可能去不了的風(fēng)險。
  • 避免風(fēng)險 - 辭掉工作,這樣你絕對不會被電話騷擾。
  • 對風(fēng)險作出反應(yīng) - 風(fēng)險發(fā)生的時候試著馬上解決它,而不是提前回避它。
  • 轉(zhuǎn)移風(fēng)險 - 為你的假期購買保險,如果它因為接到電話而結(jié)束,你可以重新安排一個假期或者獲得退款。
  • 放棄行動 - 放棄度假的想法。

所有這些可能性也都可以在軟件安全中使用。你可以選擇一個或者結(jié)合多個方法。我們的目標通常是不是規(guī)避風(fēng)險,而是減輕風(fēng)險。風(fēng)險減輕到多少是合理的?這取決于你、你的公司、你的客戶和你的合作伙伴能夠接受剩余多少風(fēng)險。

你緩解風(fēng)險的技術(shù)同樣取決于你的目標:當你可以引入任何安全對策時你想要達到什么目標?你們是要保護客戶隱私、保證服務(wù)的持續(xù)可用性還是只要遵循相應(yīng)的法律?如果這些目標沖突,你需要比較它們的優(yōu)先級。你的決定可能取決于具體情況,這未必是你能提前設(shè)計出來的。建立充足的應(yīng)急預(yù)案能讓大家在再次發(fā)生不好的事的時候知道應(yīng)該如何處理就好。

結(jié)論

盡管軟件安全技術(shù)和系統(tǒng)(比如 iOS)的安全保障能力一直在進步和創(chuàng)新,但風(fēng)險分析和設(shè)計安全對策依然是應(yīng)用開發(fā)者們的責(zé)任。那些使用我們應(yīng)用時所產(chǎn)生的風(fēng)險是不可能通過操作系統(tǒng)供應(yīng)商或者框架開發(fā)人員解決的。這些風(fēng)險是由應(yīng)用所提供給用戶的功能,或者在應(yīng)用部署的環(huán)境或系統(tǒng)中所產(chǎn)生的。

蘋果用 iOS SDK 中的安全和加密功能幫助我們找到了水源。而喝水的事情,得靠我們自己。