01/13/2022 Firefox 當機事件回顧

如文章標題所示,這其實是發生在好段時間前的事了,但直到最近,腦袋才比較有空可以認真看一下相關的細節。話說在 1 月 13 日當天下午,包含 DR 自己、以及公司內其他少數有在使用 Firefox 瀏覽器的同事,都發現網頁突然皆無法開啟。除此之外瀏覽器也無法正常關閉,只能從背景殺掉。但殺掉重啟後狀況依舊,開啟網頁都卡住不動,而同時間其它瀏覽器都是正常的。

 

雖然 DR 個人蠻期望 Firefox 能夠擁有更多的使用者,但諷刺地,正是因為公司內 Firefox 使用者不多,不然這真的會是大事件。而網路上當然也是有哀號聲,於是循線找了一下(1749908 - Infinite loop in HTTP3 hangs socket thread),發現若透過 about:config,停用 network.http.http3.enabled 參數,也就是將 HTTP/3 通訊協定停用,則 Firefox 便能夠恢復正常。

 

然而已知 Firefox 早在 2021 年 4 月的 88 版起,便已啟用 HTTP/3 支援。而且也已經有許多網站是使用 HTTP/3,例如那些有使用 Cloudflare CDN 做代理的網站,啟用 HTTP/3 已經是預設值了。過去看起來都可以正常使用,怎麼會是突然間出現與 HTTP/3 有關的問題?

 

另一項可行的解法則透露出了其它的線索,是將 Firefox 的遙測(telemetry)功能整個關閉,也就是停用瀏覽器設定內所有與資料收集相關的項目,則 Firefox 同樣可以恢復正常。所以這表示是只有遙測功能的 HTTP/3 連線出現問題,但又怎麼會讓整個瀏覽器失去作用呢?

 

在事故發生接近兩個小時後,Mozilla 識別出問題的肇因並採取行動。先將遙測功能背後所連接的 GCP 負載平衡器明確地停用 HTTP/3,以防止事故的持續發生。接著再修正程式碼中的 Bug(1749957 - `content-length` is not properly parsed when using viaduct over HTTP3),並合併到後續的 Firefox 更新版本中。後續 Mozilla 也在二月發佈了一篇文章《Retrospective and Technical Details on the recent Firefox Outage》,以交代整起事故的始末。

 

事故的發生是從 1 月 13 日的某個時段起,Google 在未預先公告的情況下,變更了 GCP 負載平衡器的 HTTP/3 設定機制。其中的預設選項「自動」原本是代表停用,改成了啟用,而這因此觸發了 Firefox 內一項過去未被發掘到的 Bug。遙測功能是當時 Firefox 桌面版中唯一一個以 Rust 語言開發的元件。有別於一般元件是直接呼叫 Firefox 中負責網路連線的 Necko API,Rust 元件還需要透過一個名為 viaduct 的中介函式庫來與 Necko 互動。

 

viaduct 會將每一個標頭轉換為全小寫,再發送給 Necko,而這就形成了其它途徑所沒有意識到的問題。Rust 元件發送 Content-Length 標頭給 viaduct,viaduct 轉換為 content-length 後發送給 Necko。雖然 Necko 本身會做標頭檢查,不過它是忽略大小寫的,所以會通過檢查再發送給底層的 HTTP/3 實作,也就是 Http3Stream.cpp 中的程式碼。然而有別於前面的關卡,Http3Stream.cpp 不正確地只吃 Content-Length,所以收到 content-length 等於沒有。但連線的終止條件並沒有真的考量到此類異常,因此既沒動作也不關閉連線,佔住了 Socket 執行緒,使得後續所有網頁都無法開啟。

 

其實也不能說 Firefox 與服務互動的設計存在單點故障(single point of failure)的缺失,它本身還是有考量一旦遙測服務無法連上的情形,只是沒有預期到因為內部程式 Bug 而卡住的狀況。而另一方面,除了先趕緊將 Http3Stream.cpp 內的標頭判定修正成忽略大小寫外,後來 Firefox 的 HTTP/3 程式碼也是有再經過進一步的改寫,使其更加健全。

 

不過說實在的,DR 自己並不是很滿意 Mozilla 對此事件的反應。就技術面來說也許還算單純,但就公關層面而言就像是場災難。一個上游非必要服務的變動,就可以讓所有客戶端瀏覽器直接變得不可用。以及明明理應是一個可各自在不同環境中獨立運作的桌面應用程式,卻離奇地發生形同單點故障的全面事故。這會嚴重影響使用者對這款軟體的可靠性評價,而在此情況下,只推一個工程師出來寫篇文章陳述事情是不夠的。使用者應會期待 Mozilla 做為一間企業,能夠有一個更強烈的整體宣示。

 

如 Ars Technica 網站的文章《Is Firefox OK?》所描述的景況,最近幾年來 Mozilla 仍持續掙扎於低迷的市占率及有限的獲利來源。既然如此,Mozilla 就更應該嚴厲看待像這樣的嚴重事故,積極地向公眾揭示自己維護服務品質的立場,反映出對用戶體驗的重視,以保護並提昇自己的聲譽。

 

分類: