Juniper“同卵雙生”的后門(mén)是怎樣誕生的
安全研究人員和加密專家最近幾天都忙于找出剛公布的 Juniper NetScreen 防火墻 VPN 流量解密后門(mén)的具體細(xì)節(jié)?,F(xiàn)在,他們確信自己已經(jīng)找到了答案,惡意第三方修改+Juniper自身的加密失敗。
據(jù)專家稱,Juniper 采用已知有缺陷的隨機(jī)數(shù)字生成器Dual_EC_DRBG (雙橢圓曲線確定性隨機(jī)比特生成器)作為NetScreen防火墻ScreenOS加密操作的基礎(chǔ),認(rèn)為由于其采取了額外預(yù)防措施而不會(huì)產(chǎn)生不安全的后果。但事實(shí)是,這些安全保護(hù)措施并沒(méi)有起到效果。
VPN 解密問(wèn)題是 Juniper 在上周四公布的,同時(shí)公布的還有另一個(gè)可使攻擊者利用硬編碼的主密碼獲得 NetScreen 設(shè)備管理員權(quán)限的漏洞。該公司稱,兩個(gè)問(wèn)題都是由最近的內(nèi)部代碼審計(jì)中發(fā)現(xiàn)的 ScreenOS 未授權(quán)代碼造成的。
Juniper 發(fā)布了受影響固件的補(bǔ)丁版本,但并未公布該流氓代碼的具體細(xì)節(jié),其位置和可能的添加者都還屬于內(nèi)部機(jī)密。FBI 正在調(diào)查該事件,網(wǎng)上最新付出的消息顯示,始作俑者有可能是 NSA 。
安全社區(qū)擔(dān)負(fù)起了逆向老版固件和 Juniper 新補(bǔ)丁的責(zé)任,希望能挖掘出更多信息。他們很快找到了那段偽裝得非常聰明的硬編碼主密碼,并發(fā)現(xiàn)其影響范圍不像一開(kāi)始認(rèn)為的那么廣。
加密專家深入研究對(duì)他們而言更具吸引力的 VPN 流量解密問(wèn)題,畢竟,暗中窺視加密流量的能力任何時(shí)候都不能等閑視之。
沒(méi)過(guò)多久,就有人注意到 Juniper 最新的補(bǔ)丁將一個(gè)參數(shù)恢復(fù)到了受 VPN 解密問(wèn)題影響的 ScreenOS 6.3.0分支最初版本 6.3.0r12 之前的數(shù)值。
德國(guó)安全顧問(wèn)公司 Comsecuris 創(chuàng)始人兼首席執(zhí)行官拉爾夫-菲利普·威曼(Ralf-Philipp Weinmann)在進(jìn)一步分析之后稱,該參數(shù)是雙橢圓曲線(Dual_EC)隨機(jī)數(shù)字生成器(RNG)使用的兩個(gè)常數(shù)P和Q當(dāng)中的Q。
Dual_EC 是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所(NIST)于2007年在美國(guó)國(guó)家安全局(NSA)的支持下被標(biāo)準(zhǔn)化的,NSA 在其發(fā)展過(guò)程中扮演了重要的角色。此后不久,微軟的兩名研究員丹·舒茂(Dan Shumow)和尼爾斯·弗格森(Neils Ferguson)就揭示了該標(biāo)準(zhǔn)中一個(gè)可被用作后門(mén)的重大漏洞。
“數(shù)學(xué)分析部分略去不談,簡(jiǎn)單地說(shuō)就是,Dual_EC 依賴于一個(gè)特殊的32字節(jié)的常數(shù) Q,該常數(shù)如果由惡意攻擊者產(chǎn)生,他可以僅憑30個(gè)字節(jié)的原始輸出就能預(yù)測(cè) Dual_EC 隨機(jī)數(shù)生成器的未來(lái)輸出。”約翰·霍普金斯大學(xué)副教授密碼破譯專家馬修·格林(Matthew Green)在周二發(fā)布的一篇博文中寫(xiě)道。
NIST 規(guī)范中Q的默認(rèn)值是由 NSA 產(chǎn)生的,不能保證它真的就是按隨機(jī)方式產(chǎn)生。事實(shí)上,2013年9月,基于NSA前雇員斯諾登揭秘的文件,《紐約時(shí)報(bào)》報(bào)道稱 NSA 故意設(shè)計(jì)了這個(gè)漏洞。
該報(bào)道促使 NIST 將 Dual_EC_DRBG 從其推薦列表中除名,建議用戶轉(zhuǎn)向其他的隨機(jī)數(shù)生成器。在 NIST 的建議之后,Juniper 承認(rèn) ScreenOS 采用了 Dual_EC_DRBG,但宣稱“是以一種不會(huì)造成已被曝光的可能問(wèn)題的方式利用的。”
ScreenOS 沒(méi)有采用 NIST 建議的 PQ 常數(shù)值作為橢圓曲線的基準(zhǔn)點(diǎn),而是用了“自生成的基準(zhǔn)點(diǎn)。”此外,Dual_EC 的輸出結(jié)果又作為另一個(gè)隨機(jī)數(shù)生成器 FIPS/ANSI X.9.31 的輸入來(lái)產(chǎn)生新的隨機(jī)數(shù)以供 ScreenOS 加密操作取用。
Juniper 為什么要用一個(gè) RNG 的輸出作為另一個(gè) RNG 的輸入而不直接采用后者那個(gè)更安全的 RNG 我們不得而知。但是,如果該實(shí)現(xiàn)是切實(shí)精準(zhǔn)的,控制常數(shù)Q應(yīng)該對(duì)攻擊者沒(méi)什么大用處。那么,為什么攻擊者要費(fèi)勁去改那個(gè)參數(shù)呢?
這個(gè)問(wèn)題的答案被獨(dú)立研究員威廉·賓格爾斯(Willem Pinckaers)揭曉了。他閱讀了威曼的分析,注意到 Juniper 用來(lái)將 Dual_EC 的輸出傳遞到 ANSI 生成器的代碼中存在有一個(gè)錯(cuò)誤,會(huì)導(dǎo)致該步驟失敗。
威廉·賓格爾斯指出:重設(shè)種子系統(tǒng)偽隨機(jī)數(shù)生成器函數(shù) reseed_system_prng 將全局變量——系統(tǒng)偽隨機(jī)數(shù)生成器內(nèi)存指針 system_prng_bufpos 置為32。這意味著在該函數(shù)第一次調(diào)用以后,緊跟在系統(tǒng)偽隨機(jī)數(shù)產(chǎn)生塊 system_prng_gen_block 的重設(shè)種子函數(shù)調(diào)用后面的for循環(huán)根本不會(huì)得到執(zhí)行。而且,ANSI X9.31 偽隨機(jī)數(shù)生成器代碼完全沒(méi)用。
該錯(cuò)誤似乎早于未知攻擊者對(duì)Q點(diǎn)的未授權(quán)改變,其本身也可被視為一個(gè)后門(mén)。實(shí)際上,威曼將整件事描述為“被后門(mén)的后門(mén)”。
“總而言之,某黑客或黑客團(tuán)伙發(fā)現(xiàn)了 Juniper 軟件中現(xiàn)有的一個(gè)后門(mén),可能是故意設(shè)置的也可能是無(wú)意造成的——你自己判斷!”格林說(shuō),“然后他們?cè)诖酥嫌纸艘粋€(gè)他們自己的后門(mén)——因?yàn)樗械目鄤诙家呀?jīng)替他們做了嘛。最終結(jié)果就是有那么一段時(shí)期,某些人——或許是外國(guó)政府,能夠解密美國(guó)和全世界的 Juniper 流量。而這一切全都因?yàn)?Juniper 自己已經(jīng)為他們鋪好了路。”
Juniper 沒(méi)有立即回應(yīng)對(duì)此做出評(píng)論的請(qǐng)求。
格林稱,即使 Juniper 沒(méi)有故意引入該漏洞,如果美國(guó)政府當(dāng)局強(qiáng)迫廠商在加密實(shí)現(xiàn)中設(shè)置后門(mén)以便合法竊聽(tīng)通信,那么此事無(wú)疑就是其后果的絕佳案例。
“加密后門(mén)的問(wèn)題不在于它們是攻擊者闖入我們加密系統(tǒng)的唯一途徑,而在于那是最佳途徑。這些后門(mén)辛苦假設(shè)好管道和電線,讓攻擊者可以大搖大擺地走進(jìn)來(lái)改換門(mén)庭。”
“該漏洞告訴我們的是,此類擔(dān)憂不再是理論上的。”格林說(shuō),“如果加密后門(mén)確實(shí)存在于我們的未來(lái)里,那我們所有的工作就更難做了。”