解析7.0.6更新的安全性漏洞 - iOS

Table of Contents

本文章只是想說明一下7.0.6到底更新了什麼

對實際更新的操作和效能沒有什麼幫助(汗)

當做知識看看就好XD


Apple最近發佈了iOS 7.0.6,更新內容只講了是有關SSL的安全性更新。乍聽
之下好像不是什麼嚴重的大更新。

但是在許多安全專家開始仔細研究後,發現其實Apple出了一個相當大的包,
影響非常之大,造成的原因卻又簡單的好笑。

首先我們要先了解什麼是SSL。SSL是網路連線的一種加密認證方式,普遍應
用在各大網站的登入系統來避免Man In The Middle攻擊。

舉例來說,你今天想要進行網路購物,你勢必要輸入你的信用卡號碼傳給網
站。所謂Man In The Middle攻擊,就是攻擊者假扮成你要購物的網站,從中
拿走了你的信用卡資料。然後為了不讓你察覺,他當然也會把這份資料送去
給真正的購物網站,拿到購物網站的回應後再傳回給你。這樣在你的眼中,
你還是正常的消費,但是信用卡資料卻已經神不知鬼不覺的被盜取了。同樣
的原理,你的email或者網路銀行的帳號密碼,都可以這樣被盜取。

所以SSL的存在就是為了阻止這件事情。你也許注意到許多網站在登入時你的
網址都會從http://變成https://,這就表示SSL已經啟動。SSL會認證跟你溝
通的對象,確定對方真的是他所宣稱的網站而不是攻擊者所偽裝的。背後的
原理就像是我們使用親筆簽名來確認是否為本人一樣,使用數位簽名來確認
對方的身分。

那Apple出了什麼包呢?基本上在過去的半年多,所有Apple的產品,SSL的認
證機制都是壞掉的。也就是如果你使用Apple的產品在公開的網路環境登入任
何網站,你的資料基本上相當容易被盜取。在過去幾個月也許知道這個漏洞
的人不多,所以也許沒有太多的攻擊事件,但是就在幾天前漏洞曝光,利用
此漏動的攻擊者將會大幅增加。

這邊有個測試網站,它會顯示你的瀏覽器是否受此漏洞影響:

https://gotofail.com

問題講完了 現在來講解決方案。iOS的使用者,請更新到7.0.6。已經JB的人
,evasi0n團隊已經更新了工具可以支援7.0.6,只要更新->重新JB->重新裝
回所有tweak,或者可以直接到Cydia安裝SSLPatch這個tweak

MacOSX的使用者...很抱歉Apple還沒有出更新檔...所以現在盡量避免使用公
共無線網路登入任何網站(特別是跟金錢相關的)...等到Apple有更新檔請第
一時間更新。(有個非官方的更新,但是不推薦)
Update: Apple已釋出10.9.2的OSX更新


好,現在來講講到底是什麼原因造成這種大漏洞的。說來好笑,只是因為某
份程式碼多了一行...

在C語言裡面,判斷是是這樣寫的:

if (條件)
{
條件成立要做的事情;
條件成立要做的另一件事情;

}

但是C又有另一個設計,就是如果要做的事情可以一行寫完,那可以不用寫那
兩個{},你可以寫成這樣:
if (條件)
一行就可以做完的事情;

但是如果你這樣寫,就要特別小心,像以下這種狀況:

if (條件)
第一件事情;
第二件事情;

這種狀況乍看之下跟前面的例子一樣,實際上只有第一件事情是條件符合才
會執行,第二件事情是無論如何都會被執行...因為只有if下面那行才跟條件
判斷有關係...

這就是Apple出的包,以下是它的程式碼:

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa,
SSLBuffer signedParams,
uint8_t *signature, UInt16
signatureLen)
{
...

if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail; <---- *** DANGER ***
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;

err = sslRawVerify(ctx,
ctx->peerPubKey,
dataToSign,
dataToSignLen,
signature,
signatureLen);
...
fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;

}

這段程式碼就是SSL在認證簽名用的,整個函數會檢查簽名是否為真然後回傳
檢查結果,傳回0就是正確,傳回非0就是錯誤。本來這段程式碼是沒有問題
的,每個判斷式會檢查一樣東西,認證成功會檢查下一樣東西,認證不成功
會跳到最下面的3行程式碼,此時err應該不會是0,所以整個函數回傳非0的
值,認證失敗。

問題是某處連續出現的兩個goto fail,只有第一個跟它上面的if有關,會考
慮條件判斷。後面那個goto fail不管怎麼樣都會被執行到!!! 也就是認證到
一半就跳到下面那三行程式碼,此時err當然是0,函數回傳了0,直接宣布認
證通過...

對,錯誤就是這麼簡單,多了一行goto fail,可以影響全世界不知道多少的
用戶,讓整個SSL認證機制完全無效,寫程式真的不能不小心啊…

最後,請記得更新你的系統。隨著Apple發表這個更新檔並且被挖出了相關漏
洞資訊,攻擊者會增加的非常快速。


--
◢███
◤ ◢◤
◢███ ◢██ ◢███
◢◤ ◢◤
◢███ ◢█ ◢███


--

All Comments

Tristan Cohan avatarTristan Cohan2014-02-27
很詳細的說明,推一下
Barb Cronin avatarBarb Cronin2014-03-02
XD
Joe avatarJoe2014-03-02
實用推
Rebecca avatarRebecca2014-03-02
實用推 看PTT長知識
Candice avatarCandice2014-03-03
推一個
Audriana avatarAudriana2014-03-06
如果都沒在用公用網路的人還要更新嗎? 都只用自己的3G跟
家裡的wifi
Sandy avatarSandy2014-03-06
好厲害!長知識了
Callum avatarCallum2014-03-11
推!
Lydia avatarLydia2014-03-15
專業推
Kyle avatarKyle2014-03-19
太專業了..
Lucy avatarLucy2014-03-19
長知識 推!!
Brianna avatarBrianna2014-03-20
這漏洞是大學生等級的吧XDDD
Elizabeth avatarElizabeth2014-03-24
專業又講得很淺顯易懂真不容易!謝謝好文長知識
Thomas avatarThomas2014-03-24
說明推!
Robert avatarRobert2014-03-29
不愧是i大..
Rae avatarRae2014-03-31
多學了一些
Lily avatarLily2014-04-02
專業推!
Yedda avatarYedda2014-04-02
話說為什麼會有ios的source code?
Lucy avatarLucy2014-04-07
原本iphone4留在ios5 不過一看到SSL漏洞就馬上升級了..
Quanna avatarQuanna2014-04-11
SSL漏洞是重大問題 除非手機完全不會輸入帳號密碼
Lily avatarLily2014-04-11
err初始給0? 應該不會吧@@
Ophelia avatarOphelia2014-04-13
本來不想更 但看到你這篇馬上更新....
Lily avatarLily2014-04-13
只能升成iOS7才有解嗎? 實在不想用那醜陋的介面....
Caroline avatarCaroline2014-04-16
iOS7哪會醜 我很喜歡
扁平化很可愛
Charlotte avatarCharlotte2014-04-17
推!終於清楚了
Frederica avatarFrederica2014-04-19
if迴圈就算只有一行我都習慣要{}以免發生這樣的情形
Andy avatarAndy2014-04-22
很多語言都有這樣的寫法~只是這種寫法常被當作厲害寫法
Anonymous avatarAnonymous2014-04-27
為了那一行要重新JB跟設定 好麻煩阿 ><
Annie avatarAnnie2014-04-27
專業大推
Frederica avatarFrederica2014-04-29
推推推
William avatarWilliam2014-05-03
太白癡了吧天啊
Zenobia avatarZenobia2014-05-08
CS學生推~
Lauren avatarLauren2014-05-11
如果是"過去半年多"的話 那受災戶應該只有iOS7吧?
iOS6"理論上"不必擔心這點
Annie avatarAnnie2014-05-14
專業推
Hazel avatarHazel2014-05-14
啊抱歉,應該是iOS6.0才不用擔心...6.1應該也有問題
Rebecca avatarRebecca2014-05-18
是只有iOS 7有這個漏洞嗎,iOS 6以前的呢?
Joseph avatarJoseph2014-05-19
專業給推!!!!!!
Hedy avatarHedy2014-05-23
蘋果的程式 都沒再審核嗎? 為何BUG會上架
Ida avatarIda2014-05-24
bug不是說找就找,寫程式最難也花最多實績的就是debug
時間
Daph Bay avatarDaph Bay2014-05-27
OSX10.9.2和iOS7.1全都還沒修補QQ
Faithe avatarFaithe2014-05-28
這樣子ios6也需要擔心嗎?
Ingrid avatarIngrid2014-05-29
快推 不然人家以為我看不懂
Doris avatarDoris2014-06-01
好詳細!
Todd Johnson avatarTodd Johnson2014-06-02
但我的iPod touch4最高只支援到iOS6 但這波的更新也釋出
屬於iOS6的新版本 所以iOS6也是有影響吧?
Gilbert avatarGilbert2014-06-05
寫程式不難,debug才煩
Ingrid avatarIngrid2014-06-10
iOS6 以上的才要跟新,有JB的去cydia下載SSLpatch就好了
Audriana avatarAudriana2014-06-14
沒JB的人就乖乖升級吧,除非你停在iOS 5以前的版本。
Edwina avatarEdwina2014-06-16
Apple有些程式碼是公開的: http://opensource.apple.com
Daniel avatarDaniel2014-06-17
這...
Una avatarUna2014-06-19
John avatarJohn2014-06-20
不推對不起自己
Lydia avatarLydia2014-06-22
Donna avatarDonna2014-06-23
太強大!
Audriana avatarAudriana2014-06-23
感謝 寫的淺顯易懂實在不容易
Ophelia avatarOphelia2014-06-27
超專業,看過一定要推的啊:))))
Ethan avatarEthan2014-07-01
ios 6.1.2飄過,裝了CYDIA的SSLPATCH後測試已安全
Tracy avatarTracy2014-07-05
專業推!
Robert avatarRobert2014-07-09
CS的推~
Harry avatarHarry2014-07-12
Skylar DavisLinda avatarSkylar DavisLinda2014-07-14
詳細推
Oliver avatarOliver2014-07-16
詳細推!
Edith avatarEdith2014-07-18
推!!
Franklin avatarFranklin2014-07-20
這該M吧
Jessica avatarJessica2014-07-22
謝謝詳細解說! iOS6.1.2裝了patch後測safe
Candice avatarCandice2014-07-22
所以做過的系統都要求 if後無論是否一行都得加{ }
Doris avatarDoris2014-07-26
goto fail if err= xxx; =>perl有這種更帥氣的一行if語法
Doris avatarDoris2014-07-29
推~~ 難怪iOS升上6.0之後, 就發生盜刷的新聞.
Susan avatarSusan2014-07-31
原來是這樣! 難怪之前一堆被盜
Candice avatarCandice2014-08-01
好蠢的漏洞= =果然習慣{}是對的
Jessica avatarJessica2014-08-02
每次接手那種省略{}的code都會先花時間人工format
就怕哪天多跳一行就出包了= =
Hedwig avatarHedwig2014-08-06
傻眼....
Faithe avatarFaithe2014-08-08
而且更麻煩的是bug有些還是照跑,不提示錯誤..這種要抓會
抓到天荒地老
Lucy avatarLucy2014-08-11
專業大推
Anonymous avatarAnonymous2014-08-13
慘了 pcman點了那個網址沒有出現"Safe." 其它都有Safe.
Anonymous avatarAnonymous2014-08-16
專業又淺顯易懂
Andy avatarAndy2014-08-16
專業大推 外行都懂
Ula avatarUla2014-08-17
專業推 XD
Linda avatarLinda2014-08-21
我覺得這種文章還是要持保留態度吧 第一蘋果怎麼可能讓他
Tristan Cohan avatarTristan Cohan2014-08-24
專業推!
Ula avatarUla2014-08-26
的加密機制source code給你知道 第二這種錯誤只有你會犯吧
Michael avatarMichael2014-08-26
你以為蘋果的工程師是大一新生嗎
Linda avatarLinda2014-08-31
不過我也很好奇,為啥原PO可以拿到SOURCE CODE?
Michael avatarMichael2014-09-01
http://www.wired.co.uk/news/archive/2014-02/24/gotofail
來源 還是被google的工程師爆掛的...
Daniel avatarDaniel2014-09-03
無知並不可怕,可怕的是不懂裝懂的那種...
Blanche avatarBlanche2014-09-05
專業推
Anthony avatarAnthony2014-09-06
蘋果工程師不是萬能的神ok 只要是軟體都會有bug
Dorothy avatarDorothy2014-09-07
厲害!!!!!!!
Isabella avatarIsabella2014-09-11
蘋果在軟體功能上跟google 差遠了
Valerie avatarValerie2014-09-11
上面都說Apple有open source了,是在噓什麼看不懂
Tracy avatarTracy2014-09-13
只要是人寫的程式都會有bug,尤其是錯在這種簡單的地
方才更容易讓人疏忽。只是內部沒有測出來也是蠻奇怪。
Erin avatarErin2014-09-14
有人的臉很腫
Elizabeth avatarElizabeth2014-09-16
快推 不然人家以為我看不懂
Quanna avatarQuanna2014-09-18
推一下
Charlotte avatarCharlotte2014-09-22
沒學過不懂就不懂。沒甚麼...不是每個人都萬能的。
Delia avatarDelia2014-09-24
就跟一格空白的悲劇一樣 本來rm -rf /usr/lib/.. 斷在r /間
Damian avatarDamian2014-09-24
專業推 蘋果快點推出 OSX 更新...
Callum avatarCallum2014-09-25
養成好習慣是很重要的:永遠使用中括號,一定要給預設值。
Heather avatarHeather2014-09-30
專業推!
Queena avatarQueena2014-10-01
Ios5沒有這個漏洞我上那網站測過了
因為這漏洞升級的喝喝了
Kama avatarKama2014-10-04
真的很誇張,在這之前根本不能想像會有這種紕漏
Christine avatarChristine2014-10-05
做網路交易,有https都有點提心吊膽,但為了方便還是
Lily avatarLily2014-10-10
沒辦法,何況是https之前竟然是無效的
Doris avatarDoris2014-10-12
1有用!推
Madame avatarMadame2014-10-16
iOS {3.1.3, 4.2.1, 5.1.1} 我都測過沒這問題。
Linda avatarLinda2014-10-19
iOS6還特地出了更新 所以是iOS6就開始出錯了?
Eartha avatarEartha2014-10-23
專業推!
John avatarJohn2014-10-25
專業推!!
Vanessa avatarVanessa2014-10-27
這真的是扯到爆...
Mason avatarMason2014-10-28
專業推!!!!!幸好更新了
Aaliyah avatarAaliyah2014-10-28
專業解說 好險看的懂
Skylar DavisLinda avatarSkylar DavisLinda2014-10-31
David avatarDavid2014-10-31
所以7.0.4 直接安裝大老闆源下的SSLPatch就能解決嗎?
Olga avatarOlga2014-11-01
這洞也太蠢XD
Tom avatarTom2014-11-03
去年PSO2的清空硬碟事件也是因為少打東西造成的...
Jacob avatarJacob2014-11-05
只能說這種程式漏洞防不勝防
Jacob avatarJacob2014-11-06
為何我安裝SSLPatch出現錯誤訊息? http://ppt.cc/T9jt
Selena avatarSelena2014-11-07
哪那麼好找?說的那麼簡單!另外感謝原po說明!
Frederica avatarFrederica2014-11-08
iOS 6.1.2 <網站檢測沒通過>
Adele avatarAdele2014-11-09
我寫if 都一定只寫一個判斷式XD 小嫩B都這樣 哈哈
Elizabeth avatarElizabeth2014-11-11
謝謝原po。長知識了
Suhail Hany avatarSuhail Hany2014-11-15
寫3層之後就開始昏了 要先喝口茶休息一下 XD
Edith avatarEdith2014-11-17
不過我看完怎覺得如果都是goto fail 那是什麼東西fail?
Candice avatarCandice2014-11-19
err應該是顯示錯誤的話 goto fail 那這樣不管是否err
Emily avatarEmily2014-11-23
→ Sunicer:養成好習慣是很重要的:永遠使用中括號 <- (?
Jacob avatarJacob2014-11-25
err必定存在 那err確定是認證嗎? 我怎看起來不像XD?
Iris avatarIris2014-11-30
Ivy avatarIvy2014-12-03
精華文章,讚
Hamiltion avatarHamiltion2014-12-05
William avatarWilliam2014-12-08
哇 有學有推 感恩
Enid avatarEnid2014-12-11
昨天還是前天有在八卦版看到有人分享
Ivy avatarIvy2014-12-12
我用iPhone4 5.1.1測gotofail是Safe 所以5.1.1是OK的? 不用升?
Puput avatarPuput2014-12-16
難怪這次更新apple這麼積極!以往更新只會跳出一次通知,這
次一直跳出訊息,超煩der
Oscar avatarOscar2014-12-17
推推 長知識
Ina avatarIna2014-12-22
ㄣㄣ跟我想的差不多
George avatarGeorge2014-12-24
推專業和大氣度!
George avatarGeorge2014-12-27
iOS6測出漏洞 我更新就安全了
Emma avatarEmma2014-12-28
太實用了上站一推
Genevieve avatarGenevieve2014-12-28
寫程式的工作真的不是常人可幹的....
Lydia avatarLydia2015-01-02
厲害 推
David avatarDavid2015-01-04
這篇好專業! 大推!
Ula avatarUla2015-01-06
好文長知識
Emma avatarEmma2015-01-11
推!
David avatarDavid2015-01-14
想起那些寫程式的日子~ 專業推!!
Annie avatarAnnie2015-01-15
高三正學C語言中 嗚嗚..好像很難
Blanche avatarBlanche2015-01-20
長知識推
Audriana avatarAudriana2015-01-23
有夠專業!
Megan avatarMegan2015-01-27
Zenobia avatarZenobia2015-01-31
講解真詳細~推
Megan avatarMegan2015-02-03
感謝喔 我目前還沒碰到ssl認證加密的問題XD
Sandy avatarSandy2015-02-03
這樣說我就懂了XD ios真是很常用判斷式來確認 感謝~~
Rebecca avatarRebecca2015-02-03
厲害 這回真的是"專業"問題了XDD
Tracy avatarTracy2015-02-04
6.1.3, 用safari點測試網頁不安全,用puffin卻安全?
Tracy avatarTracy2015-02-04
這種錯誤實在有一點扯
Bethany avatarBethany2015-02-06
推文看到有人說10.6也有更新,請問有辦法只更新到10.6嗎?
Skylar Davis avatarSkylar Davis2015-02-09
我怕更新到10.7跑不動...
Olivia avatarOlivia2015-02-14
筆誤..上面說的是ios6及ios7
Tristan Cohan avatarTristan Cohan2015-02-16
這漏洞八成是git auto merge造成的 因為行數不對mer成兩行
乖小孩記得即使if內容只有一行也要加大括號喔
Iris avatarIris2015-02-17
好文 推!
Delia avatarDelia2015-02-21
專業推!
Lucy avatarLucy2015-02-22
checkpatch.pl不會讓有括號的一行if進到kernel裡的
所以對大神來說亂加括號真的很醜
Hardy avatarHardy2015-02-22
3GS可以只更新到6.1.6 不然你可以JB然後裝Patch XD
usoko說的沒錯 這八成是merge出來的 沒有人會自己這樣寫...
Ivy avatarIvy2015-02-24
專業推!之前gmail的確有被盜用,還是更新較心!謝謝解
惑!
Elma avatarElma2015-02-28
Man in midle 引用錯誤
Carol avatarCarol2015-03-05
Man in middle SSL 根本防不了。
Ingrid avatarIngrid2015-03-09
Key 被拿走了 還是可以被 sniffer
John avatarJohn2015-03-12
尤其是不小心吃了偽CA
Isabella avatarIsabella2015-03-16
另外,我先前說的 SSL 完全防不了,是我的錯誤。
Tristan Cohan avatarTristan Cohan2015-03-20
專業
Eartha avatarEartha2015-03-22
長知識推!
Anthony avatarAnthony2015-03-25