導讀 : 這個Bug涉及到Unix時間戳的問題。

i黑馬訊(楊博丞)2月16日報道  蘋果用戶被“坑”了,原因是如果你把iPhone的時間設定為1970年1月1日,然後關機再開機,手機就很有可能變成一塊“磚頭”。

據說,目前運行iOS 8或更新系統的64位處理器設備幾乎無一幸免,32位處理器設備則沒有受到影響。

這則消息讓不少蘋果手機的使用者“炸開了鍋”,甚至有不少人好奇,非要嘗試一下,結果使得愛機成功變磚。

不過,“聰明”的人為了試驗,專門跑去蘋果零售店去把展示用的iPhone、iPad都給修改了……事實上,這種操作對於體驗機是無效的,因為蘋果店里的展示機均帶自動恢複功能,不管做了什麽操作都可以自動恢複,修改時間對這些手機也不會有影響。

今日,蘋果官方對此事正式做出了回應, “如果將系統時間手動設置為1970年5月或者更早,iPhone、iPad、iPod touch將會無法重啟,這是一個Bug,將會在接下來的iOS版本更新中修複這一問題。”

2038年後,很多軟件將運行異常

關於這個bug,你需要了解一個Unix時間戳的概念。

Unix時間戳是指,從1970年01月01日 0:00:00的值為0,以秒為單位,即每過一秒,二進制數字加1,不考慮閏秒。在大多數情況下,UNIX時間戳把時間儲存為32位,而這個數值不能小於零。

一個小時表示UNIX時間戳格式為3600秒

一天表示UNIX時間戳為86400秒

一年表示UNIX時間戳為31556926秒

這些換算格式均不計算閏秒。那麽所看到的UTC時間就是從1970年這個時間點起,到具體時間共有多少秒,而這個秒數就是Unix時間戳。

可能說到這里有人會問,為什麽Unix時間戳的值被設定為0?

這還要從Unix誕生說起。Unix於1969年發布雛形,最早是基於硬件60Hz的時間計數。到了1971年底《UnixProgrammer's Manual》一書出版,其中定義的Unix Time是以1971年1月1日00:00:00作為起始時間,每秒增長60。之後考慮到32位整數的範圍,如果每秒60個數字,那麽兩年半就會再次循環一輪,但這個循環周期有136年之長。最後,改為了以秒為計數的單位,一方面考慮到所有電腦文件不可能在1970年前創立,又考慮到方便記憶和計算方便,所以就變為了現在的1970年。如果你需要表示以前的時間,那麽一般只能用自己定義的數據結構。

通俗易懂地說,Unix 時間戳就是一串數字串。但按我們剛才所講Unix時間戳的規定,換算值是不能小於零的,一旦小於零則會出現無法工作的問題。

那為什麽只有64位處理器的設備才有時間bug?這是64位處理器的時間回歸問題所造成的。正常來說,時間流逝為正數,但需要註意的是時間會受到時區的影響。

屏幕快照 2016-02-16 下午2.59.01

屏幕快照 2016-02-16 下午3.42.06

我們對此進行了換算試驗,我們首先以UTC(世界標準時間)時區1970年1月1日0時0分0秒為界限,得出的數值為-28800,而將時間調至同樣日期的8時0分0秒時,得出的數值為0。時間正常流逝為正數,反之為負數。不過各位需要留意的是,時間受到時區的影響。

所以這就產生了一個問題,出現時間負值,一旦出現負值,時間就會回歸觸發Bug,系統啟動卡在Kernel階段,時間錯誤,無法繼續進行啟動。

而有網友說,搭載32位系統的iPhone不受這個問題,但你們有所不知的是,當32位的系統時間往大調時,同樣會出現如同64位系統1970年的類似問題,這個Bug被稱作2038。

最初計算機操作系統是32位,而時間也是用32位表示。32位能表示的最大值是2147483647。而一年的總秒數是31536000,2147483647/31536000= 68.1

也就是說32位能表示的最長時間是68年,而實際上到2038年01月19日03時14分07秒,便會到達最大時間,過了這個時間點,所有32位操作系統時間便會變為10000000 00000000 00000000 00000000,也就是數值位全部向前進1,導致符號位被置為1,其余31位全部為0。屆時,將會出現時間回歸的問題,很多軟件就會運行異常。

而64位系統會不會受到這個影響呢?通過計算我們得到,292,277,026,596年12月04日15時30分08秒是64位系統可以到達的最大時間。

也許此時,有些既好奇又細心的朋友去做“試驗”,但你們一定會發現iOS系統可以設置的最大時間只能是2038年1月1日,不能再往後設置。這是因為蘋果事先已經考慮到了這個問題,為了避免此問題,蘋果將最大時間期限定在了2038年1月1日 23時59分59秒。即便超過範圍也不會出現大問題,而且在那時32位的系統已經基本淘汰了。但為何蘋果沒有考慮到1970年的時間回歸問題呢?

目前蘋果已經表示將在下一版本更新中修複該問題。如果黑客利用此Bug通過無線局域網發出範圍性攻擊,後果將不堪設想。

不過,值得一提的是,當iOS設備連接到公共網絡時,iOS系統將會使用NTP服務對時區、時間進行校準。如果黑客發送惡意的NTP攻擊,將iOS系統時間校準至UTC<0的時間,那麽所有用戶設備均會受到此bug影響,在重新啟動設備後無法使用設備。

屏幕快照 2016-02-16 下午4.42.01

如果已經變磚,你該怎麽辦?

1.你可以拿著變磚的iPhone去找蘋果售後求助。蘋果官方稱,受到該問題影響的任何用戶都應該聯系蘋果技術支持以尋求幫助。但處理方式不盡相同,有的用戶表示已經被整機更換。

2.“民間高手”解決方案。切斷iOS設備電源,放置10分鐘後再重新連接電源,設備之後會重置時間,問題便得以解決。不過,想要切斷iOS設備電源意味著,需要拆機並拆出電池,當然這僅限於iPhone,你要知道iPad的是無法拆卸電池的。

3.電量充足情況下,等待數小時,當Unix時間戳的數值大於等於0,系統時間生效,便可正常開機。