近日,Mozilla 檢測到 Firefox 出現了大量崩潰事件,這個問題主要發生在使用 Linux 系統的用戶身上,尤其是使用基于舊版本 Debian 的 Linux 系統上。
經過調查,Mozilla 最后發現這個問題并非由 Firefox 本身引起,而是涉及到 Linux 內核和 Google 的 JavaScript 代碼。
這些崩潰事件發生的十分突然,一開始 Mozilla 檢測到數以千計使用一個名為 Huayra 的 Debian 發行版的用戶受到影響,特別是 Huayra 5(基于 Debian 10)。后續的持續檢測發現,這個問題影響了幾乎所有基于舊版本 Debian 的發行版。
崩潰事件也并不是隨機發生,而是能夠 100% 復現。用戶只要在 Google 上搜索圖片 Firefox 就會出現崩潰,這個問題影響了所有版本的 Firefox 瀏覽器 —— 無論是最新版本還是非常老的版本,都會崩潰。
結合上面兩個條件,Mozilla 的研究人員認定這個問題不是由 Firefox 這邊引發的,問題應該是出在 Google 和舊版 Linux 那邊,并開始分析這個問題發生的原因。
Mozilla 隨后開始分析 Firefox 在崩潰時的行為,發現崩潰發生在堆棧探測期間。JIT 觸及了為下一個 JavaScript 調用保存變量的區域,并不知為何導致了溢出。
第一個奇怪的地方在于,Mozilla 發現 Google 最近對其圖像搜索頁面進行了更改,該頁面現在有一個 JS 函數,Google 在這個單獨的函數中分配了 20000 個變量。進一步分析發現,這個函數可能是由 AI 生成的代碼。
雖然發現了有這樣的問題,不過理論上 Firefox 應該依然不會出現崩潰才對,因為 Linux 會自動擴展堆棧,Mozilla 團隊也已經預留了足夠的空間,隨后他們通過查看受影響進程的內存確認了這一點。
在執行此操作之前,我們進行了堆棧檢查并驗證了我們分配的額外堆棧內存量不會溢出我們為自己設置的本機堆棧限制。因此,似乎存在我們自我施加的限制與操作系統限制之間的分歧。這在某種程度上取決于發行版,但很混亂:例如,它影響 Debian 10 但不影響 Debian 11。
隨后 Mozilla 團隊將檢查重點放在了 Linux 內核上,結果發現 Linux 內核曾經有一個檢查,可以防止對堆棧的訪問離堆棧指針太遠。特別是在 64KiB+256 字節以外的訪問會產生崩潰,而不是擴展堆棧。這個問題在 Linux 4.20 中被修復了,所以使用較新的發行版的用戶不受影響。
根據測試,Google 似乎已經在圖片搜索中修復了這個問題,不過 Mozilla 仍然在著手研究解決方案,看看是否能為還在使用老系統的用戶一勞永逸解決這個問題,以免未來發生同樣的情況。
Google 在一個函數中放入 2 萬個變量,引發 Firefox 崩潰 - 知乎 https://zhuanlan.zhihu.com/p/639443183