RFC-0134:軟體更新時間依附元件

RFC-0134:軟體更新時間依附元件
狀態已接受
區域
  • 軟體推送
說明

移除時間同步功能,不再視為軟體更新的依附元件。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2021-07-24
審查日期 (年-月-日)2021-10-06

摘要

這項 RFC 會移除時間同步功能,不再視為軟體更新的依附元件。

提振精神

在 Fuchsia 裝置同步網路或即時時鐘的時間之前,裝置會回報固定的「回溯」時間。目前的時間回報功能會回報基本映像檔建構作業的預估時間,但這可能會是幾個月前的時間。

與其他早期啟動時間使用者不同,系統更新檢查不會等待時間同步。如果在更新檢查期間未同步時間,套件解析工具可能會間接使用備用時間,做為 TLS 憑證驗證的一部分。這會導致以下問題:

  1. 如果備用時間早於憑證建立日期,更新作業就會失敗,並顯示 CertNotValidYet 錯誤。由於更新和套件伺服器可能會透過不同的名稱存取,因此這個錯誤可能會發生在多個元件中。在這種情況下,如果時間同步處理作業中斷,裝置就會卡住,且不會再更新。
  2. 在備用時間內有效的已過期憑證,可用於提供更新回應和套件。

移除時間同步作業 (做為軟體更新程序的依附元件) 可解決第一個問題,並讓更新作業更可靠。

設計

這項 RFC 建議軟體更新不應依賴準確的時間。

也就是說,這項功能會:

  • 允許憑證的有效期間在未來。

  • 一律使用備用時間來驗證憑證,即使時間已同步也一樣。

實作

您必須實作自訂 TLS 憑證驗證器,並在 omaha-clientpkg-resolver 中使用。

建構期間,驗證器會從世界標準時間時鐘物件的 ClockDetails 取得備用時間,並將其保留為結構體的欄位。

驗證器會使用 WebPKIVerifier 實作 ServerCertVerifier 特徵,並搭配傳回備用時間的時間函式,如果 WebPKIVerifier 傳回 CertNotValidYet 錯誤,則使用證書有效期間內的時間建立另一個 WebPKIVerifier,然後再次呼叫。

成效

自訂驗證器只需為順利路徑包裝 WebPKIVerifier,且只會在第一次呼叫傳回 CertNotValidYet 錯誤時呼叫 WebPKIVerifier 兩次。

人體工學

回溯相容性

API 沒有任何變更。

安全性考量

這項設計會將下列憑證視為有效:

  • 已過期的 TLS 憑證,其時間晚於備用時間
  • 未來的 TLS 憑證

雖然這不是理想情況,但第一種情況今天就會發生,因此並非回歸,而第二種情況的風險也非常低。

此外,即使裝置遭到誘騙而安裝惡意更新,我們仍會執行驗證,因此裝置不會開機,並會恢復原狀。我們也提供回溯保護機制,因此已簽署的舊版也不會運作。

請注意,攻擊者使用遭到入侵的憑證和 DNS 控制項,可能會欺騙時間系統接受任意時間,因此即使我們讓更新檢查等待時間同步,也無法解決這個問題。

憑證撤銷不在本 RFC 的討論範圍,但在其他 RFC 中會是個值得探討的領域,不過這類解決方案可能需要將過期憑證列為無限期撤銷。

隱私權注意事項

不會影響隱私權。

測試

全面測試自訂憑證驗證器,確保日後只在所有其他項目皆有效的情況下,才會接受憑證。

針對 omaha-clientpkg-resolver 進行整合測試,確認更新功能可在非常久以前的時間運作。

說明文件

缺點、替代方案和未知事項

替代做法:等待時間同步

在這個模型中,我們會等到時間同步後才更新,雖然這會帶來一些安全性優勢,但由於時間同步也可能遭到入侵,因此實際上並沒有太大幫助。此外,這個模型會讓更新作業依賴時間同步,而時間同步可能會因各種原因而中斷,導致更新作業的可靠性降低。

替代做法:等待時間到達,但在期限過後才更新

在這個模型中,我們會等待一段時間讓時間同步,如果時間尚未同步,則在一段時間後執行更新檢查。

雖然這可解決先前替代方案的主要缺點,但在其他方面仍有缺點。延遲時間是任意的:如果裝置陷入的啟動循環時間比這個延遲時間短,也永遠不會更新。

此外,我們仍仰賴備用時間,這可能表示我們需要放寬憑證驗證的嚴格程度。

既有技術與參考資料

ChromeOS 沒有這個問題,因為它沒有備用時間,而且沒有在 1970 年有效的 Google TLS 憑證。