5 月 4 日在五一假期的最後一天,從上午開始很多朋友陸續發現自己的擴展被禁用,無法安裝新擴展,這種情況一直持續到當天晚上,我們放出了熱更新,但用戶需要等待一段時間才能接收到,且關閉了實驗項目的用戶需手動操作。隨後為了修復這個問題我們陸續發布了 66.0.4、66.0.5 兩個小版本,對於使用 52-60 等不支持版本,和 61-65 非最新版的用戶,也可以通過安裝擴展的方式恢復使用。

問題發生時是在假期,這多少減少了遇到此問題的用戶數,Firefox 的現有機制決定了我們並沒有多少有效且及時的方式來快速的解決這件事。從統計數據來看,有 60% 的用戶安裝了擴展,中國用戶由於同步機制的存在可能要更高。無論是什麼原因,當一個問題會影響超過 60% 的用戶時,都是不能被忽視的。考慮到部分用戶為了接收熱更新被迫開啟了實驗項目,Mozilla 刪除了 5 月 4 日至 11 日收集的所有遙測數據。這篇文章會說明為什麼會發生這件事,已經後續的止損,修復是如何進行的。

我會從研發與運營兩側來說明對該問題的應對。

背景:擴展的簽名機制

擴展在 Firefox 中安裝運行需要被簽名,簽名的流程是根證書離線存於硬體安全模塊(HSM)中,根證書用於簽署新的中間證書,中間證書用於簽署最終實體證書,後者又簽署單獨的附加組件。中間證書是保持在線的,每隔幾年需要由根證書重新簽署。

每個附加組件(包括擴展、語言包、主題)都由其自己的終端實體證書籤名,但幾乎所有附加組件都共享一個中間證書。正是這個證書遇到了問題:它在 5 月 4 日凌晨 1 點(UTC)過期,使用該證書籤名的附加組件將無法載入到 Firefox 中,5 月 3 日下午 6 點(UTC)有同事意識到了這個問題,開始著手修復。問題發生時對應的北京時間大約是上午 9 點,部分用戶沒有立即感知到擴展被禁用是因為 Firefox 對附加組件有效性的檢查不是及時的,如果檢查的時間晚於接收熱修復的時間,那麼可能不會受此問題的影響。

修復過程

  • 控制損害

首先,我們禁止簽署新的附加組件(因為當時的證書已失效),通過 Normandy 研究系統推送第一個熱修復,目的是禁止重新驗證附加組件上的簽名,避免影響尚未重新驗證附加組件有效性的用戶。

  • 方案制定

大致的方向是,我們可以重新簽名擴展,或讓 Firefox 先「接受」過期擴展,然後嘗試修復中間證書。沒有選擇第一種方案的原因有兩個:

  1. AMO 存在大量擴展(超過 15000 個),簽名未針對批量完成進行優化,重新簽名每個擴展會耗費大量時間。
  2. 擴展被簽名後用戶需更新所有擴展(自動檢查更新約需 24 小時),對非 AMO 安裝的擴展用戶需要手動更新。

相比而言第二種方案幾乎不需要手動幹預,且需要花費的時間更短,所以之後的修復集中在這個方向上。

針對方案二,我們推送了第二個熱修復補丁,用於更改 Firefox 驗證證書的日期,使現有擴展正常工作,然後用新生成的有效證書,替換原來的過期證書。

從發現問題,到推送補丁修復花了大約 9 個小時,用戶保守估計會在 6 到 12 個小時內收到。為什麼會花這樣一段時間,首先簽發新的中間證書需要時間,因為根證書位於離線儲存的硬體安全模塊,極大的保證了安全性,但對於簽發新證書顯然很困難,必須要進入 HSM (硬體安全模塊)找到安全位置,做一些可能的嘗試,才能簽發完全正確的證書,而且每次嘗試都需要花費一兩個小時的測試才能確切知道嘗試是否正確。其次開發系統附加組件(SAO)需要一段時間,在測試好後進行簽名,由於開頭所描述的簽名系統被禁用了(……)這裡又進行了一些其他方法。

發布後用戶收到的時間是由 Normandy 研究系統完成的,這套系統是之前用於進行實驗性項目完成的,用戶收到 SAO 後會自動運行,由於它提供了訪問 Firefox 內部 API 的許可權,這讓我們有辦法通過這種方式將新的證書加到 Firefox 用於驗證的證書庫中。

這個選項在 Firefox 隱私與安全 設置中,第一次啟動時會詢問用戶是否開啟,但也有部分用戶關閉了這個選項:

Normandy 每次更新請求間隔是 6 小時,對應於 about:config 中 app.normandy.run_interval_seconds,如果沒有收到更新不會重新請求,這也是為什麼不是所有用戶會在 6 小時內確保收到更新的原因。

SAO 修復沒有解決以下幾種情況:

  1. 禁用遙測或實驗項目的用戶
  2. Firefox for Android
  3. 部分 Linux 發行版
  4. 使用代理或部分殺軟會攔截補丁推送
  5. 舊版本的 Firefox

Android 版用戶在當時可通過修改 about:config 中 xpinstall.signatures.required,但修改 config 的方式一定不是官方所推薦的。其他不生效的原因例如設置了主密碼等,為瞭解決這些問題,我們發布了 66.0.4 和 66.0.5(包括 Android 版),用戶更新到最新版本可以解決上述問題。

對於舊版本和不再支持版本的用戶,可分別安裝以下擴展:

Disabled Add-on Fix for Firefox 61 - 65 – 下載 ?? Firefox 擴展(zh-CN)?

addons.mozilla.org
圖標
Disabled Add-on Fix for Firefox 57 - 60 – 下載 ?? Firefox 擴展(zh-CN)?

addons.mozilla.org

Disabled Add-on Fix for Firefox 47 - 56 – 下載 ?? Firefox 擴展(zh-CN)?

addons.mozilla.org
圖標

此事件導致的其他問題有:

  1. 被禁用的擴展數據不會受影響,但移除擴展或清理過配置文檔的無法恢復。
  2. 一些 Container 擴展,例如 Firefox Container,Facebook Container 啟用後數據可能無法恢復,需要重新設置(有一個相關的 Bug 會對此問題進行改進)
  3. 主題需要被激活,同理如果主頁和搜索是由擴展控制,也會被重置到默認值。
  4. 使用其他論壇討論的關於此問題的一些修復方法,雖然很有用,但部分影響了後續修復的進行。(瑕不掩瑜,我非常感激一些社區朋友幫我說了官方不能提供的解決方法,後面會在運營側提到)

綜上是關於這次問題的技術說明,我們需要一個更好的方式跟蹤 Firefox 內部可能存在的問題,以確保意外不會發生,另外目前的修復方式推送至用戶依然偏慢,SAO 不是一個好的修復方式,並有一些副作用產生。我們仍需要一種能夠快速推送更新的方式,並且使用戶保證既能接收到更新,又能選擇不接受其他不需要的推送。問題發生在週末,我們期望在工作日前修復,但少部分用戶仍在之後幾天才收到更新。


問題發生時彙集了一份文檔,包括關於此問題的更新和相關負責人,以確保用戶能得到及時,正確的信息。

需要明確的點有:

  1. 事件發生的背景
  2. 用戶可以從哪些渠道得知問題的最新進展
  3. 收集的一些用戶反饋
  4. 後續工作

背景上文已說明,簡單來說,是由於附加組件簽名中間證書過期,導致現有和新擴展無法運行或安裝。在用戶知道發生了什麼以後,支持團隊需要:1)確保用戶可以知曉解決方式。2)快速處理大量提問。3)瞭解當前進展。

問題剛剛發生時,大量用戶進入各種官方的平臺反饋,Bugzilla 上有非常多重複的 Bug,這些大量的反饋會使運營人員疲於應對,難以發現有價值的信息,對這種情況,相關同事修改了一些頁面的置頂橫幅,指向 SUMO 對應頁面,Bugzilla 置頂橫幅指向對應 Bug,因為 SUMO 頁面是靜態多語言頁面,且會隨著進展而更新,相比於討論這種方式更簡單粗暴。原先指向的是 Discourse 的頁面,負責此問題的同事在帖子中更新進展,但由於訪問量過大直接 Web 響應錯誤。

準備好一套快速回復機制,用於解答可能遇到的問題,並提供給所有員工和運營人員。但不能推薦一些例如需手動修改 about:config,其他渠道獲得的補丁,雖然可能我瞭解這種修改方式也是熱修復正在做的。為了避免一切可能造成的影響,當時用戶最好的方式就是等待,什麼都不要做。

以上策略用於控制已知問題,伴隨而來的一些其他情況我們也通過用戶反饋獲知並整理在列表中,列表主要包含三項:1)問題詳情。2)來源鏈接。3)解決方案,如何跟進。然後更新上面的快速回復機制。

一些做了部分,或應該做而沒做的事:

  • 雖然與很多可以提供幫助回復用戶的社區人員聯繫,但沒有覆蓋到所有
  • 缺少一個官方途徑感謝提供幫助的這些人
  • 適當的與媒體聯繫,告知具體情況,以免由於信息不完全導致的誤解(比如有些媒體認為證書過期是由於我們忘續費了)

感謝 百度 Firefox 吧 的各位吧主和社區,微博幫忙回復的朋友,以及瞭解情況後原因等待一些時間來修復的用戶??


推薦閱讀:
相關文章