聽說 iPhone 都中病毒了,到底發生了什麼?危害大嗎?
相關新聞XCode 編譯器里有鬼——XCodeGhost 樣本分析說說 XcodeGhost 這個事
簡悅雲風,程序員 遊戲玩家 愛攀岩
(知乎日報註:本文發表於雲風的 BLOG,版權歸原作者雲風所有,知乎日報獲授權轉載。)
最近XcodeGhost這個事挺火的,簡單說就是有人在Xcode里植入了木馬,讓用這個被修改過的Xcode編譯出來的iOSApp都被插入了一些代碼。由於Xcode幾乎是生成iOSApp的唯一手段,且國內的同學各種壞習慣早就根植在基因里了,導致了這份被種馬的Xcode在最近半年裡廣泛傳播,污染了一大批國產App。
我這裡就不提那些中招的所謂大廠了,即便是大廠,有安全常識的人還是少之又少、反而是所謂大廠因為管理更困難(好多大廠到管事的那級的人更跟不上知識更新),犯安全錯誤的機會就更大。
這種從非官方渠道下載軟體使用而中招的事情又不是第一次了。上次PuTTY被種後門的事情過了也沒多久,好了瘡疤忘了痛,對吧。
種馬的手法其實也不新鮮。有點年紀的程序員讀書時,課本上一定教過:計算機病毒有四種形式,最後一種就叫源碼病毒,感染附著在編譯器中。只是估計很少人見過,後來課本就刪掉了。其實呢,這個說法的源頭是KenThompson在1984年圖靈獎演說上提到過的惡作劇。老實說TheKenThompsonHack的手法比這個高明的多。
XcodeGhost的技術細節就不分析了,網上一搜一大堆。我想說的是這次這個東西危害問題。
這玩意有沒有害?當然有。你以你名義發布的程序被人插入了一段你不知道是什麼的代碼,當然有危害。因為用戶信任你才用你的App,你也不希望用戶的信息被不知道什麼人獲取。因為理論上,你的App可以了解的信息,這段代碼都可以得到。一旦你在Apple的賬號系統之外又自建了用戶系統,那麼這個第三方(你自建的)系統的安全性一定出現了漏洞。
這也是蘋果從來都不贊成第三方App自己搞一套生態的原因之一。你沒有系統級的許可權,本身就在安全性上打了折扣。
但是,你的Apple(iCloud)ID及其密碼到底面臨多大威脅?我認為危險是完全可控的。
首先:在iOS系統中,iCloud密碼是很高優先順序的東西,iOS設計人員再傻也知道要重點保護它。所以,如果通過正常的渠道,在iOS中輸入密碼,即使是通過被感染的App,也是不可能通過程序獲取到iCloud密碼的。唯一的手段是模擬一個輸入密碼的對話框引誘用戶輸入密碼來釣魚。
但iOS是如何從設計上去解決被釣魚的安全問題呢?
沒錯,App可以自己畫出任何外貌的對話框,用戶無從分辨是App畫出來的還是系統畫出來的。但有一點可以提供安全保護。那就是iCloudID本身在iOS中同樣是高安全級別的信息,和密碼一樣,禁止App獲取。所以你注意到沒有,沒當你使用iOS的時候,系統要求你輸入iCloud密碼,對話框上都會寫明需要登錄的iCloudID是什麼。而不會讓你在那裡去輸入iCloudID。唯一可能要求你輸入iCloudID的地方就是AppStore,在別的App,哪怕是蘋果自己的App里都不會做此輸入要求。這賦予了用戶分辨釣魚對話框的能力。
一旦有對話框要求你輸入iCloudID時,你都應該警惕是不是釣魚。作為這種反常的輸入要求,你可以回憶一下最近半年有沒有遇到過,如果不確定,還是把iCloud的二步驗證打開好了。
說到這裡,微博上有同學就此反駁說,不是所有人都有這個安全意識,尤其是中老年用戶。我想說,就我認識的同學的父母,更多的把iCloudID是什麼都忘記了,哪裡談得到輸入。幾乎iPhone / iPad交到他們手上後,他們就沒有接觸過iCloudID的概念,能記得密碼就不錯了。
用戶自己的安全當然總有一部分是靠自己的,如果系統讓你輸入啥你就輸入啥,還用的著騙你的iCloudID嗎?直接偽造一個支付界面,讓你輸入銀行賬號密碼不是更直接。這,就是為什麼蘋果系統不讓App自己搞支付介面的重要安全考慮之一了。
我更想吐槽的是,國內安卓平台的搞法,各個App都把支付平台用SDK接入到自己的程序里的方法,根本就是作死。別說釣魚了(畫一個一摸一樣的界面還不容易?),同一進程下,即使SDK不是你寫的代碼,你也有一萬種方法知道那些輸入框里輸入了些啥。沒有沙盒隔離,不在獨立進程去做支付,是無法從根本上解決安全問題的。
P.S.:對比看看國內各個支付平台的設計。有幾個是把保護用戶賬號名作為安全設計點的?國內做平台設計的人的安全常識可見一斑。
-----
今天,有人在微博上聲稱自己是XcodeGhost的作者,並坦言除了植入廣告,並沒有做什麼特別有危害的事情。收集的信息僅限於作為普通App人人都可以收集到的。有同學核對了開源的代碼,和之前逆向工程的結果做比對,認為比較可信。
我對此結論基本相信,雖有少部分說法保持懷疑,但我相信即使我用過那些被感染的App,我對自己的iCloud賬號的安全還是信任的。我在微博上是這樣評價的:
對於XcodeGhost這事,我想說,你的App不過被人插入了幾行不是你寫的代碼發布到了AppStore而已,能不能幹壞事要看iOS的安全機制;當你接入騰訊SDK等類似代碼時,成噸的不知道是啥的代碼被插入你咋就不擔心呢?相比之前360App利用漏洞去躲避蘋果審核那些私有API調用,這次安全得多啦。
為什麼我要把被感染Xcode植入代碼和接入第三方 SDK相提並論?那就是因為AppStore本給了用戶你最後一道信任防線,由它來證明App是誰開發的,而你來最終決定是否信任。而國內渠道要求亂接SDK的風氣,早就破壞了這道防線。你用的所有國產App里都有可能嵌入了不是他家開發的代碼。
這次被插入的代碼,即使沒有公開源碼,規模也很小,很容易逆向分析。
安全不能全寄托在開發者的素質上,無論是有意還是無心還是過錯,都有可能插入非用戶期望的代碼。這個信任最多是一個安全環節,前面還有蘋果商店的審核、iOS系統的沙盒等多個關卡。
P.S.:不用SDK的話,正確的做法是什麼?第三方平台提供接入手冊,告訴接入方用什麼協議去跳轉到相關App里去認證。如果用戶沒有裝你的App ,就應該打開系統的瀏覽器做web授權。
-----
說起蘋果商店的審核制度,沒有技術背景的同學總覺得這事或多或少要怪蘋果審核不力。這是個嚴重的誤解。蘋果審核沒有能力去靠靜態分析,和有限的人力去了解一個App到底能幹什麼時候,會彈什麼窗口。就算你拿源代碼去審核他們也辦不到。
蘋果審核只能確定你的App調用了哪些系統API,這些被允許調用的API是被安全認證過的,基本不會逃逸出沙盒去獲取非法信息。這就是為什麼蘋果要在iOS上禁止JIT,禁止動態載入原生代碼的原因。一旦允許JIT或動態載入原生代碼(你可以過審後從網上下載一段未被審核的代碼運行),App就可以在運行時調用那些被禁止的API。
當然,審核並不是iOS最後的安全手段,最關鍵還是iOS自身的沙盒隔離。審核只是多做一層防護,相當於開個白名單,減少沙盒的安全漏洞被利用的可能性。至於沙盒這最後一道(也是最重要的)防線,就要求用戶你不要去搞什麼越獄啦。
-----
昨天,有同學給過我一個鏈接,說其實未越獄的iPhone也可以被釣魚。
在非越獄的iPhone6(iOS8.1.3)上進行釣魚攻擊(盜取AppStore密碼)其中的截圖還被人危言聳聽的拿出去作為這次XcodeGhost可以被用於釣魚的證據。
其實無論你有沒有特別的技術背景,只要中文理解能力夠,就可以讀懂上文中的技術重點。
它其實說的是一個漏洞讓程序可以後台講對話框彈到別的應用里。但這裡有一個重要的前提條件:安裝釣魚App到目標設備。在這個漏洞還存在時,這個釣魚App也無法逃過蘋果審核的靜態分析一關。
另外,釣魚成功還依賴釣魚者知道用戶的AppleID,而這點目前依舊無法辦到。讓我們看看文中提到的非法獲取AppleID的CVE-2014-4423的簡單分析。我們可以知道幾點信息:首先,這個安全漏洞在iOS8就補上了,其次,利用這個漏洞需要調用私有API,依然是過不了蘋果審核的。
這些都不可能用於目前的XcodeGhost。這正說明了,iOS的層層安全措施有效且必要。
無論如何,作為一個中國人,若想盡量保障自己的隱私安全,加強安全意識還是非常重要的。選用安全的操作系統,勤快地升級,小心選擇不會被社工的密碼,且保護好你的賬戶名。
推薦閱讀:
※iPhone 7 沒懸念了,還是想想如何拯救手中的 iPhone 6 吧。
※iPhone內存清理死角,四招徹底釋放5G空間!
※蘋果官網悼念喬布斯 暫停iPhone4S宣傳
※iPhone 將支持 PD 快充和雙卡雙待?良心發現?
※你可能不知道,iPhone 計算器原來這麼好用|有輕功