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

制作 | OSC オープンソース コミュニティ (ID: oschina2013)

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

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

b3bdf52bd04e8a0076f863522c9ed0ff.png

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

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

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

dcf66b65a489161e86138ace0c7ae869.png

その後、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 は依然として古いシステムを使用しているユーザーのためにこの問題を完全に解決できるかどうかを確認するための解決策に取り組んでいます。将来的には起こりません。

関連リンク: https://hg.mozilla.org/mozilla-central/rev/304d01f5488b

------

質の高い技術交流グループを作りました、優秀な人たちと一緒にいると自分も優秀になります、今すぐクリックしてグループに参加し、共に成長する喜びを感じてください。さらに、最近転職したい場合は、1 年前に 2 週間かけて大手工場からの対面経験を集めました。フェスティバル後に転職する予定がある場合は、ここをクリックして獲得できます

推奨読書

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

こんにちは、私はプログラマーの DD で、Alibaba Cloud の MVP、Tencent Cloud の TVP として 10 年間ベテランドライバーを開発してきました。一般的な開発からアーキテクト、そしてパートナーまで。その過程で、私が最も深く感じているのは、私たちは学び続け、フロンティアに注意を払わなければならないということです。忍耐して、もっと考えて、愚痴を少なくして、一生懸命働くことができれば、カーブで追い越すのは簡単です。だから、私が今やっていることをやるには遅すぎるかどうかは聞かないでください。何かについて楽観的である場合は、希望が見えたときだけ耐えるのではなく、希望が見えるまで耐えなければなりません。信じてください、あなたがそれを続ける限り、あなたは今よりも良くなるでしょう!まだ方向性が決まっていない場合は、まず私に従ってください。コーナーリングや追い越しのための資本を蓄積するのに役立つ最先端の情報をここで頻繁に共有します。

おすすめ

転載: blog.csdn.net/j3T9Z7H/article/details/131427484