ニュース

Zen 2コアに脆弱性。修正は2023年10月以降

 AMDは、Zen 2コアのCPUのレジスタに、正しく0が書き込まれない不具合があり、攻撃者が別のプロセスやスレッドからYMMレジスタに保存された機密情報などを読める脆弱性があると発表した。AMDは「AMD-SB-7008」、共通脆弱性識別子は「CVE-2023-20593」として割り当てられた。

 深刻性は「中」とされており、BIOSアップデートを通したAGESAファームウェアの更新で対処する。データセンター向けの第2世代EPYCプロセッサはμコード0x0830107A、AGESA RomePI 1.0.0.Hで修正を行なうほか、デスクトップやハイエンドデスクトップは10月以降の配布を予定している。

プロセッサファームウェア時期
Ryzen 3000(Matisse)ComboAM4v2PI_1.2.0.C
ComboAM4PI_1.0.0.C
2023年12月目標
Ryzen 4000(Renoir)ComboAM4v2PI_1.2.0.C2023年12月目標
Ryzen Threadripper 3000(Castle Peak)CastlePeakPI-SP3r3 1.0.0.A2023年10月目標
Ryzen Threadripper PRO 3000WX(Castle Peak WS SP3)CastlePeakWSPI-sWRX8
ChagallWSPI-sWRX8 1.0.0.7 1.0.0.C
2023年11月目標
Ryzen 5000(Lucienne、モバイル)CezannePI-FP6_1.0.1.02023年12月目標
Ryzen 4000(Renoir、モバイル)RenoirPI-FP6_1.0.0.D2023年11月目標
Ryzen 7020(Mendocino、モバイル)MendocinoPI-FT6_1.0.0.62023年12月目標

 この脆弱性は「Zenbleed」と名付けられており、Google Information SecurityのTavis Ormandy氏のファジングによって発見され、5月15日にAMDに対して報告された。対処まではDE_CFG[9]というチキンビットを設定すれば回避できるが、性能に影響を与える可能性がある。

Zenbleed脆弱性の詳細

 Zenbleedの脆弱性の詳細は既に公開されているのだが、ざっくり言ってしまえば「vzeroupper」と呼ばれる命令のバグである。

 現代的なx86 CPUは128bitのXMMと呼ばれるベクタレジスタを必ず備えているが、最新のCPUはYMMとZMMと呼ばれる256bit/512bitの拡張レジスタも用意している。しかしこれらは独立しているわけではなく、たとえばXMMはYMMの上位(upper)バイトとなっている形だ。

YMMレジスタとXMMレジスタの関係

 しかし、たとえばYMMの下位(lower)しか使われず、上位のXMM相当部が使われなかった場合、XMMはフル幅に自動的に昇格する。これは、スーパースカラプロセッサではどの操作を並列化できるかを認識するために、依存関係を追跡するためだ。ところがフル幅では、プロセッサは不必要な結果を待つこととなりストールする。そこでglibcライブラリでは、vzeroupperを使いXMMのリソースを解放する。

 ただvzeroupperでは、実際にレジスタに0を書き込むのではなく、レジスタアロケーションテーブル(RAT)と呼ばれるところに「z-bit」と呼ばれるフラグを立てる“だけ”の挙動になっている。

vzeroupperはレジスタアロケーションテーブルにz-bitフラグを立てる

 最新のプロセッサでは投機実行しているため、たとえば分岐予測ミスが発生した場合、操作を元に戻す必要がある。ところがvzeroupperでリソースを解放したのにも関わらず操作を元に戻すと、当然use-after-freeという脆弱性が発生してしまう。

 本来CPUでは発生してはならないuse-after-freeなわけだが、Zen 2のCPUではバグによって発生。同じウィンドウの中でZen 2に実装されたXMM Register Merge Optimization最適化(EPYC 7003ソフトウェア最適化ガイドより)が行なわれると、空きの下位レジスタも上位レジスタとマージしてz-bitフラグを立てられる。そこに続けてレジスタのリネーム、そしてvzeroupper分岐予測ミスが続けば、情報などが復元されてしまうとしている。

 実際に研究者はこの手法を用いて、1秒/1コアあたり30KB程度の情報をリークさせることに成功。これは、暗号キーやログインパスワードをモニタリングするのに十分な容量を達成できたとしている。

CPU1からレジスタファイルに書き込み
意図的に分岐予測ミスが発生して操作を復元すると、CPU0の上位レジスタからCPU1が過去に書き込んだ物理レジスタファイルにアクセスできてしまう