首頁>資訊 >
微軟也栽了,“千年蟲”啥時候是個頭 2022-01-13 17:08:30  來源:36氪

新年伊始,微軟 Exchange Server 2016 與 2019 中出現(xiàn)日期檢查錯誤,導(dǎo)致服務(wù)器無法正確識別 2022 年這一時間標(biāo)記。因此也有人稱其為 Y2K22 bug,即千年蟲 2022 版。

據(jù)悉,微軟的郵件程序會將日期與時間存儲為 signed 整數(shù)(帶符號的整數(shù)),最大值為 2147483647,即 2^31 - 1。而微軟使用更新版本的前兩位數(shù)字表示其發(fā)布年份,所以只要時間在 2021 年或更早,那就一切 OK。然而,就在微軟于新年前夜發(fā)布 2201010001 版本時,本地服務(wù)器卻由于無法正確解析日期而發(fā)生崩潰,導(dǎo)致遞送消息卡在傳輸隊列中動彈不得。

世界各地的管理員瘋狂排查故障,錯過了與親朋好友一同迎接新年的寶貴時光?!拔④浀降自诟闶裁垂恚狂R上要過年了,要不是論壇上說大家普遍遇到了問題,我們就要重新跑回去上班了?!币晃还芾韱T在 Reddit 線程中寫道。

微軟在次日發(fā)布了修復(fù)方案:自動 PowerShell 腳本和腳本也無法運行時適用的手動解決方案。無論如何,管理員都需要在受到影響的每臺本地 Exchange 2016 與 2019 服務(wù)器上分別執(zhí)行修復(fù)操作。好在自動化腳本可以在多臺服務(wù)器上并行運行。微軟公司強調(diào),自動化腳本“可能需要一段時間才能運行完成”,并呼吁管理員們耐心等待。

日期與時間檢查是在 Exchange 檢查 FIP-FS 版本的過程中執(zhí)行的,F(xiàn)IP-FS 是一種掃描引擎、屬于 Exchange 反惡意軟件保護機制中的組成部分。一旦 FIP-FS 的版本是以數(shù)字 22 開頭,則檢查將無法完成、投遞中的郵件也會被突然叫停。微軟發(fā)布的修復(fù)程序會停止 Microsoft 篩選管理與 Microsoft Exchange 傳輸服務(wù)、刪除現(xiàn)有反病毒引擎文件,并安裝和啟動經(jīng)過修復(fù)的新反病毒引擎。

目前,大部分受到波及的組織已經(jīng)恢復(fù)正常,但還不清楚這項 bug 已經(jīng)存在了多久,不過從受影響的版本判斷,很可能源自 Exchange Server 2016 的開發(fā)階段。

一直在重蹈覆轍

從根本上說,千年蟲是一種程序處理日期上的 bug,這并不是嚴重的技術(shù)問題,但卻是企業(yè)們一直在犯的錯誤。

2019 年 11 月,部分惠普 SSD 固態(tài)硬盤在運行 32768 小時后自動停止工作,盤內(nèi)存儲內(nèi)容全部消失且無法恢復(fù)。特定系統(tǒng)中的所有驅(qū)動器可能都預(yù)裝有相同批次的固件、有著同樣的 bug 隱患,一旦同時發(fā)生故障,即使是 RAID 系統(tǒng)也承受不了這種“集體罷工”式的極端狀況。

惠普并沒有做出具體解釋,而是直接發(fā)布了固件修復(fù)升級。但從現(xiàn)象來看,問題應(yīng)該是與代碼中的 16 位值有關(guān)。這意味著此系統(tǒng)可負載的最大負整數(shù)是 32768,最大正整數(shù)則是 32767。

數(shù)字溢出問題是最為常見的編程錯誤之一,一旦值達到極限條件而且未經(jīng)溢出或下溢檢查的校正,那任何代碼都有可能出現(xiàn)問題。因此,很多開發(fā)者喜歡用超級大的整數(shù)進行標(biāo)定;只要數(shù)字夠大就不怕意外溢出。

不過,這招并非百試百靈。微控制器中只能使用 8 位或者 16 位整數(shù)。考慮到這些值往往與外圍控制器相關(guān)聯(lián),所以必須要為其設(shè)置適當(dāng)?shù)姆秶拗?,確保開發(fā)者和代碼審查者能夠準(zhǔn)確掌握這些重要數(shù)值。

另一方面,這類超限狀況常常引發(fā)難以發(fā)現(xiàn)的 bug?;萜?SSD 事件中,驅(qū)動器要運行幾年才能達到極限時長,所以這種在罕見條件下才會觸發(fā)的錯誤確實不易被察覺。如果這塊 SSD 恰好服務(wù)于某臺自動駕駛汽車,那么在它停止工作的瞬間,車輛很有可能引發(fā)嚴重的交通事故。

除了惠普 SSD 事件,阿麗亞娜 -5 運載火箭首次測試發(fā)射失敗的原因也是這樣的一個“小”失誤。1996 年 6 月 4 日,阿麗亞娜 -5 運載火箭首次測試發(fā)射,火箭在發(fā)射后 37 秒被迫自行引爆,40 秒后解體。這個價值 5 億美元的運載系統(tǒng)瞬間灰飛煙滅。

阿麗亞娜 5 號 某段控制程序直接復(fù)用了阿麗亞娜 4 號火箭的代碼,其中一個需要接收 64 位數(shù)據(jù)的變量為了節(jié)省存儲空間而使用了 16 位字節(jié),這使更快的阿麗亞娜 5 號在控制過程中產(chǎn)生了整數(shù)溢出,導(dǎo)致導(dǎo)航系統(tǒng)對火箭控制失效,程序進入異常處理模塊,引爆自毀。該失敗成為歷史上最臭名昭著和最昂貴的軟件 bug 之一。

曾讓全世界感到恐懼

“千年蟲”問題的根源始于 60 年代。當(dāng)時計算機存儲器的成本很高,如果用四位數(shù)字表示年份就要多占用存儲器空間,使成本增加。因此為了節(jié)省存儲空間,計算機系統(tǒng)的編程人員采用兩位數(shù)字表示年份。

雖然提高了計算機的運行效率,但也帶來新的隱患。比如當(dāng)日期從 1999 年滾動至 2000 年時,99 到 00 的變化會引發(fā)哪些后果?有些人擔(dān)心計算機會不知道如何理解這樣一個時間空值,導(dǎo)致日期無效、進而引發(fā)全球性計算設(shè)施故障。

為了使“1999 年 12 月 31 日”安全過度到“2000 年 1 月 1 日”,數(shù)據(jù)顯示,當(dāng)時全球大概投入了 3000 億~6000 億美元來解決千年蟲問題。雖然效果不錯,但還是出現(xiàn)了一些問題,甚至笑話。

對于千年蟲問題,美國的態(tài)度和行動特別積極。當(dāng)時,美國整個國家至少投入的 1000 億美元中,約 90 億美元花在聯(lián)邦政府身上。五角大樓的情報和國防系統(tǒng)成為資金的主要目的地(總額約 35 億美元)。但是,雖然開展了為期數(shù)月的昂貴計算機修復(fù)與硬件更新努力,政府在 2000 年的頭三天內(nèi)仍然遭遇到嚴重的間諜衛(wèi)星運行故障。直到經(jīng)歷了重啟和再次運行,衛(wèi)星才終于能夠正常發(fā)回可以識別的信息內(nèi)容。

三天時間聽起來不長,但五角大樓的一位官員仍將此次事件劃入“重大”類別。不過略顯諷刺的是,引發(fā)故障的并不是千年蟲、而是用來解決該 bug 的軟件補丁。

此外,美國海軍天文臺也因千年蟲影響暫時失控。美國海軍天文臺只有一項工作:校準(zhǔn)時間。該機構(gòu)成立于 1830 年,主要負責(zé)美國各類航海儀器,并在后續(xù)的發(fā)展中逐漸成為美國的官方計時機構(gòu)。正是由于如此重要的地位,才讓海軍天文臺在千禧年第一天宣布日期為“19100 年 1 月 1 日”顯得格外尷尬,雖然問題在上報不到一小時后就被解決。

1999 年 12 月 29 日,位于華盛頓特區(qū)的美國海軍天文臺內(nèi)部

除了美國外,日本的核電站也受到了千年蟲的影響。在新年鐘聲敲響的兩分鐘之后,日本女川核電站突然響起警報,當(dāng)時計算機發(fā)現(xiàn)某負責(zé)測量周圍海水溫度的設(shè)備出現(xiàn)了問題。好在故障只持續(xù)了 10 分鐘左右,之后一切再次回歸平靜、并未發(fā)現(xiàn)任何嚴重狀況。

日本志賀核電站也發(fā)生了類似的事件,千年蟲故障導(dǎo)致該站部分警報系統(tǒng)下線。更糟糕的是,政府辦公室的一臺電站監(jiān)控電腦與配套警報系統(tǒng)也一同宕機。總之,當(dāng)天日本各地都出現(xiàn)了類似的小問題,不過很快得到了控制與糾正。日本官員們并沒有透露這些事件是否與千年蟲 bug 相關(guān)。

由于 Y2K 錯誤,香港期貨交易所的計算機系統(tǒng)出現(xiàn)故障,控制恒生指數(shù)期權(quán)合約定價的計算機系統(tǒng)計算錯了許多期權(quán)交易的交易日和到期日之間的天數(shù);芝加哥聯(lián)邦儲備銀行無法完成 700,000 美元的稅款轉(zhuǎn)移;芝加哥的一家銀行中斷了對部分醫(yī)院的電子醫(yī)療保險支付功能,處理和支付醫(yī)療保險索賠的保險公司必須通過聯(lián)邦快遞,將包含已處理索賠信息的軟盤寄給銀行來保證按時付款。

此外,還有一些讓人哭笑不得的事情:

千年蟲導(dǎo)致新生兒被登記為百歲老人。丹麥的第一名“千禧嬰兒”剛剛降生就被醫(yī)院計算機登記為百歲老人。德國德意志歌劇院的計算機系統(tǒng)在 2000 年 1 月 1 日將日期跳轉(zhuǎn)回 1900 年,導(dǎo)致所有員工及其子女的年齡都發(fā)生了巨大變化。1990 年出生的小朋友瞬間迎來 90 歲高齡,并導(dǎo)致不少員工無法正常收取由政府直接在工資中發(fā)放的兒童撫育補貼。

完全沒用、又不能退貨的“千年蟲生存包”。借著全球各地對千年蟲大災(zāi)難的恐懼心理,不少公司提前幾個月推出了一系列“千年蟲生存包”。這個業(yè)務(wù)很快催生出價值數(shù)百萬美元的市場,其中一家名為 Preparedness Resources 的公司甚至通過推銷包含脫水食品、凈水器、無電池手電筒、毯子和防水火柴的生存工具套裝賺到 1600 萬美元。頭腦清醒的總裁 Scott Sperry 還一早就定下了“售出不退”的強硬政策。

“一夜暴富”的驚喜體驗。千年蟲讓德國的某個男子在新世紀的第一天突然體驗了把當(dāng)富豪的感覺。當(dāng)天,他的銀行賬戶中隨機存入約 600 萬美元,交易日期為 1899 年 12 月 30 日。當(dāng)時的官員并不確定這筆異常轉(zhuǎn)賬跟千年蟲有沒有關(guān)系,唯一可以肯定的是這個男子不會真的一夜暴富。

雖然從現(xiàn)在的角度來看,當(dāng)初全世界對于千年蟲問題的恐慌似乎沒啥必要,但這主要歸功于各國提前幾年投入數(shù)千億美元進行 bug 修復(fù)。

比爾·蓋茨在采訪中就曾強調(diào),千年蟲“之所以最終沒有掀起什么波瀾,是因為各方真的不遺余力全力修復(fù)。如果沒有這樣的付出,全世界一定會受到巨大影響?!?/p>

“千年蟲”能躲開嗎?

早在 1999 年之前,世界各地的政府和企業(yè)就一直在努力尋找 Y2K 的修復(fù)方案。但千年蟲問題至今還不能有效避免,千年蟲還可能再次現(xiàn)身。

和千年蟲問題類似,32 位的 Unix 操作系統(tǒng)和 Linux 操作系統(tǒng)時間溢出問題又稱為“2038 年問題”,所有使用 POSIX 時間表示時間的程序都將受到影響。這個問題是由用來寫 Unix/Linux 的 C 語言引起的。

C 語言中用 time_t 來代表時間和日期,用來記載從 1970 年 1 月 1 日到 2000 年所經(jīng)歷的秒數(shù),并以 32 位存儲。第一位是符號位,其余 31 位用來存數(shù)字,這 31 位數(shù)字可存儲的最大數(shù)字為 2147483647,最多可以用到 2038 年 01 月 19 日 03 時 14 分 07 秒。

到這個時間后,數(shù)字不會自動增加,而會變?yōu)?-2147483648,即 1901 年 12 月 13 日 20 時 45 分 52 秒。這會導(dǎo)致很多的程序出現(xiàn)問題,甚至崩潰。

2038 年問題不僅比千年蟲更隱蔽,而且比之前千年蟲問題更具有破壞力。千年蟲問題只會導(dǎo)致應(yīng)用層的程序出現(xiàn)問題,比如信用卡支付系統(tǒng)或管理系統(tǒng)。而“2038 年問題”的 bug,將會影響系統(tǒng)最底層的時間控制的功能。

2020 年 2 月發(fā)布的 Linux kernel 5.6 聲稱解決了這個問題,因此 32 位系統(tǒng)也可以運行到 2038 年后。Linux 開發(fā)人員 Arnd Bergmann 表示,使用 GNU C Library 2.32 和 Musl libc 1.2 在 64 位 time_t 上構(gòu)建用戶時間。

雖然“2038 年問題”這樣的系統(tǒng)性問題可能需要長時間探索解決,像微軟這種類似千年蟲的 bug,完全是可以避免的。

相關(guān)鏈接:

https://www.mentalfloss.com/article/654225/everything-you-need-perfect-winter-staycation?utm_content=infinitescroll1

https://arstechnica.com/information-technology/2022/01/exchange-server-bug-gets-a-fix-after-ruining-admins-new-years-plans/

https://www.howtogeek.com/671087/what-was-the-y2k-bug-and-why-did-it-terrify-the-world/

本文來自微信公眾號“InfoQ”(ID:infoqchina),作者:褚杏娟、核子可樂,36氪經(jīng)授權(quán)發(fā)布。

關(guān)鍵詞: 千年蟲 是個 微軟

相關(guān)閱讀:
熱點
圖片 圖片