看板 iOS 關於我們 聯絡資訊
本文章只是想說明一下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
bojack:很詳細的說明,推一下 02/25 12:25
scottiting:XD 02/25 12:26
b701217:實用推 02/25 12:30
Schwarztee:實用推 看PTT長知識 02/25 12:32
emptylife3:推一個 02/25 12:32
an138:如果都沒在用公用網路的人還要更新嗎? 都只用自己的3G跟 02/25 12:35
an138:家裡的wifi 02/25 12:35
stussy0716:好厲害!長知識了 02/25 12:36
BlackSeven:推! 02/25 12:36
mihonisizumi:專業推 02/25 12:37
joe3477:太專業了.. 02/25 12:42
sampo1125:長知識 推!! 02/25 12:46
JamesChen:這漏洞是大學生等級的吧XDDD 02/25 12:47
zx09192939:專業又講得很淺顯易懂真不容易!謝謝好文長知識 02/25 12:48
mova:說明推! 02/25 12:52
song042008:不愧是i大.. 02/25 12:54
hopeltw:多學了一些 02/25 12:55
jump0319:專業推! 02/25 12:59
neverfly:話說為什麼會有ios的source code? 02/25 13:00
Shigeru777:原本iphone4留在ios5 不過一看到SSL漏洞就馬上升級了.. 02/25 13:03
artiller:SSL漏洞是重大問題 除非手機完全不會輸入帳號密碼 02/25 13:06
Vett:err初始給0? 應該不會吧@@ 02/25 13:06
LoLoLuan:本來不想更 但看到你這篇馬上更新.... 02/25 13:06
zoex:只能升成iOS7才有解嗎? 實在不想用那醜陋的介面.... 02/25 13:06
LoLoLuan:iOS7哪會醜 我很喜歡 02/25 13:08
LoLoLuan:扁平化很可愛 02/25 13:08
ingrid0815:推!終於清楚了 02/25 13:09
k078787878:if迴圈就算只有一行我都習慣要{}以免發生這樣的情形 02/25 13:12
swpoker:很多語言都有這樣的寫法~只是這種寫法常被當作厲害寫法 02/25 13:14
Crackhead:為了那一行要重新JB跟設定 好麻煩阿 >< 02/25 13:14
sosoing:專業大推 02/25 13:15
aloha888:推推推 02/25 13:16
ohhahaha:太白癡了吧天啊 02/25 13:21
kevinlee810:CS學生推~ 02/25 13:22
rockmanx52:如果是"過去半年多"的話 那受災戶應該只有iOS7吧? 02/25 13:30
rockmanx52:iOS6"理論上"不必擔心這點 02/25 13:30
uarenotalone:專業推 02/25 13:30
rockmanx52:啊抱歉,應該是iOS6.0才不用擔心...6.1應該也有問題 02/25 13:31
s111121:是只有iOS 7有這個漏洞嗎,iOS 6以前的呢? 02/25 13:33
mars1396:專業給推!!!!!! 02/25 13:34
sysop5566: 蘋果的程式 都沒再審核嗎? 為何BUG會上架 02/25 13:35
wavel:bug不是說找就找,寫程式最難也花最多實績的就是debug 02/25 13:38
wavel: 時間 02/25 13:38
willychn33:OSX10.9.2和iOS7.1全都還沒修補QQ 02/25 13:40
jump0319:這樣子ios6也需要擔心嗎? 02/25 13:40
SkLc:快推 不然人家以為我看不懂 02/25 13:48
hisky:好詳細! 02/25 13:48
shinichi:但我的iPod touch4最高只支援到iOS6 但這波的更新也釋出 02/25 13:50
shinichi:屬於iOS6的新版本 所以iOS6也是有影響吧? 02/25 13:50
memo5215:寫程式不難,debug才煩 02/25 13:52
Neymar: http://miupix.cc/pm-27F7J1 02/25 13:56
Neymar:iOS6 以上的才要跟新,有JB的去cydia下載SSLpatch就好了 02/25 13:59
Neymar:沒JB的人就乖乖升級吧,除非你停在iOS 5以前的版本。 02/25 14:02
iPluto:Apple有些程式碼是公開的: http://opensource.apple.com 02/25 14:15
kobe8112:這... 02/25 14:22
s605152002:猛 02/25 14:23
victoryss:不推對不起自己 02/25 14:35
SiePtt:推 02/25 14:41
jackjack135:太強大! 02/25 14:43
lingchen:感謝 寫的淺顯易懂實在不容易 02/25 14:48
jca:超專業,看過一定要推的啊:)))) 02/25 14:53
SOMEGOOD:ios 6.1.2飄過,裝了CYDIA的SSLPATCH後測試已安全 02/25 14:56
boys5566:專業推! 02/25 14:59
daniel414:CS的推~ 02/25 15:05
robin2503:推 02/25 15:06
HuMirage:詳細推 02/25 15:16
PLASBOT:詳細推! 02/25 15:18
SuperShangXD:推!! 02/25 15:19
NagoyaOsaka:這該M吧 02/25 15:28
chunptt:謝謝詳細解說! iOS6.1.2裝了patch後測safe 02/25 15:40
ckstorm:所以做過的系統都要求 if後無論是否一行都得加{ } 02/25 16:00
neverfly:goto fail if err= xxx; =>perl有這種更帥氣的一行if語法 02/25 16:06
Preaz:推~~ 難怪iOS升上6.0之後, 就發生盜刷的新聞. 02/25 16:13
seraph01:原來是這樣! 難怪之前一堆被盜 02/25 16:16
KawasumiMai:好蠢的漏洞= =果然習慣{}是對的 02/25 16:24
KawasumiMai:每次接手那種省略{}的code都會先花時間人工format 02/25 16:25
KawasumiMai:就怕哪天多跳一行就出包了= = 02/25 16:25
LBJ23K:傻眼.... 02/25 16:28
mixbqw:而且更麻煩的是bug有些還是照跑,不提示錯誤..這種要抓會 02/25 16:29
mixbqw:抓到天荒地老 02/25 16:29
horseorange:專業大推 02/25 16:31
skhan:慘了 pcman點了那個網址沒有出現"Safe." 其它都有Safe. 02/25 16:36
Rindou:專業又淺顯易懂 02/25 16:39
superbabyer:專業大推 外行都懂 02/25 16:51
chang0206:專業推 XD 02/25 16:58
Shane7:我覺得這種文章還是要持保留態度吧 第一蘋果怎麼可能讓他 02/25 16:58
danielwu13:專業推! 02/25 16:59
Shane7:的加密機制source code給你知道 第二這種錯誤只有你會犯吧 02/25 16:59
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
chang0206:不過我也很好奇,為啥原PO可以拿到SOURCE CODE? 02/25 17:00
jimei2:來源 還是被google的工程師爆掛的... 02/25 17:05
kobe8112:無知並不可怕,可怕的是不懂裝懂的那種... 02/25 17:05
willy87009:專業推 02/25 17:05
kiii210:蘋果工程師不是萬能的神ok 只要是軟體都會有bug 02/25 17:10
j19880709:厲害!!!!!!! 02/25 17:11
※ 編輯: iPluto 來自: 76.94.199.254 (02/25 17:20)
kyle5241:蘋果在軟體功能上跟google 差遠了 02/25 17:14
osk2:上面都說Apple有open source了,是在噓什麼看不懂 02/25 17:19
jimmy055263:只要是人寫的程式都會有bug,尤其是錯在這種簡單的地 02/25 17:29
jimmy055263:方才更容易讓人疏忽。只是內部沒有測出來也是蠻奇怪。 02/25 17:29
GoldDeath:有人的臉很腫 02/25 17:39
iaudio:快推 不然人家以為我看不懂 02/25 17:43
slent67:推一下 02/25 17:51
lostkimo:沒學過不懂就不懂。沒甚麼...不是每個人都萬能的。 02/25 18:01
noxhsu:就跟一格空白的悲劇一樣 本來rm -rf /usr/lib/.. 斷在r /間 02/25 18:01
d86012005:專業推 蘋果快點推出 OSX 更新... 02/25 18:15
Sunicer:養成好習慣是很重要的:永遠使用中括號,一定要給預設值。 02/25 18:16
Vincnet:專業推! 02/25 18:24
shin9770:Ios5沒有這個漏洞我上那網站測過了 02/25 18:31
shin9770:因為這漏洞升級的喝喝了 02/25 18:31
alanzeratul:真的很誇張,在這之前根本不能想像會有這種紕漏 02/25 18:33
alanzeratul:做網路交易,有https都有點提心吊膽,但為了方便還是 02/25 18:34
alanzeratul:沒辦法,何況是https之前竟然是無效的 02/25 18:35
mike760616:1有用!推 02/25 18:50
TsaoCCFGOGO:iOS {3.1.3, 4.2.1, 5.1.1} 我都測過沒這問題。 02/25 18:59
chauliu:iOS6還特地出了更新 所以是iOS6就開始出錯了? 02/25 19:13
likora:專業推! 02/25 19:16
VinceCarter:專業推!! 02/25 19:21
zaknafein:這真的是扯到爆... 02/25 19:29
pa26288:專業推!!!!!幸好更新了 02/25 19:30
nojoe:專業解說 好險看的懂 02/25 19:56
kitune:推 02/25 19:59
lskywalkerl:所以7.0.4 直接安裝大老闆源下的SSLPatch就能解決嗎? 02/25 19:59
revorea:這洞也太蠢XD 02/25 20:01
rockmanx52:去年PSO2的清空硬碟事件也是因為少打東西造成的... 02/25 20:02
rockmanx52:只能說這種程式漏洞防不勝防 02/25 20:03
lskywalkerl:為何我安裝SSLPatch出現錯誤訊息? http://ppt.cc/T9jt 02/25 20:13
ninewords:哪那麼好找?說的那麼簡單!另外感謝原po說明! 02/25 20:28
ll1:iOS 6.1.2 <網站檢測沒通過> 02/25 20:40
jefferk:我寫if 都一定只寫一個判斷式XD 小嫩B都這樣 哈哈 02/25 20:57
unoturbo105:謝謝原po。長知識了 02/25 20:58
jefferk:寫3層之後就開始昏了 要先喝口茶休息一下 XD 02/25 20:58
jefferk:不過我看完怎覺得如果都是goto fail 那是什麼東西fail? 02/25 21:02
jefferk:err應該是顯示錯誤的話 goto fail 那這樣不管是否err 02/25 21:05
xatier:→ Sunicer:養成好習慣是很重要的:永遠使用中括號 <- (? 02/25 21:05
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 代表認證是成功
DJony:推 02/25 21:20
ull0730:精華文章,讚 02/25 21:22
shaolun0:推 02/25 21:30
kenk0818:哇 有學有推 感恩 02/25 21:56
LinkedList:昨天還是前天有在八卦版看到有人分享 02/25 22:05
oas:我用iPhone4 5.1.1測gotofail是Safe 所以5.1.1是OK的? 不用升? 02/25 22:38
s850284:難怪這次更新apple這麼積極!以往更新只會跳出一次通知,這 02/25 23:13
s850284:次一直跳出訊息,超煩der 02/25 23:13
iphonessss:推推 長知識 02/25 23:18
Adadadadada:ㄣㄣ跟我想的差不多 02/25 23:26
sanderpan:推專業和大氣度! 02/25 23:35
cattgirl:iOS6測出漏洞 我更新就安全了 02/26 00:51
Icereal:太實用了上站一推 02/26 01:50
Archio:寫程式的工作真的不是常人可幹的.... 02/26 02:09
※ 編輯: iPluto 來自: 24.199.19.190 (02/26 02:43) ※ 編輯: iPluto 來自: 24.199.19.190 (02/26 02:58)
lovecool123:厲害 推 02/26 03:58
jacka1:這篇好專業! 大推! 02/26 04:18
tyai:好文長知識 02/26 05:30
rosywhite:推! 02/26 09:25
lim10337:想起那些寫程式的日子~ 專業推!! 02/26 09:44
zaq123123:高三正學C語言中 嗚嗚..好像很難 02/26 11:21
abian:長知識推 02/26 12:20
taxitaxi:有夠專業! 02/26 14:19
lovelong880:推 02/26 15:47
jlchien:講解真詳細~推 02/26 20:00
jefferk:感謝喔 我目前還沒碰到ssl認證加密的問題XD 02/26 20:25
jefferk:這樣說我就懂了XD ios真是很常用判斷式來確認 感謝~~ 02/26 20:26
ryanlei:厲害 這回真的是"專業"問題了XDD 02/26 21:19
bigshowshow:6.1.3, 用safari點測試網頁不安全,用puffin卻安全? 02/26 21:39
因為跟瀏覽器有關 OSX上Chrome也是安全的 但是因為系統很多服務以及app是會用到SSL的 即使你都用Puffin上網 但是如果你用了Apple內建的Mail軟體 一樣會受這個漏洞影響 所以還是更新OS最實際...
tustarosa:這種錯誤實在有一點扯 02/26 21:50
alance:推文看到有人說10.6也有更新,請問有辦法只更新到10.6嗎? 02/26 23:43
alance:我怕更新到10.7跑不動... 02/26 23:44
alance:筆誤..上面說的是ios6及ios7 02/26 23:55
usoko:這漏洞八成是git auto merge造成的 因為行數不對mer成兩行 02/27 01:17
usoko:乖小孩記得即使if內容只有一行也要加大括號喔 02/27 01:17
bababababa:好文 推! 02/27 01:37
kazumaking:專業推! 02/27 01:54
greedybit:checkpatch.pl不會讓有括號的一行if進到kernel裡的 02/27 02:31
greedybit:所以對大神來說亂加括號真的很醜 02/27 02:31
iPluto:3GS可以只更新到6.1.6 不然你可以JB然後裝Patch XD 02/27 02:42
iPluto:usoko說的沒錯 這八成是merge出來的 沒有人會自己這樣寫... 02/27 02:42
※ 編輯: iPluto 來自: 24.199.19.190 (02/27 02:45)
bigshowshow:專業推!之前gmail的確有被盜用,還是更新較心!謝謝解 02/27 12:31
bigshowshow:惑! 02/27 12:31
justlink:Man in midle 引用錯誤 02/27 14:17
justlink:Man in middle SSL 根本防不了。 02/27 14:18
justlink:Key 被拿走了 還是可以被 sniffer 02/27 14:23
justlink:尤其是不小心吃了偽CA 02/27 14:30
justlink:另外,我先前說的 SSL 完全防不了,是我的錯誤。 02/27 14:33
ga762599:專業 03/01 02:11
CloudPigLee:長知識推! 03/01 13:18
tokai:推 03/07 11:58