博客專欄

        EEPW首頁 > 博客 > 照這樣下去,“千年蟲”還得再來十遍

        照這樣下去,“千年蟲”還得再來十遍

        發布人:硅星人 時間:2022-01-10 來源:工程師 發布文章

        為啥不“一勞永逸”?因為多勞,才能多得……

        ——

        文|杜晨   編輯|VickyXiao


        在21年前世紀之交,全球的計算機系統和互聯網曾經出過一個重大事件:千年蟲。

        當時的計算機系統處理年份的方式都是兩位數(如1998年會被系統縮略成98),而2000年在老系統里仍然以00顯示,則會被系統當成1900年

        然而誰都沒想到的是,就在前幾天,”千年蟲“又重演了……

        | 發生了什么?

        首先,幸運的是,這次的事故規模,并沒有千年蟲那次那么大。目前已知受到影響的,只有采用了微軟 Exchange Server2016 和2019 版本的企業本地郵件服務器。

        因為全球很多企業內部的電子郵件,采用的都是自主搭建的系統(而非基于 Gmail、網易、阿里云等云端郵件的方案),而微軟的 Exchange 服務器 (Microsoft Exchange Server) 則是很多企業用戶都在用的本地郵件系統。

        然而在2021年12月31日——去年的最后一天,在 IT 人員都已經放假的時候微軟突推送了一個全新的 Exchange Server 版本,直接把所有企業客戶的電子郵件系統都給搞宕機了,大量郵件積壓在發送序列當中,卻無法正常發送和接收。

        錯誤代碼大概是下面這樣的:

        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.

        一夜之間,大量的 IT 人員 Reddit 微軟官方術社區大倒苦水。

        “這玩意兒是怎么發布出來的?而且還是在新年夜???”“電話都被打爆了。微軟你弄啥嘞?”

        問題,出在微軟推送的這次更新的版本號上。

        這次的更新,里面包含的電子郵件惡意軟件掃描引擎的版本號是 2201010001,表示的是202201010001分。

        微軟的產品和系統在表示時間的時候,用的都是這種符號整數。然而,根據微軟自己的開發文檔,其系統能夠接受的 Int32 符號整數的最大值是 2147483647。

        這個最大值的前兩位是21

        也就是說,采用這種整數方式來記錄和表示時間,只能夠正常覆蓋到2021年的最后一秒。

        所以,當微軟推送出這個 2201010001 版本的時候,版本數字超過了系統能夠接受的整數最大值,結果就直接把 Exchange Server 郵件系統給搞崩潰了……

        目前,微軟方面已經提供了修復此問題的方法,可以執行 PowerShell 腳本來自動修復,也可以用手動方法修復。修復必須在所有被波及的 Exchange Server 2016 或 2019版本服務器上執行。

        很多被影響到的公司 IT,在修復過程中也遇到了各種各樣的問題。總的來說,這次微軟送的這個新年大禮包,讓大家整個新年都沒過好……

        在微軟官方技術論壇上,一位用戶發出了靈魂拷問:誰會在12月31日推送生產環境更新啊?

        | 千年蟲重演,原因依然很蠢

        這次微軟郵件服務器的 bug,以及其它公司/產品發生的類似的日期時間處理錯誤,一起被命名為 Y2K22(也即 Year 2022 的縮寫)。

        為什么這樣命名?正是因為,導致這些 bug 出現的問題,和21年前的千年蟲 (Y2K bug),幾乎一模一樣。

        文章開始提到,千年蟲的出現,是因為當時一些相對比較古老的計算機系統,在處理年份的時候會采用兩位數簡寫。

        當時的普通人壓根想不到,新千年的到來會讓計算機系統出故障——唯一有可能預知這種情況發生的,也就只有程序員了。

        而當千年蟲事件即將發生的時候,那些已經投入使用十年甚至20年的系統,背后的 COBOL 程序員(大多已經或者快要退休了),又被請出山來修復他們當年“埋”下的這些漏洞……

        在當時,有兩種修復的思路:

        1)全盤重寫所有系統的代碼,稱為“expansion”;

        2)打個快速的補丁,讓計算機能夠將從00到20的數字,正確識別為2000年到2020年——這種方式也被稱為“windowing”.

        具體來說,這個補丁讓計算機系統將1970年1月1日0時0秒(也即程序員都非常熟悉的 Unix 時間戳)作為百年“時間窗口”的中間點,也即從1920年到2020年的任何一個時間點,在計算機系統里都可采用其到 Unix 時間戳的距離作為表示方法。

        “高性能計算機新聞網”的一篇發布于1999年的報道顯示,在當時,大約有八成的系統最后都是用第二種快速補丁的方式修復的。相比一勞永逸的全盤重寫,快速補丁的方式的成本優勢非常明顯,然而即便如此,全世界的預估修復成本加起來也高達3000億美元……

        當面臨一個足夠大的問題的時候,相信一般人的正常反應,都是“這個問題遲早得徹底解決”,并且也會傾向于一勞永逸地解決問題。

        然而在當時,人們沒有選擇一勞永逸,而是選擇了打補丁,還有另一層考慮,也即:這些系統已經足夠老了,在未來的20年里總是要還的,所以沒必要一勞永逸的重寫了,反正到時候換新系統的時候,把日期時間的問題搞好,不就行了。

        對此,倫敦經濟學院的 Dylan Mulvin 教授表示,“Windowing 即使在當時也是所有可選方案中最差的一個,它就是把皮球踢給后人的做法。

        果不其然,當新系統替代舊系統的時候,當年的編程思路,仍然被繼承了下來了……

        事實上,到了2020年的時候,一些千年蟲修復過的系統,以及新安裝的系統,都又一次出現了和千年蟲幾乎一樣的問題:Y2K20 bug.

        比如,在當時有些用戶驚訝地發現,他們從寬帶公司收到的賬單顯示日期為1920年:

        游戲公司 2K 開發的摔角游戲《WWE 2K20,也在游戲標題里這一年的第一天的第一秒就宕機了:

        當時紐約市的很多停車自動繳費機,也因為系統時間錯誤而觸發了防火墻機制,無法接受****支付:

        結果你猜怎么著?這些故障,很快就被修復了。

        至于他們采用了哪種思路——是一勞永逸,還是快速補丁——你應該也能猜出來了……

        如果說人類一定有什么做不到的話,那一定是從歷史中吸取教訓。

        緊接著,Y2K21 bug 又來了。比如,去年美國氣象局 (NWS) 的官方數據庫出現了重大誤差,對外提供的接口的數據晚了足足一天,導致很多第三方機構的天氣數據都出現了錯誤,影響了民航、海洋捕撈、畜牧養殖等諸多行業的正常運作。

        也有一些普通用戶發現,自己的電腦夢回1921年了:

        再然后,2021年也翻篇了,Y2K22 bug 也毫無懸念地按時來到了……

        除了這次微軟 Exchange Server 出了故障之外,一些本田車主也發現,他們的車每天早上啟動都會把時間自動跳回到2002年。

        汽車專業人士調查分析發現,本田車載系統的問題原因和微軟一樣,都是出在 Int32 整數上,開頭22的字符串無法被讀取,在本田這里就變成時間回退到2002年了……從2004到2012年的上百款車型都有較高幾率遇到此問

        在公開場合,本田公司發言人表示,目前還在調查這個問題的具體原因。不過有車友在論壇上發帖表示,本田公司派人聯系他們,說這個問題會在今年8月份自行消除……

        在可見的未來,Y2K23, 24, 25...各種各樣的問題還會陸續發生。

        并且,已經在各種計算機系統中廣泛采用的 Unix 時間戳,還會在32位系統中導致一個問題,使得某些軟件在2038年1月19日3時14分07秒后無法工作:

        對于”2038年問題“,整個行業(特別是硬件壽命極長的嵌入式行業)的應對方式,和21年前如出一轍:反正到了2038年的時候,應該新系統又換了一茬了吧,到時候再說吧……

        看來,大家根本不想徹底解決”千年蟲“以及其衍生問題。

        可這又是為什么?

        | “一勞永逸”,不如多勞多得?

        對于千年蟲這樣反復出現的情況,有人開玩笑說是程序員埋的坑

        至少在千年蟲肆虐的時候,那些 COBOL 老古董程序員被請出山來修復問題的時候,就有人質疑:他們是不是當年故意給我們埋的坑啊?

        這種想法有它的道理:程序員的職業生涯是有限的,不是所有人都能升到高管。那么那些平庸的程序員,如何保證在自己臨到退休的時候還能夠被需要?

        埋個只有自己才懂得怎么修的漏洞,也沒什么毛病?20年一個周期,正好覆蓋從大學畢業到中年不惑……

        當然,實際上在具體操作中,大多數運作計算機系統的公司,在事故發生的時候,也一定會更傾向于選擇速度快、見效快、成本低的修復方式。

        所以,程序員也不是什么陰謀家,因為他們不是決策者——他們只是在正確的時間,執行了對大家都合適的解決方案而已。

        注:封面圖來自于Business Insider,版權屬于原作者。如果不同意使用,請盡快聯系我們,我們會立即刪除。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        溫濕度控制器相關文章:溫濕度控制器原理
        熱電偶相關文章:熱電偶原理


        關鍵詞: 千年蟲

        技術專區

        關閉
        主站蜘蛛池模板: 麻城市| 忻州市| 枣阳市| 蒙自县| 凤翔县| 阜新市| 茶陵县| 乌鲁木齐县| 镇康县| 孟村| 浏阳市| 扶绥县| 潼南县| 南部县| 类乌齐县| 伊吾县| 仁布县| 潞西市| 阳山县| 海宁市| 柳林县| 广河县| 弋阳县| 海林市| 宾川县| 涟源市| 阳高县| 措勤县| 磐石市| 江北区| 瑞安市| 贺兰县| 拜泉县| 叙永县| 孟村| 陈巴尔虎旗| 雷山县| 海原县| 江源县| 奉化市| 泗洪县|