最近IT業(yè)界流行著一個段子:
“你知道為什么新的Windows系統(tǒng)要跳過Windows 9直接命名為Windows 10嗎?因?yàn)楹芏嘬浖谂卸ú僮飨到y(tǒng)類型時是這樣寫的—if(version.StartsWith(“Windows 9”)) { /* 95 and 98 */ } else { ”。
翻譯成人話就是:如果這些軟件看見一個系統(tǒng)名字以Windows 9開頭,它們就會認(rèn)為這是Win 95或者Win 98。于是,為了避免被錯認(rèn)成20年前的老古董,微軟只好避開這個“雷區(qū)”,將新系統(tǒng)命名為Windows 10。
這個理由乍聽上去很扯,因?yàn)槭煜ひ稽c(diǎn)編程的人都看得出來,這個代碼寫得太簡單粗暴了,幾乎是“災(zāi)難編程”的范例,市面上隨便抓一個程序員都不會這么干。但人們很快發(fā)現(xiàn),著名的OpenJDK(Java開發(fā)環(huán)境的開源版本)里真的就是這么寫的!于是段子一下子變成了現(xiàn)實(shí):就算OpenJDK立馬修改這一點(diǎn),微軟也不可能要求全球數(shù)十上百萬個使用OpenJDK進(jìn)行開發(fā)的軟件工程師及時跟進(jìn),唯一可行的做法,就是避開Windows 9這個名字。
從這個故事中我們可以總結(jié)兩點(diǎn):一,再厲害的軟件都可能包含低級錯誤;二,新科技有時候不得不為老錯誤買單。
這兩條規(guī)律的適用范圍很廣,新近頻被曝光的“破殼” 漏洞便是一個絕佳的示范。
根據(jù)Rapid7安全公司的提示,這個被命名為“破殼”(shellshock)的CVE-2014-6271漏洞的嚴(yán)重程度為10,是已知漏洞中最高的一種,相比2014年4月的“心臟流血”漏洞嚴(yán)重了好幾個級別;與此同時,它的利用復(fù)雜程度卻是“低”,黑客可以輕松地用它發(fā)動攻擊。
具體來說,這個漏洞存在于Linux系統(tǒng)被廣泛使用的開源軟件Bash上。Bash是一款用于控制Linux計(jì)算機(jī)命令提示符的流行軟件,就是所謂的“殼”(shell)。基于Unix平臺的操作系統(tǒng)絕大部分都采用了Bash軟件,包括Ubuntu等Linux系統(tǒng)和蘋果的OS X系統(tǒng),這就意味著,這個漏洞并非像“心臟流血”一樣是純粹的服務(wù)器端漏洞,而會對服務(wù)器端和客戶端兩方面都造成影響。
另外,“心臟流血”漏洞只是允許黑客非法取得服務(wù)器中儲存的數(shù)據(jù),從而有可能獲得網(wǎng)站敏感信息,而“破殼”漏洞則允許黑客直接獲得計(jì)算機(jī)的控制權(quán)—黑客只需要復(fù)制粘貼一行代碼,就能取代原主人而對計(jì)算機(jī)發(fā)號施令。
堵上這個漏洞比想象中更加困難。紅帽安全公司和Fedora都在漏洞公布后的第一時間發(fā)布了補(bǔ)丁,蘋果也為Mac OS X發(fā)布了專用補(bǔ)丁。但安全專家查驗(yàn)后表示,這些補(bǔ)丁并不完整。截至漏洞曝光20天后,黑客仍可以繞過補(bǔ)丁通過“破殼”漏洞侵入目標(biāo)計(jì)算機(jī)。
最糟糕的是,這個漏洞已經(jīng)存在25年了,相關(guān)代碼的引入時間是1989年8月。也就是說,在這25年里,無數(shù)頂級程序員為Bash貢獻(xiàn)代碼,利用和改造它,卻沒人對這個開源軟件進(jìn)行過一遍徹底的代碼審查—所有人都默認(rèn)它是一個成熟的軟件,卻忘了它誕生于互聯(lián)網(wǎng)仍充滿信任的黃金時代。在那個時代,人們對安全并沒有如此重視,代碼審查也還沒有列入工程規(guī)范。
這就成了一個無解的兩難困局:一方面,新科技并非空中樓閣,它必須踩在舊時代技術(shù)和產(chǎn)品構(gòu)筑的基石之上;另一方面,時代在進(jìn)步,舊產(chǎn)品某些看似微小的瑕疵卻未必符合新的標(biāo)準(zhǔn),于是,新科技就必須不停地為舊賬買單。