2023年8月版 最速! 危険度の高い脆弱性をいち早く解説「脆弱性研究所」第13回 その1
8月に公開された重大な脆弱性(CISA KEV参照)
8月に新たに公開された脆弱性は4539となります。この中で特に重大な脆弱性をいくつかピックアップして2回に分けて説明したいと思います。
第三回で説明したCISAによる「実際に悪用されている脆弱性(Known Exploited Vulnerabilities Catalog)」のデータベース情報もあわせて載せています。
8月にCISAのKEVに登録された脆弱性はトータルで15件で、内訳は
- RARLAB: 1件
- Ignite Realtime: 1件
- Ivanti: 1件
- Veeam: 1件
- Citrix: 1件
- Microsoftt: 1件
- Adobe: 1件
- Zyxel: 1件
になっています。
参考情報
- CISA「Known Exploited Vulnerabilities Catalog」
1. 幅広い世代のIntel CPUを対象にしたDownFall 攻撃(Gather Data Sampling:GDS CVE-2022-40982)。重要なデータが盗まれる可能性
2023/08/08にGoogle の上級研究科学者が、複数の Intel マイクロプロセッサ ファミリに影響を及ぼし、同じコンピュータを共有するユーザーからパスワード、暗号化キー、電子メール、メッセージ、銀行情報などの個人データを盗める「Downfall(Downfall)」と呼ばれる脆弱性を悪用する新しい CPU 攻撃を考案しました。
Downfall攻撃では、後述する通り攻撃者は被害者と同じ物理プロセッサコア上で盗聴を行う必要があります。ただし、マルウェアなどのローカルプログラムがこの欠陥を悪用して機密情報を盗む可能性があります。 また、この欠陥はいわゆるサイドチャネルの問題であり、IntelのSkylake から Ice Lakeまで、すべてのプロセッサに影響します。
一次情報源
CVE情報
今回公開されたCVEは以下になります。
CVE-2022-40982
- 一次情報源 (ベンダー)
- 影響を受ける製品
- Skylake family (Skylake, Cascade Lake, Cooper Lake, Amber Lake, Kaby Lake, Coffee Lake, Whiskey Lake, Comet Lake)
- Tiger Lake family
- Ice Lake family (Ice Lake, Rocket Lake)
- CVSS Base Score: 6.8 Medium
- CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
- CVE 詳細
- 一部のインテル(R) プロセッサーの特定のベクター実行ユニットにおいて一時的な実行後のマイクロアーキテクチャ状態による情報漏洩により、認証されたユーザーがローカル アクセスを介した情報開示を可能にする可能性があります。
- 修正方法
- Intelのマイクロコードを最新のものに更新してください。
脆弱性の詳細
GATHER命令
今回の脆弱性を解説しているIntelのドキュメントでも説明されていますので、以下はそちらの翻訳が主になります。
GATHER命令は、Intel Advanced Vector Extensions 2 (Intel AVX2) および Intel Advanced Vector Extensions 512 (Intel AVX-512) が提供する機能になります。基本的にはシングルインストラクション・マルチプルデータ(Single Instruction Multiple Data: SIMD)で構成されており、vector-index memory addressingを用いて、メモリから不連続なデータを読み込むものになります。
gather命令(instruction)がメモリからのロードを実行する際に、異なったデータ要素が指定されたマスクに従って宛先のベクターレジスタにマージされます。
下図は、downfallの概念図で最初に説明される「GATHER命令の動作」になります。
GATHER Data Sampling Vulnerability(GDS)の説明
GATHERは前節で説明したとおりですが、これを実装する際にはスピードアップのため、いくつかの最適化がなされています。例えば実装の段階で、下記のような実装を行います。
- どのみち破棄する必要がある、設定されていないマスクビットに対する不必要なメモリ読み取りを省略しています。
- 同じキャッシュラインに複数回インデックスを付ける際には、同じキャッシュラインのデータを再利用します。
- 複数の読み取りを並列かつ投機的(speculatively)に実行し、少なくとも1つの読み取りが失敗した場合は結果を破棄します。
- 複数の読み取りの途中で中断があった場合には、すでに実行された読み取りの再実行を避けるために、gatherの部分実行の状態を保存します。
CPU は設定されていないマスクビットや、重複したインデックスの読み取りの一部を早い段階で省略できますが、テンポラリバッファを使用して他の最適化を実装することもできます。また複数の読み取りが同じキャッシュラインで異なるオフセットをターゲットにしている場合には、テンポラリバッファはキャッシュラインを保持しつつ、異なるワード値を後続の命令に独立して転送できます。 さらにテンポラリバッファは、異なるキャッシュ ラインからの投機的なメモリ読み取りも簡単にします。
しかし独立したセキュリティドメイン間で共有されるテンポラリバッファは、セキュリティ上で重要な問題を引き起こす可能性があります。
- 下記の様なプログラムで今回の問題(Gather Data Sampling: GDS)を考えます。
// Step (i): Increase the transient window
lea addresses_normal, %rdi
clflush (%rdi)
mov (%rdi), %rax
// Step (ii): Gather uncacheable memory
lea addresses_uncacheable, %rsi
mov $0b1, %rdi
kmovq %rdi, %k1
vpxord %zmm1, %zmm1, %zmm1
vpgatherdd 0(%rsi, %zmm1, 1), %zmm5{%k1}
// Step (iii): Encode (transient) data to cache
movq %xmm5, %rax
encode_eax
// Step (iv): Scan the cache
Scan_flush_reload
攻撃者は上記のプログラムで以下のようなことを行います。
(i) キャッシュミスを実行して、投機的実行ウィンドウを拡大します。これにより一時的に転送されたデータが、キャッシュを通じて可視化される可能性が増加します。
(ii) 単一のキャッシュラインにアクセスする収集命令を実行します。ターゲットメモリがキャッシュ不能 (UC) であるためにキャッシュミスに繋がります。
(iii) 512 ビットのベクトルレジスタからのdwordを4×256キャッシュ ラインにエンコードするため、最大 4 バイトの一時データが明らかになります。
(iv) フラッシュ+リロード手法を使用してキャッシュをスキャンし、転送されたデータバイトを推測します。
論文によると、上記のコードをTiger Lake CPUで実行すると、論理CPUスレッドで他のgather実行から1秒間に809個のdword値がリークされたそうです。また、キャッシュをスキャンする前に手順 (i ~ iii) を32回実行すると、1秒間に903個の dword値が漏洩したそうです。 観察されたデータの漏洩により、ユーザー空間から悪用可能な重大な脆弱性が確認されました。 gather命令は、論理CPU スレッド間で共有される一時バッファを使用しているようで、データを後続の依存命令に一時的に転送します。データは別のプロセスに属し、同じコアで実行されているgather実行になります。
ここでの要約は次になります。
- GDSは、キャッシュできないUCおよびWCメモリにアクセスすることでデータを漏洩します
- GDS はまた、gather実行中に発生する可能性のあるすべてのメモリアクセスエラーによってデータを漏洩する可能性があります。これには
- カーネルまたは保護キーへのアクセスによるパーミッション フォールト
- マップされていないメモリへのアクセスによるページ フォールト
- 非正規アドレスへのアクセスによるアドレス生成エラー
が含まれます
- 論文では、さらにキャッシュミスに加えて、ページフォールトやatominc load-modify-store (LMS) 命令 (xchg、lock inc) などの他のメモリアクセスを用いて、gatherによりデータ漏洩が起きる様に一時ウィンドウを準備できることを確認しています。
下記の様なプログラムで今回の問題(Gather Data Sampling: GDS)を考えます。
// Step 1: Increase the transient window a lot
lea addresses_normal_helper, %rdi
.set i,0
.rept 8
clflush 64*i(%rdi)
mov 64*i(%rdi), %rax
.set i,i+1
.endr
xchg %rax, 0(%rdi)
// Step 2: Gather cachable memory (no fault)
lea addresses_normal, %rsi
...
上記のリストは、キャッシュミスと LMS 実行の組み合わせを使用して、投機実行ウィンドウを準備するプログラムのサンプルです。この場合、GDS は明示的なフォールトやマイクロコードによる補助なしで、キャッシュ可能なデータを持つ通常のメモリアドレスにアクセスすることができ、データが漏洩します。
これはフォールトやアシストにより発生するメモリアクセスを悪用したMDS攻撃とは異なり、GatherがSpectreと同様に、通常の投機的実行で古いデータを転送する可能性があることを示唆しています。
影響を受ける命令(instrunction)
GDSにより、別のgather命令からデータがリークすることを示しましたが、論文ではメモリ オペランドを受け入れるすべてのx86命令をテストして、どの命令がGDSによりリークするかも確認しています。それによると、下記のような命令がGDSにより影響を受ける様です。
漏洩するデータ
論文によると、CPUがSIMDレジスタバッファに「静止状態」でデータをプリフェッチする 2 つの状態が発見されました。そのため、データがソフトウェアによって読まれていないにも関わらずGDS がデータを漏洩する可能性があります。
- OOB プリフェッチ : ソフトウェアは n バイトを読み取りますが、CPU は最大 x キャッシュラインまで n バイトを超えてリークします。
- NOOP プリフェッチ : ソフトウェアは0バイトを読み取りますが、CPU は最大 x キャッシュラインをリークします。
これらの情報からの組み合わせで、論文ではデータを漏洩させるガジェットや、ユーザー空間からLinux Kernel メモリを読み込むようなガジェット、またGDSとLVI(Load Valuable Injection)を組み合わせたGVI(Gather Value Injection)ガジェットなどを紹介しています。
Intelの説明
今回の「GDS」に関して、Intelでは下記のように説明しています。
————————————————————————————————————————
gather命令のハードウェア最適化により、特定の状況ではアーキテクチャベクターレジスタ(architectural vector registers)/内部ベクターレジスタが以前に使用した際の古いデータが、gather loadによって更新されずに一時的に依存する他の命令に転送されることがあります。
この、依存する他の命令から、悪意のある攻撃者は、共有 CPU キャッシュなどの秘密チャネル(covert channel)を通じて送信されるベクターレジスタの古いデータを推測できる可能性があります。
この振る舞いを通して露出される古いデータの範囲は、同じ物理プロセッサコアに限定されます。ローカルでコードを実行できる攻撃者は、同じ物理プロセッサコアからの古いデータをサンプリングベースで観察する可能性があります(この意味ではGDSはMDSと似ています)が、どのデータが推測できるかを指定したり直接制御したりすることはできません。
GDSによる攻撃を用いて古いデータを推測するには、悪意のあるコードがgather命令(instruction)を使用する必要があります。しかしながらGDS 攻撃は、gather命令を使用していないソフトウェアにも影響を与える可能性があります。そのような攻撃では、アーキテクチャ ベクトル レジスタを明示的に使用する命令 (例えばSIMDやスカラーSSE、インテルAVX命令など) や、内部ベクターレジスタを暗黙的に使用する命令 (例えばREP MOVS命令など)によって処理されたデータが公開される可能性があります。
————————————————————————————————————————
PoC
Daniel Moghimi氏が公開しているDownfall AttacksのサイトでPoCを見ることができます。
- 他人の128bit/256bit AES鍵を盗むデモ
- Linux Kernelの情報を盗み見るデモ
- 被害者の端末に表示されている文字を別の端末から見るデモ
などがあります。
また、PoCのコードもhttps://github.com/flowyroll/downfall/tree/main/POCに載っています。ただし、PoCは変なコードが混じっている可能性もありますので、取り扱いには充分に気をつけてください。
参考情報
- Downfall Attacks
- Downfall: Exploiting Speculative Data Gathering(論文:PDF)
- Gather Data Sampling (intel)
- Gather Data Sampling vulnerability (GDS) – CVE-2022-40982(RedHat)
- SIMD (Wikipedia)
- LVI(Load Valuable Injection)
2. AMD Zen CPUに新たな脆弱性(CVE-2023-20569)。Inception攻撃により機密データ漏洩の恐れ
2023年8月8日に、チューリッヒ工科大学の研究者らは「Inception攻撃」と呼ばれる新しい攻撃手法をブログで公開しました。こちらの脆弱性(CVE-2023-20569)は幅広いAMD Rizen製品に関する脆弱性となっています。こちらの詳細を見てみましょう。
一次情報源
- Inception: how a simple XOR can cause a Microarchitectural Stack Overflow
- Return Address Security Bulletin Bulletin ID: AMD-SB-7005
CVE情報
チューリッヒ工科大学の研究者らは「ファントム投機」(CVE-2022-23825: Retbleed)と呼ばれる手法と、「Training in Transient Execution(一時的実行のトレーニング)」(TTE)と呼ばれる新しい一時的実行攻撃を組み合わせた攻撃を作成しました。
今回公開されたCVEは以下になります。
CVE-2023-20569
- 一次情報源(ベンダー)
- 影響を受ける製品
- 多岐にわたりますので、一次情報源を参照してください。
- CVE 詳細
- 一部の AMD CPU にはサイド チャネルの脆弱性があるため、攻撃者がリターン アドレスの予測に影響を与える可能性があります。 これにより、攻撃者が制御する命令ポインタ レジスタで投機的な実行が行われ、情報漏洩につながる可能性があります。
- 修正方法
- AMDは「Zen 3」および「Zen 4」CPU アーキテクチャに基づく製品に対して、スタンドアロンの µcode パッチ、またはBIOS アップデートのいずれかを適用することをRecommendとして出しています。
- AMDの声明
- AMDは、新たな投機的なサイドチャネル攻撃について説明する「INCEPTION」というタイトルの外部レポートを受け取りました。 この攻撃により、攻撃者が制御するアドレスで投機的な実行が行われ、情報漏洩につながる可能性があります。 この攻撃は、Spectrev2 や Branch Type Confusion (BTC)/RetBleed などの以前の分岐予測ベースの攻撃に似ています。
それらの攻撃と同様に、投機的な実行は現在のアドレス空間内に制限されており、これを悪用するには、攻撃者はアドレス空間に関する知識と、RET (プロシージャからの復帰) 投機時の十分なレジスタの制御を持っている必要があります。 したがって、AMDは、「この脆弱性はダウンロードしたマルウェアなどを介してローカルでのみ悪用される可能性がある」と考えており、最新のソフトウェアやマルウェア検出ツールを実行するなど、セキュリティのベストプラクティスを採用することを顧客に推奨しています。
- AMDは、新たな投機的なサイドチャネル攻撃について説明する「INCEPTION」というタイトルの外部レポートを受け取りました。 この攻撃により、攻撃者が制御するアドレスで投機的な実行が行われ、情報漏洩につながる可能性があります。 この攻撃は、Spectrev2 や Branch Type Confusion (BTC)/RetBleed などの以前の分岐予測ベースの攻撃に似ています。
脆弱性の詳細
前提
投機的実行は、CPUによる処理を高速化する際にしようされるもので、条件分岐があった場合に、過去の経験から予め分岐を予測して、予測した条件のフローを並列処理で行っておき、全体的な処理速度を向上させるものです。仮に予測した条件に当てはまらない場合には、並列で行っていた処理を破棄して処理を行っていくため、全体的な処理速度は向上します。
過去には、この投機的実行の脆弱性(SpectreやMeltdownなど)が発覚したことがあります。
その様に脆弱性が見つかった場合には、攻撃者はリターンスタックバッファ(Return Stack Buffer: RSB)や分岐ターゲットバッファ(Branch Target Buffer: BTB)などを操作しようとします。
SpectreやMeltdownなどの投機的実行に含まれる脆弱性を悪用した攻撃(Transient Execution Attack:一時実行攻撃)では、一時的に実行するように訓練された”投機(Speculation)ガジェット”を用いて、”開示(disclosure)ガジェット”を通じてメモリをリークさせます。一般的な”開示ガジェット”は攻撃者が制御するアドレスから秘密情報をロードします。
Inception
今回の「Inception」は
- TTE: Training in Transient Execution(一時的実行によるトレーニング)
- 分岐予測を操作し、予測ミスを積極的に起こさせる
- Phantom Specuration (CVE-2022-23825)
- 分岐予測子のエイリアスにより、一部の AMD プロセッサが間違った分岐タイプを予測し、情報漏洩につながる可能性があります。
を組み合わせたものになります。
TTE: Training in Transient Execution(一時的実行によるトレーニング)
リスト1はBTBでのTTEトレーニングを示すためのサンプルになります。
2行目の条件処理が入り、間接分岐のb()が実行される事で、BTBがトレーニングされます。
ここで攻撃者がこの条件分岐を何らかの方法で歪めることができるとした場合、BTBは攻撃者が制御できる値bによって、分岐をトレーニングできると仮定できます。これには2 つの条件を満たす必要があります:
(i) 条件付き分岐の方向を歪めることができる
(ii) bを制御することで任意の分岐ターゲットが挿入できる
しかし、多くのアーキテクチャでは、間接分岐は Spectre-BTB に対して脆弱であることが知られているため、一般にretpoline(SpectreV2対策済みのもの)に置き換えられます。 さらに条件 (ii) を満たすということは、攻撃者がすでにシステム上で任意のコードで分岐をトレーニングできるぐらいまで実行できているということを意味しています。
さらにここで、リスト2の様なサンプルコードについて考えます。リスト2は、条件分岐ミスによりRSBが更新される可能性があることを示しています。この場合、信頼性は低いものの、AMDマイクロアーキテクチャ上でのみ RSBが更新されます。
図1は、条件分岐ミスによるTTEを通じてRSBがどの様に変化させられるかを図示したものになります。
Phantom Specuration (CVE-2022-23825)
AMD CPU Branch Type Confusion(CVE-2022-23825)の脆弱性になります。分岐予測子のエイリアスにより、一部の AMD プロセッサが間違った分岐タイプを予測してしまいます。これにより情報漏洩につながる可能性があります。
TTEとPhantomの組み合わせ
図7はINCEPTIONの概念図になります。TTEとPhantomを組み合わせることで、RSBが更新されます。
- 最初のトレーニングステッ プ”T1”では、攻撃者がTJを用いてトレーニング ブランチを実行します。これを、 PHANTOM JMPによるPJのBTB エントリと衝突させます。
カーネルアドレス空間に存在するPJは、再帰的なPHANTOM CALLを開始するアドレスです。被害マシンの返り値であるVR は、制御フローのPJの後に割り当てられます。
PHANTOM JMPのターゲットはPCに設定され、再帰的なPHANTOM CALLがトリガーされます。
- トレーニング ステップ”T2”では、攻撃者はTCでトレーニング コール を実行し、 BTB 内のPCと衝突させます。これにより、PHANTOM CALLの予測が作成されます。このトレーニング呼び出しのターゲットはPCに設定され、再帰的なPHANTOM CALL予測が確立されます。したがって、PCの実行時にCPUは予測されたRSBを”開示ガジェット”G に再帰的に注入します。その位置はPCでのPHANTOM CALLの直後となります。PC はカーネル空間に存在するため、トレーニングブランチTJとTCによってページフォールトがトリガーされて回復します。
- ステップT1とT2 の後、システムコールを使用してカーネルを呼び出し、TTEステップをトリガーします。 PJに到達するたびに、BTBは予測をPC に提供し、投機的命令ポインターがPCにセットされます。 PCにはコールの予測が存在するため、 GがRSBにプッシュされます。呼び出し予測は再帰的であるため、
- 命令ポインターの更新
- BTBの参照
- RSBへのプッシュのループ
を継続します。この再帰は、 実際の命令が実行されるまで続きます。
- PJ内のPHANTOM JMPの位置にあるデータは最終的にデコードされ、CPU は命令ポインターをPJにリセットすることで予測ミスを修正します。
- 最後にステップSで、 被害者マシンでのリターンVRが RSBから予測を取得します。 TTE ステップ中にリターンターゲットGでRSBエントリを上書きしたため、Gで開示ガジェットの実行を開始し、実行された命令を制御する投機ウィンドウが完了します。
実験結果(論文)
論文では、下記のマシンで実験を行っています。
- Kernel: Linux 5.19.0‑28‑generic
- Microcode Version: 0x8301038
- Memory: 64 GB
- CPU: AMD Zen 2 EPYC 7252
攻撃を 50 回実行し、 毎回 4KBのランダム化されたデータを漏洩させます。実行のたびにマシンを再起動して、KASLRを再ランダム化します。 50回の実行のうち48 件で、平均時間5.5秒でKASLRの突破に成功しました。つまりINCEPTION は126 バイト/秒の速度で、 89.9% の精度でデータを漏洩します。
さらに、 INCEPTIONが物理メモリ内の機密データを見つけることができることを示します。具体的にはINCEPTIONに/etc/shadowを検索させて、root パスワードハッシュを漏洩させます。 INCEPTION を8つの使用可能なコアすべてで並行して実行し、各インスタンスが異なる物理アドレスで検索を開始します。 /etc/shadowの検索を10回試み、毎回の試行後にマシンを再起動します。結果は、 10回の実行すべてで、平均11分38秒でroot パスワードハッシュの漏洩に成功しています。
PoC
YoutubeでPoCが公開されています。こちらのPoCの動画によると、短時間で/etc/shadowファイルの情報が見えています。
影響範囲
AMDの限定的なCPUに影響すると考えられています。また、INCEPTIONでデータを取得する前に条件分岐を学習させる必要があるため、システム上で一般ユーザーとして自由にプログラムを実行できる環境である必要があります。
そのため、マルウェア等による感染の第二段階として使用される可能性がありますが、直接的にこの脆弱性を悪用される可能性は少なめと考えて良いかと思います。
参考情報
- Inception: how a simple XOR can cause a Microarchitectural Stack Overflow
- Inception: leaking the root hash from /etc/shadow on AMD Zen 4(Youtube)
- INCEPTION: Exposing New Attack Surfaces with Training in Transient Execution(論文)
- Return Address Security Bulletin Bulletin ID: AMD-SB-7005
- 「Spectre」「Meltdown」関連で新たに7件の脆弱性 (ITMedia)
- 投機的実行とは(e-word)
- AMD CPU Branch Type Confusion
2023年8月版 最速! 危険度の高い脆弱性をいち早く解説「脆弱性研究所」第13回 その2に続く
その2では、“MaginotDNS”と呼ばれる新たな攻撃手法が公開を解説します。
<著者> 面 和毅
サイオステクノロジー株式会社 上席執行役員
OSS/セキュリティエバンジェリスト
OSSのセキュリティ専門家として20年近くの経験があり、主にOS系のセキュリティに関しての執筆や講演を行う。大手ベンダーや外資系、ユーザー企業などでさまざまな立場を経験。
2015年からサイオステクノロジーのOSS/セキュリティエバンジェリストとして活躍中。また、ヒートウェーブ株式会社でも講師として活動中。
専門分野はSELinuxを含むOSのアクセス制御、AntiVirus、SIEM、脅威インテリジェンス。
「脆弱性研究所」の最新話は、メールマガジンにてもご案内致しています。是非JAPANSecuritySummit Updateのメールマガジンにご登録ください。
メールマガジンの登録はこちらからお願いします
最速! 危険度の高い脆弱性をいち早く解説「脆弱性研究所」の過去の記事はこちらから