Unix這顆大雷,真的會讓電子設(shè)備癱瘓嗎?
新年伊始,萬象更新,今天不發(fā)那些網(wǎng)絡(luò)安全新聞,聊聊輕松點的話題,給大家在元旦假期里解解悶。業(yè)內(nèi)一直盛傳的Unix時間的雷,真的會讓全球電子設(shè)備癱瘓嗎?
昨天,幾個安全圈好友聚在一起喝酒,不知怎么就聊到了“千年蟲”的問題。當年開發(fā)計算機操作系統(tǒng)的那幫大神們親手埋下的雷,在時間的流逝下慢慢爆出了各種匪夷所思的安全BUG。千禧年Y2K的雷是Windows,而Unix的雷則是在2038年爆發(fā)。
Unix的雷是怎么埋下的?
話說再1969年,貝爾實驗室的大神Ken Thompson曾利用老婆回娘家的假期,開發(fā)了一個操作系統(tǒng),它叫Unix。沒錯,就是咱們現(xiàn)在使用的那個Unix,開發(fā)它大概用了三周(夸張)。看來,老婆回娘家可以大幅提升已婚男人創(chuàng)造力,這在全球范是統(tǒng)一的。
在開發(fā)過程中,他遇到了一個嚴重的問題:如何在Unix中表示日期和時間?最簡單的辦法是用一個字符串來表示,例如1970-09-17 00:00:30.751,但這明顯不是最好的辦法。最后Ken決定用一個整數(shù)來表示日期和時間,也就是Unix 紀元時間,并將1970年1月1日00:00:00設(shè)定為開始時間。
所以Unix 系統(tǒng)的時間計算方法其實是用秒數(shù)來表示系統(tǒng)時間。換句話說當下的時間(2024年1月1日00:00:00)是從1970年1月1日00:00:00走過多少秒的時間,即系統(tǒng)時間 = 基準時間+秒數(shù)。感興趣的朋友,可以訪問time.is/Unix網(wǎng)站,可以知道從1970年1月1日00:00:00到現(xiàn)在一共過去了多少秒。
由于Ken將Unix時間確定為32位整數(shù),這就導致一個很嚴重的系統(tǒng)BUG,32位的有符號整數(shù)最大值是2147483647(距離1970年1月1日00:00:00走過了2147483647秒),簡單換算下Unix時間為2038年1月19號 03:14:07 UTC,再往后就沒了。
一旦越過這個時間最大值,Unix系統(tǒng)時間將會在內(nèi)部被表示為一個負數(shù),并造成程序無法工作,因為它們無法將此時間識別為 2038 年,甚至還有可能調(diào)回到 1970 年。這讓很多人想起了千禧年的“千年蟲(Y2K)”事件,因此Unix系統(tǒng)時間問題也被稱為Y2K38。
當然這也不能完全怪Ken。畢竟那時候主流計算機還都是使用16位,所以使用32位整數(shù)來設(shè)定時間已經(jīng)夠夠的了。在他看來,Unix系統(tǒng)能不能活到2000年都是個問題,更別提2038年。但誰能想到,Unix系統(tǒng)竟是如此的強悍,不僅可以和Windows相抗衡,還統(tǒng)治了服務(wù)器端的OS市場,在計算機操作系統(tǒng)的發(fā)展史上占有重要的地位,此后“簡潔,一致性,易使用”被很多開發(fā)人員奉為圭臬。
問題很嚴重嗎?
扯遠了。。
其實解決方案也不復雜,將32 位有符號整數(shù)修改成 64 位有符號整數(shù)(時間長度近300億)。目前Linux內(nèi)核開始全面支持64位時間戳的系統(tǒng)調(diào)用,記得在升級之后看看原來的程序和庫是否使用32位編譯,如果是則需改成64位,否則依然會產(chǎn)生溢出問題。
雖然很多文章將這一問題描述地很嚴重,甚至會導致大部分電腦癱瘓無法工作。但我們認為,這樣的情況并不會出現(xiàn)。距離2038年還有整整14年的時間,以現(xiàn)在電子設(shè)備迭代的速度來看,那時候還有沒有32位的電腦都是個未知數(shù)。
其次,從千年蟲事件來看,最終結(jié)果沒有產(chǎn)生非常嚴重的影響,部分安全問題都控制在小范圍內(nèi),尤其是并且對現(xiàn)實世界產(chǎn)生嚴重影響,相信Y2K38也不會有太過嚴重的后果。Unix對這一BUG也是心知肚明,不可能找不到一個妥善的解決辦法。
最后,祝大家元旦快樂。2024年,你我皆是黑馬!(狗頭保命)
資源來源于互聯(lián)網(wǎng)