sponsored links

微軟也栽了,“千年蟲”啥時候是個頭

微軟也栽了,“千年蟲”啥時候是個頭

新年伊始,微軟 Exchange Server 2016 與 2019 中出現日期檢查錯誤,導致伺服器無法正確識別 2022 年這一時間標記。因此也有人稱其為 Y2K22 bug,即千年蟲 2022 版。

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

Log Name: Application
Source: FIPFS
Logged: 1/1/2022 1:03:42 AM
Event ID: 5300
Level: Error
Computer: server1.contoso.com
Description: The FIP-FS "Microsoft" Scan Engine failed to load. PID: 23092, Error Code: 0x80004005. Error Description: Can't convert "2201010001" to long.

Log Name: Application
Source: FIPFS
Logged: 1/1/2022 11:47:16 AM
Event ID: 1106
Level: Error
Computer: server1.contoso.com
Description: The FIP-FS Scan Process failed initialization. Error: 0x80004005. Error

世界各地的管理員瘋狂排查故障,錯過了與親朋好友一同迎接新年的寶貴時光。“微軟到底在搞什麼鬼?馬上要過年了,要不是論壇上說大家普遍遇到了問題,我們就要重新跑回去上班了。”一位管理員在 Reddit 執行緒中寫道。

微軟在次日釋出了修復方案:自動 PowerShell 指令碼和指令碼也無法執行時適用的手動解決方案。無論如何,管理員都需要在受到影響的每臺本地 Exchange 2016 與 2019 伺服器上分別執行修復操作。好在自動化指令碼可以在多臺伺服器上並行執行。微軟公司強調,自動化指令碼“可能需要一段時間才能執行完成”,並呼籲管理員們耐心等待。

日期與時間檢查是在 Exchange 檢查 FIP-FS 版本的過程中執行的,FIP-FS 是一種掃描引擎、屬於 Exchange 反惡意軟體保護機制中的組成部分。一旦 FIP-FS 的版本是以數字 22 開頭,則檢查將無法完成、投遞中的郵件也會被突然叫停。微軟釋出的修復程式會停止 Microsoft 篩選管理與 Microsoft Exchange 傳輸服務、刪除現有反病毒引擎檔案,並安裝和啟動經過修復的新反病毒引擎。

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

一直在重蹈覆轍

從根本上說,千年蟲是一種程式處理日期上的 bug,這並不是嚴重的技術問題,但卻是企業們一直在犯的錯誤。

2019 年 11 月,部分惠普 SSD 固態硬碟在執行 32768 小時後自動停止工作,盤記憶體儲內容全部消失且無法恢復。特定系統中的所有驅動器可能都預裝有相同批次的韌體、有著同樣的 bug 隱患,一旦同時發生故障,即使是 RAID 系統也承受不了這種“集體罷工”式的極端狀況。

惠普並沒有做出具體解釋,而是直接釋出了韌體修復升級。但從現象來看,問題應該是與程式碼中的 16 位值有關。這意味著此係統可負載的最大負整數是 32768,最大正整數則是 32767。

數字溢位問題是最為常見的程式設計錯誤之一,一旦值達到極限條件而且未經溢位或下溢檢查的校正,那任何程式碼都有可能出現問題。因此,很多開發者喜歡用超級大的整數進行標定;只要數字夠大就不怕意外溢位。

不過,這招並非百試百靈。微控制器中只能使用 8 位或者 16 位整數。考慮到這些值往往與外圍控制器相關聯,所以必須要為其設定適當的範圍限制,確保開發者和程式碼審查者能夠準確掌握這些重要數值。

另一方面,這類超限狀況常常引發難以發現的 bug。惠普 SSD 事件中,驅動器要執行幾年才能達到極限時長,所以這種在罕見條件下才會觸發的錯誤確實不易被察覺。如果這塊 SSD 恰好服務於某臺自動駕駛汽車,那麼在它停止工作的瞬間,車輛很有可能引發嚴重的交通事故。

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

阿麗亞娜 5 號 某段控制程式直接複用了阿麗亞娜 4 號火箭的程式碼,其中一個需要接收 64 位資料的變數為了節省儲存空間而使用了 16 位位元組,這使更快的阿麗亞娜 5 號在控制過程中產生了整數溢位,導致導航系統對火箭控制失效,程式進入異常處理模組,引爆自毀。該失敗成為歷史上最臭名昭著和最昂貴的軟體 bug 之一。

曾讓全世界感到恐懼

“千年蟲”問題的根源始於 60 年代。當時計算機儲存器的成本很高,如果用四位數字表示年份就要多佔用儲存器空間,使成本增加。因此為了節省儲存空間,計算機系統的程式設計人員採用兩位數字表示年份。

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

為了使“1999 年 12 月 31 日”安全過度到“2000 年 1 月 1 日”,資料顯示,當時全球大概投入了 3000 億~6000 億美元來解決千年蟲問題。雖然效果不錯,但還是出現了一些問題,甚至笑話。

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

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

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

微軟也栽了,“千年蟲”啥時候是個頭

1999 年 12 月 29 日,位於華盛頓特區的美國海軍天文臺內部

除了美國外,日本的核電站也受到了千年蟲的影響。在新年鐘聲敲響的兩分鐘之後,日本女川核電站突然響起警報,當時計算機發現某負責測量周圍海水溫度的裝置出現了問題。好在故障只持續了 10 分鐘左右,之後一切再次迴歸平靜、並未發現任何嚴重狀況。

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

由於 Y2K 錯誤,香港期貨交易所的計算機系統出現故障,控制恆生指數期權合約定價的計算機系統計算錯了許多期權交易的交易日和到期日之間的天數;芝加哥聯邦儲備銀行無法完成 700,000 美元的稅款轉移;芝加哥的一家銀行中斷了對部分醫院的電子醫療保險支付功能,處理和支付醫療保險索賠的保險公司必須透過聯邦快遞,將包含已處理索賠資訊的軟盤寄給銀行來保證按時付款。

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

  • 千年蟲導致新生兒被登記為百歲老人。丹麥的第一名“千禧嬰兒”剛剛降生就被醫院計算機登記為百歲老人。德國德意志歌劇院的計算機系統在 2000 年 1 月 1 日將日期跳轉回 1900 年,導致所有員工及其子女的年齡都發生了巨大變化。1990 年出生的小朋友瞬間迎來 90 歲高齡,並導致不少員工無法正常收取由政府直接在工資中發放的兒童撫育補貼。
  • 完全沒用、又不能退貨的“千年蟲生存包”。藉著全球各地對千年蟲大災難的恐懼心理,不少公司提前幾個月推出了一系列“千年蟲生存包”。這個業務很快催生出價值數百萬美元的市場,其中一家名為 Preparedness Resources 的公司甚至透過推銷包含脫水食品、淨水器、無電池手電筒、毯子和防水火柴的生存工具套裝賺到 1600 萬美元。頭腦清醒的總裁 Scott Sperry 還一早就定下了“售出不退”的強硬政策。
  • “一夜暴富”的驚喜體驗。千年蟲讓德國的某個男子在新世紀的第一天突然體驗了把當富豪的感覺。當天,他的銀行賬戶中隨機存入約 600 萬美元,交易日期為 1899 年 12 月 30 日。當時的官員並不確定這筆異常轉賬跟千年蟲有沒有關係,唯一可以肯定的是這個男子不會真的一夜暴富。

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

比爾·蓋茨在採訪中就曾強調,千年蟲“之所以最終沒有掀起什麼波瀾,是因為各方真的不遺餘力全力修復。如果沒有這樣的付出,全世界一定會受到巨大影響。”

“千年蟲”能躲開嗎?

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

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

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

到這個時間後,數字不會自動增加,而會變為 -2147483648,即 1901 年 12 月 13 日 20 時 45 分 52 秒。這會導致很多的程式出現問題,甚至崩潰。

2038 年問題不僅比千年蟲更隱蔽,而且比之前千年蟲問題更具有破壞力。千年蟲問題只會導致應用層的程式出現問題,比如信用卡支付系統或管理系統。而“2038 年問題”的 bug,將會影響系統最底層的時間控制的功能。

2020 年 2 月釋出的 Linux kernel 5.6 聲稱解決了這個問題,因此 32 位系統也可以執行到 2038 年後。Linux 開發人員 Arnd Bergmann 表示,使用 GNU C Library 2.32 和 Musl libc 1.2 在 64 位 time_t 上構建使用者時間。

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

相關連結:

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/

分類: 旅遊
時間: 2022-01-13

相關文章

總理罷宴故事:周恩來自掏腰包,朱鎔基坐在角落裡吃工作餐

總理罷宴故事:周恩來自掏腰包,朱鎔基坐在角落裡吃工作餐
"國君,酒會傷人,更會荒廢政務,為了齊國的大業,國君應該停止宴舞." 這是春秋時期晏嬰.弦章二位大臣勸諫齊景公所說的話.雖說"民以食為天",但從古至今,奢侈浪費 ...

周恩來去世,金日成哭紅雙眼推遲眼疾手術,指示建銅像紀念週總理

周恩來去世,金日成哭紅雙眼推遲眼疾手術,指示建銅像紀念週總理
1976年1月8日周恩來總理逝世,世界為之震動,朝鮮領導人金日成聽到這個訊息後悲痛萬分,回想起與周總理的一次次會面,一次次長談,想起周總理為中朝兩國關係所做出的巨大貢獻,他淚流不止. 金日成對勸慰他的 ...

1976年,周恩來逝世,看看世界對於周總理逝世報道文字裡的溫度

1976年,周恩來逝世,看看世界對於周總理逝世報道文字裡的溫度
1976年1月8日,時間彷彿永遠的定格在這一天,偉大的新中國總理周恩來在這一天離開了人世.國內外各大媒體紛紛報道此事,一時間整個國家炸開了鍋.有人不願接受這個事實,有人為巨星隕落而傷心,有人為此哭泣不 ...

長征路上週恩來病危,楊立三抬6天6夜,19年後總理親自為他引棺

長征路上週恩來病危,楊立三抬6天6夜,19年後總理親自為他引棺
1954年12月3日,北京上空西風呼嘯,寒風刺骨,在陰沉沉的西郊機場,彭德懷.陳毅.鄧小平.賀龍等一大批國家和軍隊的領導人肅穆佇立,凝望遠空.眼含淚水,在此等待,來迎接軍委財務部部長楊立三的靈柩. 下 ...

公園裡的紅色景點 | 馬駿烈士墓愛國主義教育基地

公園裡的紅色景點 | 馬駿烈士墓愛國主義教育基地
公園裡的紅色景點 馬駿烈士墓愛國主義教育基地 從日壇公園西門進去,往北走不遠,就能看到一片高大墨綠的松柏,松柏中間空地上一塊紅色石基上立著一尊半身雕塑,雕塑後面有個黑色的橢圓形屏風,屏風後面是白色的墓 ...

美國記者故意刁難周總理:為何要用美製鋼筆,總理回答讓其羞愧

美國記者故意刁難周總理:為何要用美製鋼筆,總理回答讓其羞愧
1949年10月1日,新中國正式成立,歷史翻開了嶄新的一頁,無數人為了今天付出了生命,活下來的人還要為新中國的建設鞠躬盡瘁,每當想起這些偉人,第一個會想到的是偉大的毛主席,第二個一定就是敬愛的周總理. ...

1960年周總理訪印,被問及西藏為何是中國的,他的回答讓對方語塞

1960年周總理訪印,被問及西藏為何是中國的,他的回答讓對方語塞
1960年4月19日,一架飛機降落在印度的首都新德里機場.從飛機上走下來的,正是周恩來總理和外交部部長陳毅一行人. 這是周恩來總理第四次訪問印度,但這一次也是印度方面表現最冷淡的一次. 這一次,夾道兩 ...

1972年,尼克松不滿意毛主席送的4兩茶葉,周總理如何輕鬆化解?

1972年,尼克松不滿意毛主席送的4兩茶葉,周總理如何輕鬆化解?
1972年,北京,中南海書房,正在進行的中美元首級會談末尾,年近八旬的毛主席,將早已準備好的兩百克茶葉當成國禮送給了美國總統尼克松. 令人意想不到的是,尼克松對此有些不滿,心中覺得茶葉數量太少,頓時現 ...

周總理去世21年後,銀行查賬發現他名下有1.2萬英鎊,這是誰存的

周總理去世21年後,銀行查賬發現他名下有1.2萬英鎊,這是誰存的
周恩來總理 前言 1997年,在中國銀行的一次內部審計中,工作人員發現了周總理名下有一筆1.2萬英鎊存款.算上利息摺合成人民幣,這筆錢在當時數額高達467000元!即便是在現在,40多萬也是一筆鉅款, ...

1964年,張愛萍要參加一個外事活動,但周總理為何要搜他的口袋?

1964年,張愛萍要參加一個外事活動,但周總理為何要搜他的口袋?
開國上將張愛萍晚年時曾說過:"彭德懷教我做人,周恩來教我做事." 張愛萍 周恩來是張愛萍衷心敬仰.終生擁戴的良師益友和卓越領導人,他們自上世紀30年代開始,有著長達40多年的友誼, ...

塗伯毅:活著的“邱少雲”,毀容後周總理親自接見,稱他是藝術家

塗伯毅:活著的“邱少雲”,毀容後周總理親自接見,稱他是藝術家
在成都市新都區新繁鎮榮軍路86號,坐落著"全國退役軍人工作模範單位"四川省革命傷殘軍人休養院. 這座始建於1951年的革命傷殘軍人休養院,至今供養過2800多名殘疾軍人,其中參加抗 ...

俞惠如:丈夫是開國中將,一生養育12個兒女,總理稱她是航空母艦

俞惠如:丈夫是開國中將,一生養育12個兒女,總理稱她是航空母艦
當站在正在經歷戰爭的土地上的時候,隨處散發著的是濃濃的血腥味,耳朵裡都是失去親人.朋友,愛人撕心裂肺的哭聲,眼裡盡是看不到曙光的空洞. 但是就是在這樣殘酷的世界裡,親人之間的溫情.愛人之間的朦朧純美卻 ...

1962年印度戰敗後,6國舉行調解會議卻偏袒印度,周恩來如何破解

1962年印度戰敗後,6國舉行調解會議卻偏袒印度,周恩來如何破解
印度自1947年獨立後,不斷蠶食我國領土. 1962年10月20日,忍無可忍的我國人民解放軍被迫自衛反擊,至11月21日,我軍收復了德讓宗.打隴宗.邦迪拉及其以南鷹窠山口等幾個山口,基本恢復了中印邊界 ...

1972年,3位開國上將復出,各大軍區不要,周總理親自出馬做工作

1972年,3位開國上將復出,各大軍區不要,周總理親自出馬做工作
在新中國建立的過程中,許多革命先輩為此拋灑一腔熱血,還有許多為之奉獻出了寶貴的生命.而他們之中九死一生活到建國後的便成為了各大軍區的總司令.然而在建國後又面臨著許多事件的發生.例如試圖打倒各位統帥的& ...

1960年,模仿周總理筆跡詐騙20萬鉅款的人,結局怎麼樣了?

1960年,模仿周總理筆跡詐騙20萬鉅款的人,結局怎麼樣了?
1960年,正值三年自然災害時期,各地災情頻發,周總理為此事憂心不已,可在這個時候竟然發生了一件驚天詐騙案,有人偽造他的公文從中國人民銀行騙走了20萬元人民幣,這讓周總理憤怒不已,責令公安部徹查此事, ...

周恩來與博古的一次長談:我們都不適合當統帥

周恩來與博古的一次長談:我們都不適合當統帥
偉大的中國共產黨於1921年在上海成立,經過28年的艱苦奮鬥,取得抗日戰爭和解放戰爭的勝利,於1949年建立了中華人民共和國.中國共產黨的領袖毛澤東擔任國家主席,周恩來擔任國務院總理. 誕生之初的中國 ...

1965年,毛主席急電約見周恩來,接著6萬人神秘消失18年

1965年,毛主席急電約見周恩來,接著6萬人神秘消失18年
1965年10月24日,周恩來總理接到了一通毛主席打來的電話,毛主席在電話中並沒有說發生了什麼事情,只是告訴周總理:來我辦公室一趟,有些事要和你商量一下,然後毛主席就結束通話了電話. 周總理知道,毛主 ...

“拉出去槍斃”毛主席斷喝,驚得周恩來聶榮臻從沙發上站了起來
1950年3月,訪蘇歸來的毛主席剛回到北京不久,就在無意中聽說有一位負責建築工程的高階幹部,在香山施工時順便為自己蓋了一棟二層小樓-- 第二天下午,那位幹部便被叫到了主席的住處菊香書屋,當時在座的還有 ...

傳唱半個多世紀,《我們走在大路上》竟與周總理有著這樣的淵源

傳唱半個多世紀,《我們走在大路上》竟與周總理有著這樣的淵源
"我們走在大路上,意氣風發,鬥志昂揚--" 慶祝中國共產黨成立100週年大會上,<我們走在大路上>旋律鏗鏘,充滿力量.這首影響了幾代中國人的歌曲,曾經同樣被周恩來總理稱 ...

1967年,公安部副部長接到一份秘密情報,立即撥通了周恩來的專線

1967年,公安部副部長接到一份秘密情報,立即撥通了周恩來的專線
1967年的一天,公安部副部長楊奇清在辦公室裡照常辦公,卻來了一位沒有預約的偵察員. 這個偵察員名叫張文奇,是北京市公安局負責外貿系統敵特偵察的同志,按照級別來說,張文奇是不夠級別直接向楊奇清彙報工作 ...