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