エクスレラ8

Chrome ゼロデイ: 「このエクスプロイトは公開されています」ので、今すぐバージョンを確認してください

Googleの最新のChromeアップデートがリリースされ、今回は同社が 言葉を切り取っていない 含まれている XNUMX つのセキュリティ パッチのうちの XNUMX つについて:

Google は、 CVE-2023-3079 野生に存在します。

これまで Google でよく見られたような、同社がエクスプロイトの「報告を認識している」と言うのに、XNUMX 段階の区別の表現はありません。

今回は「私たちはそれをすべて自分たちで認識している」ということであり、バグレポートが Google の脅威研究グループから直接提供されたものであることを考えると、これはさらに露骨に「私たちが話しているように犯罪者がこれを悪用していることを知っている」ということになります。

いつものように、これは Google が、これまで知られていなかったセキュリティ ホールによって Chrome に侵入された積極的な攻撃 (Google 自体に対するものなのか、外部組織に対するものなのかはわかりませんが) を調査していたことを意味します。

このバグは次のように簡単に説明されます。 V8 のタイプ混乱。 (当然のことながら、Google は現段階ではそれ以上のことは言っていません。)

以前に説明したように、 タイプの混乱 バグは、プログラムが解析、検証、処理し、一方向に動作するはずのデータの塊をプログラムに提供すると発生します。

…しかし、後でプログラムをだまして、別の、許可されていない、検証されていない、潜在的に危険な方法でデータを解釈させることに成功します。

型の混乱の危険性の説明

C でプログラムを作成していると想像してください (C の知識があるかどうかは関係ありません。とにかく従うだけで大丈夫です)。

C では通常、変数を個別に宣言します。これにより、変数を格納できるメモリを確保するだけでなく、それらの変数がどのように使用されるかをプログラムに通知することもできます。

例:

 long long int JulianDayNumber; signed char* 顧客名;

最初の変数宣言では、天文上の日番号を表す単純な整数値を格納するために 64 ビットが予約されています。 (気になる方のために付け加えておきますが、今日の午後は JDN 23157 です。ユリウス日は真夜中ではなく正午に始まります。天文学者は夜間に作業することが多く、真夜中が勤務日の真ん中だからです。)

64 番目のビットは、顧客名のテキスト文字列が見つかるメモリ アドレスを格納するために XNUMX ビットを予約しています。

ご想像のとおり、これら 23157 つの値を混同しない方がよいでしょう。XNUMX など、日の番号として使用するのに意味があり安全な数値は、メモリ アドレスとして使用するのはほぼ確実に安全ではないからです。

実行中の Windows プログラムのメモリ ダンプからわかるように、使用のために割り当てられる最小メモリ アドレスは次から始まります。 0x00370000これは 3,604,480 進数で XNUMX であり、一般的な日数よりもはるかに大きくなります。

Windows で使用される実際のメモリ アドレスは、メモリ レイアウトを犯罪者が推測しにくくするために、時間の経過とともにランダムに変化します。そのため、同じプログラムを実行すると、値は似たものになります。

そして (上の画像の下部から外れていますが) このプログラムが実行されたときのランタイム ユーザー データ セクションのメモリ アドレス 0x01130000 〜へ 0x01134FFF、22 年 44631 月 16 日から 44687 年 XNUMX 月 XNUMX 日までのありそうもない日付範囲を表します。

実際、これら XNUMX つの変数を混同しようとすると、コンパイラは次のように警告を発するはずです。

 JulianDayNumber = 顧客名; 顧客名 = JulianDayNumber; 警告: 代入はキャストなしでポインタから整数を作成します。 警告: 代入はキャストなしで整数からポインタを作成します

C でプログラミングしたことがあれば、便宜上、 union このようなキーワード:

 Union {long long int JulianDayNumer; signed char* 顧客名; } データ;

メモリ内のまったく同じ変数を XNUMX つの異なる方法で参照できるようになりました。

あなたが書くなら data.JulianDayNumber、保存されたデータを魔法のように整数として解釈しますが、 data.CustomerName 同じ格納データにアクセスしているにもかかわらず、メモリ アドレスを参照していることをコンパイラに伝えます。

あなたがやっていることは、多かれ少なかれ、取得したデータを時には日付として、時にはメモリアドレスとして扱うことをコンパイラに認めていることになります。 どの解釈がどの瞬間に適用されるかを覚えておく責任はあなたにあります コードで

として知られる XNUMX 番目の変数を使用することもできます。 tag (通常は整数) union 現在どのような種類のデータを扱っているかを追跡するには、たとえば次のようにします。

 構造体 { int タグ; Union {long long int JulianDayNumer; signed char* 顧客名; } データ; } 価値;

それをいつ決めるかも知れません value.tag に設定されています 0、データはまだ使用できるように初期化されていません。 1 日付を保存していることを意味します。 2 はそれがメモリアドレスであることを意味し、それ以外はエラーを示します。

まあ、他の人にそれを台無しにしないほうがいいです value.tag そうしないと、プログラムが大幅に誤動作する可能性があります。

もっと心配な例は次のようなものかもしれません。

 構造体 { int タグ; // 1 = ハッシュ、2 = 関数ポインタ Union { unsigned char hash[16]; // ランダムなハッシュを格納する struct { void* openfunc; // または、慎重に検証された XNUMX つの void* closefunc; // 後で実行するコード ポインタ } validate; } } 価値;

ここで、同じメモリ ブロックをオーバーロードしているので、そのブロックを 16 バイトのハッシュの保存に使用したり、プログラムが後で呼び出す関数への 8 つの XNUMX バイトのポインターを保存したりすることができます。

明らかに、いつ value.tag == 1ハッシュは擬似乱数であるため、どのようなバイトのコレクションも同様の可能性があるため、ソフトウェアで任意の 16 バイト文字列を共用体に割り当てられたメモリに格納できるようにしたいと考えています。

でもいつ value.tag == 2の場合、コードでは、ユーザーが未検証、信頼できない、未知の関数アドレスを指定して後で実行することを許可しないように、細心の注意を払う必要があります。

ここで、タグが 1 に設定されているときにこのコードに値を送信できたため、チェックも検証も行われなかったと想像してください。

…しかしその後、プログラムが実際に格納された値を使用する直前に、コードをだましてタグを 2 に切り替えることができました。

コードは、未検証の関数アドレスを (安全ではないにもかかわらず) 「既知ですでに安全であることが確認されている」ものとして受け入れ、事前にこっそり選択したメモリ内の不正な場所にプログラムの実行を信頼してディスパッチします。

不自然で単純化された例を使用しているにもかかわらず、これが型混乱バグで起こることです。

一方向に処理されれば安全に消費できるメモリが、別の安全でない方法で処理するためにプログラムに悪意を持って配信されます。

何をするか?

最新バージョンの Chrome または Chromium を使用していることを確認してください。

クロムが欲しい 114.0.5735.106 Mac および Linux 以降では、 114.0.5735.110 Windows ではそれ以降。

Chromium をベースとする Microsoft Edge もこのバグの影響を受けます。

Microsoft はこれまでに [2023-06-06T16:25:00Z] ことを指摘

Microsoft は、最近エクスプロイトが世に出回っていることを認識しています。 私たちはセキュリティ パッチのリリースに積極的に取り組んでいます。

Edge の現在のバージョンは 114.0.1823.37 であるため、番号が付いているものはすべて それ以降 Microsoft の CVE-2023-3079 パッチを含める必要があります。

バージョンを確認し、まだ受け取っていないバージョンがある場合は強制的にアップデートするには:

  • グーグルクローム。 XNUMX ドット メニュー (⋮) > カスタマーサービス > クロムについて。
  • マイクロソフトエッジ。 設定など (…) > ヘルプとフィードバック > MicrosoftEdgeについて。

どういたしまして。


私たちとチャット

やあ! どんな御用でしょうか?