顯示廣告
隱藏 ✕
※ 本文為 chann.bbs. 轉寄自 ptt.cc 更新時間: 2014-02-25 13:42:13
看板 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
scottiting:XD2F 02/25 12:26
b701217:實用推3F 02/25 12:30
Schwarztee:實用推 看PTT長知識4F 02/25 12:32
emptylife3:推一個5F 02/25 12:32
an138:如果都沒在用公用網路的人還要更新嗎? 都只用自己的3G跟6F 02/25 12:35
an138:家裡的wifi
stussy0716:好厲害!長知識了8F 02/25 12:36
BlackSeven:推!9F 02/25 12:36
mihonisizumi:專業推10F 02/25 12:37
joe3477:太專業了..11F 02/25 12:42
sampo1125:長知識 推!!12F 02/25 12:46
JamesChen:這漏洞是大學生等級的吧XDDD13F 02/25 12:47
zx09192939:專業又講得很淺顯易懂真不容易!謝謝好文長知識14F 02/25 12:48
mova:說明推!15F 02/25 12:52
song042008:不愧是i大..16F 02/25 12:54
hopeltw:多學了一些17F 02/25 12:55
jump0319:專業推!18F 02/25 12:59
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
LoLoLuan:扁平化很可愛
ingrid0815:推!終於清楚了27F 02/25 13:09
k078787878:if迴圈就算只有一行我都習慣要{}以免發生這樣的情形28F 02/25 13:12
swpoker:很多語言都有這樣的寫法~只是這種寫法常被當作厲害寫法29F 02/25 13:14
Crackhead:為了那一行要重新JB跟設定 好麻煩阿 ><30F 02/25 13:14
sosoing:專業大推31F 02/25 13:15
aloha888:推推推32F 02/25 13:16
ohhahaha:太白癡了吧天啊33F 02/25 13:21
kevinlee810:CS學生推~34F 02/25 13:22
rockmanx52:如果是"過去半年多"的話 那受災戶應該只有iOS7吧?35F 02/25 13:30
rockmanx52:iOS6"理論上"不必擔心這點
uarenotalone:專業推37F 02/25 13:30
rockmanx52:啊抱歉,應該是iOS6.0才不用擔心...6.1應該也有問題38F 02/25 13:31
s111121:是只有iOS 7有這個漏洞嗎,iOS 6以前的呢?39F 02/25 13:33
mars1396:專業給推!!!!!!40F 02/25 13:34
sysop5566: 蘋果的程式  都沒再審核嗎?  為何BUG會上架41F 02/25 13:35
wavel:bug不是說找就找,寫程式最難也花最多實績的就是debug42F 02/25 13:38
wavel:                                   時間
willychn33:OSX10.9.2和iOS7.1全都還沒修補QQ44F 02/25 13:40
jump0319:這樣子ios6也需要擔心嗎?45F 02/25 13:40

--
※ 看板: iOS 文章推薦值: 0 目前人氣: 0 累積人氣: 586 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇