本文章只是想說明一下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發表這個更新檔並且被挖出了相關漏
洞資訊,攻擊者會增加的非常快速。
--
◢◤ ◢███◤ ◢◤
◤ ◢◤ ◢◤◤ ◢◤◤ ◢◤
◢◤ ◢███◤◤ ◢◤◤ ◢◤ ◢◤ ◢██◤ ◢███◤
◢◤◤ ◢◤ ◤ ◢◤◤ ◢◤◤◢◤◤ ◢◤◤◤ ◢◤◤◢◤◤
◢◤◤ ◢◤◤ ◢◤◤ ◢███◤◤ ◢█◤ ◢███◤◤
◤ ◤ ◤ ◤ ◤ ◤
--
對實際更新的操作和效能沒有什麼幫助(汗)
當做知識看看就好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