看板 iPhone作者 iPluto (鍵盤Apple Genius)標題 [情報] 解析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有更新檔請第
一時間更新。(有個非官方的更新,但是不推薦)
好,現在來講講到底是什麼原因造成這種大漏洞的。說來好笑,只是因為某
份程式碼多了一行...
在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 tail,只有第一個跟它上面的if有關,會考
慮條件判斷。後面那個goto fail不管怎麼樣都會被執行到!!! 也就是認證到
一半就跳到下面那三行程式碼,此時err當然是0,函數回傳了0,直接宣布認
證通過...
對,錯誤就是這麼簡單,多了一行goto fail,可以影響全世界不知道多少的
用戶,讓整個SSL認證機制完全無效,寫程式真的不能不小心啊…
最後,請記得更新你的系統。隨著Apple發表這個更新檔並且被挖出了相關漏
洞資訊,攻擊者會增加的非常快速。
--
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 76.94.199.254
推 bojack:很詳細的說明,推一下1F 02/25 12:25
推 an138:如果都沒在用公用網路的人還要更新嗎? 都只用自己的3G跟
家裡的wifi6F 02/25 12:35
推 zx09192939:專業又講得很淺顯易懂真不容易!謝謝好文長知識14F 02/25 12:48
推 mova:說明推!15F 02/25 12:52
→ neverfly:話說為什麼會有ios的source code?19F 02/25 13:00
推 Shigeru777:原本iphone4留在ios5 不過一看到SSL漏洞就馬上升級了..20F 02/25 13:03
推 artiller:SSL漏洞是重大問題 除非手機完全不會輸入帳號密碼21F 02/25 13:06
推 Vett:err初始給0? 應該不會吧@@22F 02/25 13:06
→ LoLoLuan:本來不想更 但看到你這篇馬上更新....23F 02/25 13:06
→ zoex:只能升成iOS7才有解嗎? 實在不想用那醜陋的介面....24F 02/25 13:06
推 LoLoLuan:iOS7哪會醜 我很喜歡
扁平化很可愛25F 02/25 13:08
→ k078787878:if迴圈就算只有一行我都習慣要{}以免發生這樣的情形28F 02/25 13:12
→ swpoker:很多語言都有這樣的寫法~只是這種寫法常被當作厲害寫法29F 02/25 13:14
推 Crackhead:為了那一行要重新JB跟設定 好麻煩阿 ><30F 02/25 13:14
推 rockmanx52:如果是"過去半年多"的話 那受災戶應該只有iOS7吧?
iOS6"理論上"不必擔心這點35F 02/25 13:30
→ rockmanx52:啊抱歉,應該是iOS6.0才不用擔心...6.1應該也有問題38F 02/25 13:31
推 s111121:是只有iOS 7有這個漏洞嗎,iOS 6以前的呢?39F 02/25 13:33
推 sysop5566: 蘋果的程式 都沒再審核嗎? 為何BUG會上架41F 02/25 13:35
推 wavel:bug不是說找就找,寫程式最難也花最多實績的就是debug
時間42F 02/25 13:38
→ willychn33:OSX10.9.2和iOS7.1全都還沒修補QQ44F 02/25 13:40
推 jump0319:這樣子ios6也需要擔心嗎?45F 02/25 13:40
--