世界を動かす技術を、日本語で。

スパゲッティ化するDRAM

2026年8月13日原文(github.com)

概要

  • DRAMコントローラのアドレス変換 を操作することで、CPU上のあらゆる保護領域へアクセス可能
  • AMD Family 16h 向けに実証、他アーキテクチャにも応用可能性
  • 物理アドレスとDRAM座標の乖離 を利用し、上位のセキュリティ機構をバイパス
  • 線形代数 でアドレス変換を逆算し、保護領域のデータ復元が可能
  • Platform Security ProcessorやSMMなどのアンロック も実現

DRAMスクランブルによるCPU全領域アンロック

  • skitter-creek-bath-salts は、メモリ階層の最下層である MCT/DCT(メモリコントローラ) のアドレス変換を動的に書き換え、DRAM物理座標を再配線する攻撃手法

  • これにより、 カーネルやファームウェアからも不可視なDRAM carveout領域 (Platform Security Processor, System Management Mode, C6 DRAM, マイクロコード等)へアクセス可能

  • 物理アドレスはあくまで「提案」に過ぎず、DRAMコントローラでの最終変換が本質的な実体

    • 例: xor dword [0xf80c2094], 0x00400000 の1ビット反転でDRAMのアドレス空間がスパゲッティ状に変化
  • 上位の保護機構(MMU, IOMMU, SMM, PSP等)は物理アドレスまでしか監視できない ため、この変換を悪用すると全ての保護をバイパス可能

    • AMD Family 16h はDRAMコントローラの変換レジスタがロック不可で、仕様書にも記載あり
    • Family 17h以降は仕様書から該当情報が削除 されているが、同様の原理は他アーキテクチャ(ARM, RISC-V等)にも応用可能

*pパイプラインの深層解剖

  • 仮想アドレス(VA)からDRAMアクセスまでの多層変換パイプライン
    • MMUによる仮想→物理変換
    • TLB, ページウォーク, IOMMU, キャッシュ階層, インターコネクト経由
    • 最後に MCT/DCTで物理アドレスがDRAM座標へ再変換
  • MCT/DCTでの「バンクスワイズル」や「チャネルインターリーブ」等の設定を変更 することで、物理アドレスとDRAM座標の対応関係を任意に書き換え
  • この操作は OSやファームウェア、CPU自身の保護機能の下層で行われる ため、全てのセキュリティ境界を突破

DRAMアドレススクランブルの実装例

  • 実行の流れ
    • ターゲットアドレスとMMIO領域のTLBを事前にプライム
    • 割り込み無効化(cli)、キャッシュフラッシュ(clflush)、バリア命令(mfence, lfence) で状態を固定
    • DRAMコントローラのレジスタ書き換えでアドレス変換を一時的に変更
    • 保護領域のデータを取得後、元に戻す
    • 割り込み再有効化、AP(他コア)再開
  • 例:
    mov eax, [0xf80c2094] ; MMIO TLBプライム
    mov eax, [0x6f800000] ; ターゲットTLBプライム
    pushf
    cli
    clflush [0x6f800000]
    mfence
    lfence
    xor dword [0xf80c2094], 1<<22 ; DCTスワイズル反転
    mov ebx, [0x6f800000] ; スクランブル後のデータ取得
    xor dword [0xf80c2094], 1<<22 ; 元に戻す
    mfence
    lfence
    popf
    
  • ページング・キャッシュ・TLB・スレッディングを適切に制御 すれば、C言語などからも同様の操作が可能

保護領域のアンロックと逆変換

  • DRAMコントローラの変換はGF(2)線形写像
    • 変換行列を線形代数で逆算することで、任意のDRAM座標への対応物理アドレスを計算可能
  • スクランブル後の変換行列の逆写像と、元の変換行列の合成 で、全ての保護領域のデータにアクセス
  • 仕様書が不十分でも、実機観測と線形代数で変換パターンを再構築可能

まとめ:CPU/DRAM保護機構の根本的限界

  • DRAMコントローラ層でのアドレス変換操作で、全セキュリティ境界を突破可能
  • 上位レイヤの壁(SMM, PSP, MMU, IOMMU, カーネル等)はDRAM座標の再配線に無力
  • 物理アドレスとDRAM座標の分離を突いた攻撃は、仕様書記載の有無やアーキテクチャ問わず本質的な脆弱性
  • 現実的な防御策には、DRAMコントローラ自体のロックや、変換情報の秘匿化が必要

この手法は、 CPUとDRAMの最深部でのアドレス変換操作 によって、 全てのハードウェア/ソフトウェア保護領域をバイパスしうる ことを示している。仕様書やOSの想定を超えた低レイヤ攻撃のため、 プラットフォームの根本的なセキュリティ設計見直しが必要 となる。

Hackerたちの意見

この研究者は、CPUのリバースエンジニアリングに関してはかなりの知識を持っているみたいで、モリアで掘っているドワーフを思い出すよ…でも、なんでわざわざAIを使ってレポートを書く必要があるんだろう?!

本当にそうだよね。同じアイデアを何度も言い換えて読むのが疲れた。

疑いは持ったけど、AIじゃないと思った。「Foo is the bar.」っていう文の構造が、全体の「鏡の中を通して」の雰囲気と合ってるからね。

ブラックハットの講演が待ちきれない!クリストファー・ドマスは、僕の大好きなハッカーの一人なんだ。彼の仕事の説明が本当に素晴らしいんだよね。彼の好きな講演のいくつかを紹介するね:

  • リバースエンジニアリングにおける心理戦 https://www.youtube.com/watch?v=HlUe0TUHOIc
  • MoVfuscator https://www.youtube.com/watch?v=R7EEoWg6Ekk
  • 修正されたx86のハードウェアバックドア https://www.youtube.com/watch?v=jmTwlEh8L7g

もし僕が思っている同じ人なら、彼の奥さんもMozillaのCISOで、一緒にセキュリティ研究をしているんだ。確か、x86のリバースエンジニアリングに関する本も出してるよ。めっちゃクールだね!

彼の作品は別格だね。

影響を受けたシステムでは、リング0のルートがネガティブリング領域に隠されていたほぼすべてにアクセスできるんだね。このページは、特定のAMD16h(古いAMDの低消費電力ファミリー)以外のプロセッサファミリーがどれくらい似ているのかについてはあまり触れていないみたい。

コントローラーのトランスレーションレジスタを知っていれば、適用できるのかな?後のものは情報が簡単に手に入らなかったからテストされていないみたいだね。

AMD Family 16h CPUで開発・テストされており、データシートにDRAMコントローラーのトランスレーションレジスタが記載されている最後の世代で、ロックできないことが示されている。17h以降はこの情報が省かれている。

GHページから: > AMDファミリー16h CPUで開発・テストされていて、最後の世代のデータシートにはDRAMコントローラーの変換レジスタが記載されていて、ロックできないことが示されている。17h以降はこの情報が省かれている。

面白いね。DCTスウィズリング機能は、元々ハードウェアで何のために設計されたんだろう?

スウィズリングなしだと、特定の一般的なアクセスパターンがパフォーマンスが悪くなることがある。例えば、2D配列の列を特定のストライドで歩くと、同じチャネルの同じバンクにすべてのアクセスが向かうことになって、スループットが複数のバンクやチャネルに均等に分散されている場合よりもずっと低くなる。スウィズリングはバンクやランク、チャネルの分布を「ランダム化」して、運が悪いアクセスパターンが起こりにくくするんだ。(私が研究したいのは、異なるアクセスパターンのマイクロベンチマークを取って、スウィズルパターンを推測して物理ASLRを打破することだね。)

大きな疑問は、これがKVMから抜け出せるのか、マイクロコードパッチや他の方法でパッチできるのか、そしてそもそも本当に実在するのかってことだね。

Hacker Newsで議論の続きを見る