微軟 2022 年開年就出大 bug 大量程序員連夜加班:年都沒跨好(圖文)
沒想到,2022 年的到來,也給微軟帶來了一個新 bug。
隨著日期從 2021 年 12 月 31 日跳轉到 2022 年 1 月 1 日,不少使用微軟 Exchange 的公司發現,自己寫好的新年祝福等郵件,突然發不出去了。
Exchange Server 是微軟推出的一套電子郵件服務組件,可用于構建企業、高校或機構的郵件系統。簡單來說,用它不止能構建 " 郵箱工作群 ",還能協調內部工作流等。
這些公司的郵箱服務器內滯留了大量郵件,有些甚至達到數十萬封,面臨服務器存儲不下的問題。
目前這個 bug 已經在 Reddit 熱度上千,許多人表示 " 年都沒跨好就在這修 bug":
新年(嗶)快樂!
我本來還在度假呢,就給我拉回來處理這個玩意了……
所以到底是怎么回事?
微軟 2022 版 " 千年蟲 "
據一位 Exchange 管理員 Joseph Roosen 表示,這是一個由于 "2022 年 " 的到來而導致的 bug。
這個 bug 的根源,是微軟 Exchange 上面的郵件過濾管理系統(FIP-FS),采用了一種名叫 "yymmddHHMM" 的有符號變量(Int32,也就是 long)來存儲日期。
其中,yymmddHHMM 分別指代用兩位來存儲年(years)、月(months)、日(days)、小時(Hours)、分鐘(Minutes)。
這個數據類型存在一個問題:
有符號的 Int32 最多只能存儲 -2147483647 到 +2147483647 的數據。
然而,從 2022 年 1 月 1 日 0 時開始,"yymmddHHMM" 的 yy 就已經變成了 "22",超過了 Int32 所能存儲的數據最大范圍:
2147483647
22XXXXXXX
于是,在 2022 年 1 月 1 日這天,所有用 Exchange 服務器發郵件的公司,都收到了這樣一條錯誤提醒:
The FIP-FS Scan Process failed initialization. Error: 0x8004005. Error Details: Unspecified Error" or "Error Code: 0x80004005. Error Description: Can ’ t convert "2201010001" to long.(FIP-FS 掃描處理初始化失敗……無法將 "2201010001" 轉變為 long 數據類型)
它最初被一位名叫 @miketheitguy 的推特用戶發現:
由于和 " 千年蟲 " 一樣都是日期給計算機帶來的 bug,這次 bug 也被一些 Exchange 管理員命名為 Y2K22。
其中,Y2K 指的是著名的 " 千年蟲 " 問題,由于部分計算機程序只采用兩位十進制數表示年份,在跨世紀時就會出現錯誤的結果;22 指的則是 2022 年。
這個 bug 在不少 Exchange Server 版本中都出現了相同的問題,包括 2016 和 2019 等。
目前,微軟的 Exchange 團隊正在緊急修復中。
他們表示,幾天后會發布一個 Exchange Server 更新,里面將用一個更大的變量類型來保存日期。
然而在這之前,使用 Exchange Server 的公司們必須想辦法把郵件發出去。
一些權宜之計
微軟團隊表示,如果有非常緊急的郵件需要發送,需要先關掉 Exchange 中的 FIP-FS 功能。
這是個 Exchange 上的垃圾郵件過濾器,平時會用來掃描郵件中自帶的惡意軟件、或是垃圾郵件。
目前微軟官方也提供了一些禁用或繞過惡意軟件掃描的方法。
然而,這樣操作的后果是公司郵箱 " 可能收到更多垃圾郵件 "。
對此有網友調侃,如果微軟在修復中把有符號變量改成無符號變量,那么數據的表示范圍就會變成 0~4294967295,Exchange 郵箱又可以用到 2043 年了。
除此之外,目前 Reddit 網友還給出了一些其他的解決方案。
例如,有網友發布了一個非官方的自定義腳本,可以將日期回滾到 2021 年,但他對此表示,一切風險需要使用者自己承擔。
如果還沒想好怎么解決你的 Exchange 郵箱系統問題,可以先用上面這些方法試一試。