作者iPluto (鍵盤Apple Genius)
看板iPhone
標題[情報] 解析7.0.6更新的安全性漏洞
時間Tue Feb 25 12:22:57 2014
本文章只是想說明一下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發表這個更新檔並且被挖出了相關漏
洞資訊,攻擊者會增加的非常快速。
--
◢◤ ◢███◤ ◢◤
◤
◢◤ ◢◤◤
◢◤◤
◢◤
◢◤ ◢███◤◤
◢◤◤
◢◤ ◢◤ ◢██◤ ◢███◤
◢◤◤
◢◤ ◤
◢◤◤
◢◤◤
◢◤◤
◢◤◤◤
◢◤◤◢◤◤
◢◤◤
◢◤◤
◢◤◤
◢███◤◤
◢█◤ ◢███◤◤
◤
◤
◤
◤
◤
◤
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 76.94.199.254
1F:推 bojack:很詳細的說明,推一下 02/25 12:25
2F:推 scottiting:XD 02/25 12:26
3F:推 b701217:實用推 02/25 12:30
4F:推 Schwarztee:實用推 看PTT長知識 02/25 12:32
5F:推 emptylife3:推一個 02/25 12:32
6F:推 an138:如果都沒在用公用網路的人還要更新嗎? 都只用自己的3G跟 02/25 12:35
7F:→ an138:家裡的wifi 02/25 12:35
8F:推 stussy0716:好厲害!長知識了 02/25 12:36
9F:推 BlackSeven:推! 02/25 12:36
10F:推 mihonisizumi:專業推 02/25 12:37
11F:推 joe3477:太專業了.. 02/25 12:42
12F:推 sampo1125:長知識 推!! 02/25 12:46
13F:推 JamesChen:這漏洞是大學生等級的吧XDDD 02/25 12:47
14F:推 zx09192939:專業又講得很淺顯易懂真不容易!謝謝好文長知識 02/25 12:48
15F:推 mova:說明推! 02/25 12:52
16F:推 song042008:不愧是i大.. 02/25 12:54
17F:推 hopeltw:多學了一些 02/25 12:55
18F:→ jump0319:專業推! 02/25 12:59
19F:→ neverfly:話說為什麼會有ios的source code? 02/25 13:00
20F:推 Shigeru777:原本iphone4留在ios5 不過一看到SSL漏洞就馬上升級了.. 02/25 13:03
21F:推 artiller:SSL漏洞是重大問題 除非手機完全不會輸入帳號密碼 02/25 13:06
22F:推 Vett:err初始給0? 應該不會吧@@ 02/25 13:06
23F:→ LoLoLuan:本來不想更 但看到你這篇馬上更新.... 02/25 13:06
24F:→ zoex:只能升成iOS7才有解嗎? 實在不想用那醜陋的介面.... 02/25 13:06
25F:推 LoLoLuan:iOS7哪會醜 我很喜歡 02/25 13:08
26F:→ LoLoLuan:扁平化很可愛 02/25 13:08
27F:推 ingrid0815:推!終於清楚了 02/25 13:09
28F:→ k078787878:if迴圈就算只有一行我都習慣要{}以免發生這樣的情形 02/25 13:12
29F:→ swpoker:很多語言都有這樣的寫法~只是這種寫法常被當作厲害寫法 02/25 13:14
30F:推 Crackhead:為了那一行要重新JB跟設定 好麻煩阿 >< 02/25 13:14
31F:推 sosoing:專業大推 02/25 13:15
32F:推 aloha888:推推推 02/25 13:16
33F:推 ohhahaha:太白癡了吧天啊 02/25 13:21
34F:推 kevinlee810:CS學生推~ 02/25 13:22
35F:推 rockmanx52:如果是"過去半年多"的話 那受災戶應該只有iOS7吧? 02/25 13:30
36F:→ rockmanx52:iOS6"理論上"不必擔心這點 02/25 13:30
37F:推 uarenotalone:專業推 02/25 13:30
38F:→ rockmanx52:啊抱歉,應該是iOS6.0才不用擔心...6.1應該也有問題 02/25 13:31
39F:推 s111121:是只有iOS 7有這個漏洞嗎,iOS 6以前的呢? 02/25 13:33
40F:推 mars1396:專業給推!!!!!! 02/25 13:34
41F:推 sysop5566: 蘋果的程式 都沒再審核嗎? 為何BUG會上架 02/25 13:35
42F:推 wavel:bug不是說找就找,寫程式最難也花最多實績的就是debug 02/25 13:38
43F:→ wavel: 時間 02/25 13:38
44F:→ willychn33:OSX10.9.2和iOS7.1全都還沒修補QQ 02/25 13:40
45F:推 jump0319:這樣子ios6也需要擔心嗎? 02/25 13:40
46F:推 SkLc:快推 不然人家以為我看不懂 02/25 13:48
47F:推 hisky:好詳細! 02/25 13:48
48F:推 shinichi:但我的iPod touch4最高只支援到iOS6 但這波的更新也釋出 02/25 13:50
49F:→ shinichi:屬於iOS6的新版本 所以iOS6也是有影響吧? 02/25 13:50
50F:推 memo5215:寫程式不難,debug才煩 02/25 13:52
52F:推 Neymar:iOS6 以上的才要跟新,有JB的去cydia下載SSLpatch就好了 02/25 13:59
53F:推 Neymar:沒JB的人就乖乖升級吧,除非你停在iOS 5以前的版本。 02/25 14:02
55F:推 kobe8112:這... 02/25 14:22
56F:推 s605152002:猛 02/25 14:23
57F:推 victoryss:不推對不起自己 02/25 14:35
58F:推 SiePtt:推 02/25 14:41
59F:推 jackjack135:太強大! 02/25 14:43
60F:推 lingchen:感謝 寫的淺顯易懂實在不容易 02/25 14:48
61F:推 jca:超專業,看過一定要推的啊:)))) 02/25 14:53
62F:推 SOMEGOOD:ios 6.1.2飄過,裝了CYDIA的SSLPATCH後測試已安全 02/25 14:56
63F:推 boys5566:專業推! 02/25 14:59
64F:推 daniel414:CS的推~ 02/25 15:05
65F:推 robin2503:推 02/25 15:06
66F:推 HuMirage:詳細推 02/25 15:16
67F:推 PLASBOT:詳細推! 02/25 15:18
68F:推 SuperShangXD:推!! 02/25 15:19
69F:推 NagoyaOsaka:這該M吧 02/25 15:28
70F:推 chunptt:謝謝詳細解說! iOS6.1.2裝了patch後測safe 02/25 15:40
71F:推 ckstorm:所以做過的系統都要求 if後無論是否一行都得加{ } 02/25 16:00
72F:→ neverfly:goto fail if err= xxx; =>perl有這種更帥氣的一行if語法 02/25 16:06
73F:推 Preaz:推~~ 難怪iOS升上6.0之後, 就發生盜刷的新聞. 02/25 16:13
74F:推 seraph01:原來是這樣! 難怪之前一堆被盜 02/25 16:16
75F:推 KawasumiMai:好蠢的漏洞= =果然習慣{}是對的 02/25 16:24
76F:→ KawasumiMai:每次接手那種省略{}的code都會先花時間人工format 02/25 16:25
77F:→ KawasumiMai:就怕哪天多跳一行就出包了= = 02/25 16:25
78F:推 LBJ23K:傻眼.... 02/25 16:28
79F:推 mixbqw:而且更麻煩的是bug有些還是照跑,不提示錯誤..這種要抓會 02/25 16:29
80F:→ mixbqw:抓到天荒地老 02/25 16:29
81F:推 horseorange:專業大推 02/25 16:31
82F:推 skhan:慘了 pcman點了那個網址沒有出現"Safe." 其它都有Safe. 02/25 16:36
83F:推 Rindou:專業又淺顯易懂 02/25 16:39
84F:推 superbabyer:專業大推 外行都懂 02/25 16:51
85F:推 chang0206:專業推 XD 02/25 16:58
86F:噓 Shane7:我覺得這種文章還是要持保留態度吧 第一蘋果怎麼可能讓他 02/25 16:58
87F:推 danielwu13:專業推! 02/25 16:59
88F:→ Shane7:的加密機制source code給你知道 第二這種錯誤只有你會犯吧 02/25 16:59
89F:→ Shane7:你以為蘋果的工程師是大一新生嗎 02/25 17:00
網路上的東西是不該隨便相信沒有錯
來,首先看Apple的公告:
http://support.apple.com/kb/HT6147?viewlocale=en_US&locale=en_US
這邊提到漏洞編號是CVE-2014-1266
於是接著查到這邊:
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-1266&cid=1
表示漏洞存在於libsecurity_ssl/lib/sslKeyExchange.c
最後是Apple自己放上去的程式碼
http://tinyurl.com/phzhghu
裡面就有上面提到的漏洞
然後有人針對這段程式碼的錯誤自行做了一個Patch
在
http://www.sektioneins.de/en/blog/14-02-22-Apple-SSL-BUG.html可以找到
實測結果patch後真的有效(前面有漏洞測試網站)
所以應該是這個錯誤無誤
最後
加密認證很多程式碼都是公開的,例如OpenSSL
程式碼公開不代表安全性有問題(其實公開的反而安全 大家會幫忙找漏洞)
加密認證個重點在你有攻擊者所不知道的key
90F:推 chang0206:不過我也很好奇,為啥原PO可以拿到SOURCE CODE? 02/25 17:00
92F:→ jimei2:來源 還是被google的工程師爆掛的... 02/25 17:05
93F:→ kobe8112:無知並不可怕,可怕的是不懂裝懂的那種... 02/25 17:05
94F:推 willy87009:專業推 02/25 17:05
95F:→ kiii210:蘋果工程師不是萬能的神ok 只要是軟體都會有bug 02/25 17:10
96F:推 j19880709:厲害!!!!!!! 02/25 17:11
※ 編輯: iPluto 來自: 76.94.199.254 (02/25 17:20)
97F:推 kyle5241:蘋果在軟體功能上跟google 差遠了 02/25 17:14
98F:推 osk2:上面都說Apple有open source了,是在噓什麼看不懂 02/25 17:19
99F:→ jimmy055263:只要是人寫的程式都會有bug,尤其是錯在這種簡單的地 02/25 17:29
100F:→ jimmy055263:方才更容易讓人疏忽。只是內部沒有測出來也是蠻奇怪。 02/25 17:29
101F:推 GoldDeath:有人的臉很腫 02/25 17:39
102F:推 iaudio:快推 不然人家以為我看不懂 02/25 17:43
103F:推 slent67:推一下 02/25 17:51
104F:→ lostkimo:沒學過不懂就不懂。沒甚麼...不是每個人都萬能的。 02/25 18:01
105F:推 noxhsu:就跟一格空白的悲劇一樣 本來rm -rf /usr/lib/.. 斷在r /間 02/25 18:01
106F:推 d86012005:專業推 蘋果快點推出 OSX 更新... 02/25 18:15
107F:→ Sunicer:養成好習慣是很重要的:永遠使用中括號,一定要給預設值。 02/25 18:16
108F:推 Vincnet:專業推! 02/25 18:24
109F:推 shin9770:Ios5沒有這個漏洞我上那網站測過了 02/25 18:31
110F:→ shin9770:因為這漏洞升級的喝喝了 02/25 18:31
111F:→ alanzeratul:真的很誇張,在這之前根本不能想像會有這種紕漏 02/25 18:33
112F:→ alanzeratul:做網路交易,有https都有點提心吊膽,但為了方便還是 02/25 18:34
113F:→ alanzeratul:沒辦法,何況是https之前竟然是無效的 02/25 18:35
114F:推 mike760616:1有用!推 02/25 18:50
115F:→ TsaoCCFGOGO:iOS {3.1.3, 4.2.1, 5.1.1} 我都測過沒這問題。 02/25 18:59
116F:→ chauliu:iOS6還特地出了更新 所以是iOS6就開始出錯了? 02/25 19:13
117F:推 likora:專業推! 02/25 19:16
118F:推 VinceCarter:專業推!! 02/25 19:21
119F:推 zaknafein:這真的是扯到爆... 02/25 19:29
120F:推 pa26288:專業推!!!!!幸好更新了 02/25 19:30
121F:推 nojoe:專業解說 好險看的懂 02/25 19:56
122F:推 kitune:推 02/25 19:59
123F:推 lskywalkerl:所以7.0.4 直接安裝大老闆源下的SSLPatch就能解決嗎? 02/25 19:59
124F:推 revorea:這洞也太蠢XD 02/25 20:01
125F:推 rockmanx52:去年PSO2的清空硬碟事件也是因為少打東西造成的... 02/25 20:02
126F:→ rockmanx52:只能說這種程式漏洞防不勝防 02/25 20:03
128F:推 ninewords:哪那麼好找?說的那麼簡單!另外感謝原po說明! 02/25 20:28
129F:推 ll1:iOS 6.1.2 <網站檢測沒通過> 02/25 20:40
130F:推 jefferk:我寫if 都一定只寫一個判斷式XD 小嫩B都這樣 哈哈 02/25 20:57
131F:推 unoturbo105:謝謝原po。長知識了 02/25 20:58
132F:→ jefferk:寫3層之後就開始昏了 要先喝口茶休息一下 XD 02/25 20:58
133F:推 jefferk:不過我看完怎覺得如果都是goto fail 那是什麼東西fail? 02/25 21:02
134F:推 jefferk:err應該是顯示錯誤的話 goto fail 那這樣不管是否err 02/25 21:05
135F:推 xatier:→ Sunicer:養成好習慣是很重要的:永遠使用中括號 <- (? 02/25 21:05
136F:→ jefferk:err必定存在 那err確定是認證嗎? 我怎看起來不像XD? 02/25 21:06
一般函數回傳的值通常表示執行結果是否成功,回傳0表示正確,回傳非0表示錯誤
又那個非0的值可能還會因為值不同代表不同的錯誤,有助於發現問題
這邊每個if判斷式都在call一個函數,並且把回傳值存到err這個變數
所以直接看err是否非0就可以判斷這些函數是否執行有錯誤
有錯誤就是認證失敗,此時err就不會是0
然後程式碼就跳到fail:那邊,又因為err不是0,就可以直接回傳err,表示認證失敗
同時回傳的非0 err值也可以顯示是什麼錯誤
如果認證一路上是成功的
最後sslRawVerify()會把err設成0
回傳err時就會回傳0 代表認證是成功
137F:推 DJony:推 02/25 21:20
138F:推 ull0730:精華文章,讚 02/25 21:22
139F:推 shaolun0:推 02/25 21:30
140F:推 kenk0818:哇 有學有推 感恩 02/25 21:56
141F:→ LinkedList:昨天還是前天有在八卦版看到有人分享 02/25 22:05
142F:推 oas:我用iPhone4 5.1.1測gotofail是Safe 所以5.1.1是OK的? 不用升? 02/25 22:38
143F:推 s850284:難怪這次更新apple這麼積極!以往更新只會跳出一次通知,這 02/25 23:13
144F:→ s850284:次一直跳出訊息,超煩der 02/25 23:13
145F:推 iphonessss:推推 長知識 02/25 23:18
146F:推 Adadadadada:ㄣㄣ跟我想的差不多 02/25 23:26
147F:推 sanderpan:推專業和大氣度! 02/25 23:35
148F:推 cattgirl:iOS6測出漏洞 我更新就安全了 02/26 00:51
149F:推 Icereal:太實用了上站一推 02/26 01:50
150F:推 Archio:寫程式的工作真的不是常人可幹的.... 02/26 02:09
※ 編輯: iPluto 來自: 24.199.19.190 (02/26 02:43)
※ 編輯: iPluto 來自: 24.199.19.190 (02/26 02:58)
151F:推 lovecool123:厲害 推 02/26 03:58
152F:推 jacka1:這篇好專業! 大推! 02/26 04:18
153F:推 tyai:好文長知識 02/26 05:30
154F:推 rosywhite:推! 02/26 09:25
155F:推 lim10337:想起那些寫程式的日子~ 專業推!! 02/26 09:44
156F:推 zaq123123:高三正學C語言中 嗚嗚..好像很難 02/26 11:21
157F:→ abian:長知識推 02/26 12:20
158F:推 taxitaxi:有夠專業! 02/26 14:19
159F:推 lovelong880:推 02/26 15:47
160F:推 jlchien:講解真詳細~推 02/26 20:00
161F:推 jefferk:感謝喔 我目前還沒碰到ssl認證加密的問題XD 02/26 20:25
162F:→ jefferk:這樣說我就懂了XD ios真是很常用判斷式來確認 感謝~~ 02/26 20:26
163F:推 ryanlei:厲害 這回真的是"專業"問題了XDD 02/26 21:19
164F:推 bigshowshow:6.1.3, 用safari點測試網頁不安全,用puffin卻安全? 02/26 21:39
因為跟瀏覽器有關
OSX上Chrome也是安全的
但是因為系統很多服務以及app是會用到SSL的
即使你都用Puffin上網
但是如果你用了Apple內建的Mail軟體 一樣會受這個漏洞影響
所以還是更新OS最實際...
165F:推 tustarosa:這種錯誤實在有一點扯 02/26 21:50
166F:推 alance:推文看到有人說10.6也有更新,請問有辦法只更新到10.6嗎? 02/26 23:43
167F:→ alance:我怕更新到10.7跑不動... 02/26 23:44
168F:推 alance:筆誤..上面說的是ios6及ios7 02/26 23:55
169F:推 usoko:這漏洞八成是git auto merge造成的 因為行數不對mer成兩行 02/27 01:17
170F:→ usoko:乖小孩記得即使if內容只有一行也要加大括號喔 02/27 01:17
171F:推 bababababa:好文 推! 02/27 01:37
172F:推 kazumaking:專業推! 02/27 01:54
173F:推 greedybit:checkpatch.pl不會讓有括號的一行if進到kernel裡的 02/27 02:31
174F:→ greedybit:所以對大神來說亂加括號真的很醜 02/27 02:31
175F:→ iPluto:3GS可以只更新到6.1.6 不然你可以JB然後裝Patch XD 02/27 02:42
176F:→ iPluto:usoko說的沒錯 這八成是merge出來的 沒有人會自己這樣寫... 02/27 02:42
※ 編輯: iPluto 來自: 24.199.19.190 (02/27 02:45)
177F:推 bigshowshow:專業推!之前gmail的確有被盜用,還是更新較心!謝謝解 02/27 12:31
178F:→ bigshowshow:惑! 02/27 12:31
179F:噓 justlink:Man in midle 引用錯誤 02/27 14:17
180F:→ justlink:Man in middle SSL 根本防不了。 02/27 14:18
181F:→ justlink:Key 被拿走了 還是可以被 sniffer 02/27 14:23
182F:推 justlink:尤其是不小心吃了偽CA 02/27 14:30
183F:推 justlink:另外,我先前說的 SSL 完全防不了,是我的錯誤。 02/27 14:33
184F:推 ga762599:專業 03/01 02:11
185F:推 CloudPigLee:長知識推! 03/01 13:18
186F:推 tokai:推 03/07 11:58