Google、関数に 20,000 個の変数を入れて Firefox をクラッシュさせる

最近、Mozilla は Firefox で多数のクラッシュを検出しました主に Linux システム、特に古いバージョンの Debian を使用するユーザーで発生します。

Mozilla は調査の結果、この問題は Firefox 自体が原因ではなく、Linux カーネルと Google の JavaScript コードが原因であることを最終的に発見しました。

これらのクラッシュは、Huayra と呼ばれる Debian ディストリビューション、具体的には Huayra 5 (Debian 10 ベース) の何千人ものユーザーが影響を受けていることを Mozilla が最初に検出したとき、まったく突然発生しました。その後の継続的なテストにより、この問題が古いバージョンの Debian をベースとするほぼすべてのディストリビューションに影響を与えることが判明しました。

クラッシュ イベントはランダムに発生するのではなく、100% 再現可能です。ユーザーが Google で画像を検索すると Firefox がクラッシュします。この問題は、最新バージョンから非常に古いバージョンまで、Firefox ブラウザのすべてのバージョンに影響します。

上記 2 つの条件を総合して、Mozilla の研究者は、この問題の原因は Firefox ではなく、Google と古いバージョンの Linux にあると判断し、問題の原因の分析を開始しました。

その後、Mozilla は Firefox がクラッシュしたときの動作の分析を開始し、クラッシュがスタック プローブ中に発生したことを発見しました。JIT が次の JavaScript 呼び出しのために変数が保存される領域に触れたため、何らかの理由でオーバーフローが発生しました。

最初の奇妙なことは、Google が最近自社の画像検索ページに変更を加え、JS 関数が追加され、Google がこの 1 つの関数に 20,000 の変数を割り当てていることを Mozilla が発見したことです。さらに分析を進めると、この関数はAIによって生成されたコードである可能性があることが判明しました。

このような問題が発見されましたが、Linux は自動的にスタックを拡張し、Mozilla チームは十分なスペースを確保しており、この時点で影響を受けるプロセスのメモリを調べてそれを確認しているため、理論上は Firefox がクラッシュすることはありません。

これを行う前に、スタック検査を実行し、割り当てた追加スタック メモリの量が、独自に設定したネイティブ スタック制限をオーバーフローしないことを確認しました。したがって、私たちが自ら課した制限とオペレーティング システムの制限の間には溝があるようです。これはディストリビューションに多少依存しますが、混乱を招きます。たとえば、Debian 10 には影響しますが、Debian 11 には影響しません。

その後、Mozilla チームは Linux カーネルに焦点を当てて検査を行ったところ、Linux カーネルにはスタック ポインタから離れすぎるとスタックへのアクセスを防止するチェックが存在することが判明しました。特に、64KiB+256 バイトを超えるアクセスはスタックを拡張せずにクラッシュします。この問題は Linux 4.20 で修正されたため、新しいディストリビューションのユーザーは影響を受けません。

テストによると、Google は画像検索におけるこの問題を修正したようですが、Mozilla は依然として古いシステムを使用しているユーザーのためにこの問題を完全に解決できるかどうかを確認するための解決策に取り組んでいます。将来的には起こりません。

おすすめ

転載: www.oschina.net/news/246678/firefox-crash