【明報專訊】千禧後總愛把Y2K掛在嘴邊舉一個反向「yeah」手勢,開閃光燈高炒拍照,戴上復古的飾物,走在潮流尖端。跟着潮流走,是否一定好?美國西南航空被認為使用老舊的Windows系統,成功逃過7月19日的藍屏災難。事緣負責Microsoft Windows系統安全的網絡安全公司CrowdStrike的防毒軟件更新出現bug,搞垮了大部分Windows系統,全球電腦大規模死機,航空公司首當其衝,讓網民重提24年前預想會擊潰全世界電腦系統的千年蟲問題(Y2K),近期更興起討論另一「千年蟲」Y2K38……
Y2K38問題源自UNIX系統時間
還有4900多天就到Y2K38發生之日,我們要如面對千年蟲問題時般嚴陣以待嗎?香港中文大學工程學院副院長(外務)兼系統工程與工程管理學系教授、立法會議員黃錦輝卻淡然說Y2K38沒千年蟲問題般嚴重。Y2K38問題指部分電腦軟件或於「協調世界時」(UTC)2038年1月19日3時14分07秒後無法運作,因為大部分電腦作業系統沿用UNIX系統的時間表達方式,運算從1970年1月1日0分0秒開始到現在的秒數,不考慮閏秒。閏秒即協調世界時為確保原子鐘與地球自轉時間相差不超過0.9秒,而加減時間的1秒,惟國際度量衡局於2022年會議上,投票通過最遲於2035年取消閏秒。黃錦輝解釋,電腦操作系統使用4位元組整數(4-byte integer)儲存時間數據,原可儲存大至2的32次方數值,但系統會以最左方位元(bit)記錄正負數,故此只能儲存2的31次方數值,減去最初的0數值,最多可儲存2,147,483,647秒。由1970年1月1日0分0秒起計,那就是2038年1月19日3時14分07秒了,過了這個時間,時間數據就超出可存範圍。屆時電腦出現整數溢出錯誤,無法記錄2038年1月19日3時14分07秒以後的時間戳(timestamp),可能出現的問題包括無法讀取部分在1970 年後建立的文件。這問題可藉轉用更大的位元組整數儲存時間數據來解決。
千年蟲跟全球Windows死機不同
12年前的2012世界末日預言,有人當笑話一則,有人寧可信其有,問人:如果我們平安度過2012年世界末日,你會……?每當出現關於災難的傳聞,人類或三智五猜,或提心吊膽,這突顯人類的渺小。24年前我們面對千年蟲問題亦是如此,回溯至1998年,當時政府推出廣告,呼籲:「電腦千年蟲會喺2000年1月1日侵襲各類型嘅電腦系統,以及電子控制嘅設備,立即行動,殲滅千年蟲」,該宣傳動畫以一隻隻蟲攻擊電腦的畫面作警告。連政府也號召市民滅蟲,可以想像千年蟲一旦發生的嚴重程度。不過黃錦輝說,他當年沒擔心過Y2K問題,也沒事先做預防措施,「一來我工作範疇不在operating system(電腦作業系統),我寫的program(程式)所牽涉的應用與Y2K無太大關係」。
千年蟲果真是一條蟲嗎?黃錦輝簡單解釋,千年蟲問題有點類似平日的軟件系統更新,系統有時會設定某日某分某秒自動升級,這時便有人教路,如果不想自動更新,就更改電子設備的預設時間到系統更新之後幾日「呃部機」,但這方法不適用於解決千年蟲問題,因為當時電腦對時間表達的設計有限制。1999年之前的電腦為節省硬體成本,電腦系統以6個數字儲存年月日的時間數據,年份以兩個數位顯示,即「1999年會寫作99,當時只用0至99記年份,那麼踏入2000年寫為00,但00可代表1900」,當時流傳電腦會出現誤讀問題,造成系統錯誤。黃錦輝記得傳聞說若不處理Y2K問題,「(電腦)好多時間上的東西都無法計算,直接影響金融機構」。當年千年蟲問題並未真正造成大規模的嚴重影響,黃錦輝說這或多虧人們針對Y2K的年份顯示問題作出電腦更新。他說千年蟲問題是電腦邏輯運算出錯,而非作業系統讀取無效或未經許可的主記憶體位址出現的核心(kernel)錯誤,不能與19日發生的全球Microsoft Windows系統死機問題相提並論。
測試百萬次 漏洞或第一百萬零一次出現
那麼Microsoft Windows系統死機是如何發生?這源於CrowdStrike為Windows感應器釋出內容配置(content configuration)更新,以遙距蒐集潛在威脅電腦安全的新型技術數據。CrowdStrike一般以兩種形式發放更新,一種是CrowdStrike感應器附帶的「Sensor Content」,另一種是快速應對安全威脅持續變化的「Rapid Response Content」。是次Windows系統癱瘓源於「Rapid Response Content」通過驗證的數據存在缺陷,讓系統感應器載入問題內容時,存取了超出界限的數據,令Windows系統出現「藍色熒幕錯誤畫面(Blue Screen of Death,BSoD),我們會看到「:( Your PC ran into a problem and needs to restart. We're just collecting error info and then we'll restart for you(你的個人電腦出現問題,需要重新開機,我們正蒐集相關錯誤的資訊,然後我們會為你重啟電腦)」的藍白界面。
何謂存取超出界限的數據?黃錦輝解釋,在電腦科學中,變數(variable)是儲存資料的容器,指針(pointer)則儲存變數的位置,讓電腦直接存取該變數的數據,而變數範圍(scope)劃定了可存取數據的變數邊界,當指針存取超出範圍的數據便是「out of bound(越界)」。黃錦輝稱 「out of bound」是常見的程式異常情况,他每次教學生寫program都叮囑一定要做bounds checking(邊界檢查),檢查變數的值是否處於範圍內。他說一般寫program會除錯(debugging),修正和減少程式錯誤,他未試過因「out of bound」釀成大錯。而預防系統誤讀超出界限的數據其中一個方法是,在內部儲存裝置設定存取權限,讓用戶的電腦跳轉至一個「救急program」,警告用戶不要存取範圍外的記憶體位址,這也好比我們平日瀏覽網站,欲click入網站上其他未知連結時,會彈出的「不安全網站」警示。用遊戲來打個比方,你的角色被設定只能在某個房間活動,但你偏要走到其他房間,觸發該房間裏的機關,令該房間發生爆炸。電腦也是如此,倘讀取設定範圍外其他程式的資料數據,就如「觸碰到不被允許的東西」,令系統故障。既然程式設計師會為程式除錯,為什麼還會出現問題?黃錦輝表示,「一般做testing有個限度,不會無限check,可能試1000次、100萬次都無問題,就覺得OK了」,殊不知那程式漏洞會在第一百萬零一次試驗出現,先前卻未能偵測。
審視現有不足 從錯誤中學習
以往Windows系統出現一些errors(錯誤)時,都可靠重新開機解決,但今次由於CrowdStrike的軟件更新錯誤位於Windows內核檔案中,故「無論怎麼重啟電腦,也只是讀取相同的錯誤數據」。為何這次CrowdStrike事件只有Windows系統受影響,Mac和Linux作業系統則相安無事?黃錦輝說這視乎涉事程式與哪個作業系統耦合(coupling),即它們之間互相聯繫。預防程式錯誤的措施是為系統做備份,甚至開發另一個軟件做backup,他說這雖是老生常談,但「一個軟件冧咗,仲有另一個頂住,做backup永遠都啱」。
回想19日Windows系統崩潰,全球混亂的景象,香港國際機場須人手辦理登機手續、澳洲多間銀行的應用程式異常,英國部分醫院服務因無法調取醫療紀錄而受阻等,人們意識到科技的脆弱。在這電腦系統「互聯互通」的年代,一個系統錯誤足以讓世界癱瘓。但黃錦輝說我們仍要擁抱科技,別因負面的東西而「斬腳趾避沙蟲」,反應從意外中學習如何改進,審視現有電腦系統的不足。