メモリ暗号化とRowhammer ─ DRAM物理層の脆弱性
コールドブートやバスプロービングから主記憶を守るSME/TME/TDXの暗号化と、DRAMの電荷漏れでビットを反転させるRowhammerの物理機構を原理から押さえ、対策の効きどころと限界を見極められます。
- 1.SME/TME/TDXは主記憶をAES-XTS等で透過的に暗号化し、TDXは暗号と完全性タグでハイパーバイザからもゲストメモリを秘匿するが、暗号化はビット反転そのものは防げない。
- 2.Rowhammerは同じ行を高頻度で開閉して隣接行のセル電荷を漏らし、リフレッシュ前にビットを反転させる物理現象で、ソフトのバグではなくDRAMセルの微細化に起因する。
- 3.TRR・ECC・リフレッシュ間隔短縮・行アクセス監視が対策だが、TRRはパターン分割で回避され完全な解決にはならず、メモリ完全性保護との併用が現実解になる。
主記憶は信用できるのか
CPUの中で動く間、データはレジスタやキャッシュに守られています。しかし主記憶であるDRAMに書き出された瞬間、それは外部に露出します。基板上のメモリバスはプローブで盗聴でき、給電を切っても数秒〜数分は電荷が残るため、モジュールを抜いて冷却すれば内容を吸い出せます(コールドブート攻撃)。さらに物理的に隣接するセルへ干渉してデータを書き換える経路すら存在します。
主記憶を守る戦略は二系統に分かれます。ひとつは機密性を守る主記憶暗号化、もうひとつは完全性を守る検証機構です。そして本稿後半のRowhammerは、暗号化では塞げない「物理層からのビット反転」という別軸の脅威です。両者を同じ章で扱うのは、DRAMという同じ物理基盤の上で機密性と完全性が別々に攻撃されるからです。
SME/TME ─ 主記憶を透過的に暗号化する
最も基本的な防御が主記憶全体の暗号化です。AMDの SME(Secure Memory Encryption)、Intelの TME(Total Memory Encryption) はいずれもメモリコントローラに暗号エンジンを置き、DRAMへ書く直前に暗号化し、読み出した直後に復号します。CPUコアやキャッシュから見れば平文、DRAMチップ上では暗号文という構図で、ソフトウェアからは透過的です。
鍵は起動時にハードウェア乱数で生成され、CPUパッケージ内部のレジスタに保持されてDRAMやディスクには一切出ません。電源を切れば鍵は消えるので、コールドブートでDRAMの電荷を読み出しても得られるのは暗号文だけです。
書き込み経路(概念)
コア -> L1/L2/L3キャッシュ … 平文(パッケージ内部)
-> メモリコントローラ内 暗号エンジン … ここで暗号化
-> DRAMチップ … 暗号文として常駐
読み出しは逆順で、コントローラが復号してからキャッシュへ載せる
採用される暗号モードは AES-XTS が代表的です。XTSはディスク暗号で実績のあるストレージ向けモードで、平文のアドレス(位置情報)を暗号化に織り込みます。これにより、同じ平文でも物理位置が違えば異なる暗号文になり、ブロックの入れ替えや位置依存の解析を防ぎます。XTSはブロックごとに独立して暗復号できるので、ランダムアクセスが前提のメモリと相性が良いのが採用理由です。
ECBは同じ平文ブロックが同じ暗号文になり、メモリ内のパターンが透けます。CBCは直前ブロックに依存するため、ランダムアクセスのたびに連鎖をたどり直す必要があり主記憶には不向きです。XTSは「位置をトゥイーク(調整値)として混ぜる」ことで、ブロック独立性とパターン秘匿を両立します。だからディスクと主記憶の両方で標準的に使われます。
TDX/SEV ─ 暗号化に完全性とアイソレーションを足す
SME/TMEは「DRAMチップを抜かれても読めない」までは守りますが、ハイパーバイザや他のVMからの覗き見・改竄は守りません。クラウドではホスト自体を信頼しない前提が要るため、Intel TDX(Trust Domain Extensions) やAMD SEV-SNP が鍵分離と完全性を加えます。
鍵分離は、VM(信頼ドメイン)ごとに別の暗号鍵を割り当てる仕組みです。あるVMの暗号文を別のVMやホストが読んでも、鍵が違うため意味のある平文にはなりません。これはハードウェア仮想化支援とCPU内の鍵管理が連携して実現します。
完全性保護がより重要です。暗号化は「読めなくする」だけで、攻撃者が暗号文を書き換えることは妨げません。ただしTDXとSEV-SNPは異なる手法で完全性を実現します。TDXは暗号学的な**完全性タグ(MAC)**を使えます。TDXのCryptographic Integrityモードでは、キャッシュラインごとにMAC(SHA-3ベースを28ビットに切り詰めたもの)を計算してDRAMに保存し、読み出し時に再計算して照合します。
TDXのMAC付き読み出し(概念、Cryptographic Integrityモード)
1. DRAMから暗号文 + 保存済みMACタグ を読む
2. 暗号文(物理アドレス・所有ビット)から MAC を再計算
3. 再計算MAC == 保存MAC ?
一致 -> 復号してコアへ返す
不一致 -> 改竄検知。マシンチェック例外などで停止
一方でSEV-SNPは、メモリ内容ごとの暗号学的MACではなくアクセス制御ベースの完全性を採ります。ページの所有関係を記録する逆引き構造(RMP:Reverse Map Table)で各物理ページの正規の所有VMを管理し、ハイパーバイザによるメモリの再マッピングや、古い暗号文の再注入(リプレイ)を所有権チェックで弾きます。歴史的にはSEVが当初MACなしの暗号化のみで改竄に弱かった(SEVurity攻撃)反省から、SEV-SNPがこのRMP方式を導入した経緯があります。どちらの方式でも、ホストがゲストの暗号文を勝手な値に差し替えれば検知・拒否されます。
ここが本稿の要点です。メモリ暗号化が守るのは機密性(読めない)と、完全性タグがある場合の改竄検知です。しかし物理的にセルの電荷を変えてビットを反転させる攻撃に対しては、暗号化単体では無力です。反転は復号後に意味不明なデータか、運が悪ければ攻撃者に有利な値を生みます。完全性タグがあれば検知で停止できますが、それでも反転の発生自体は止められません。この物理層の反転を起こすのがRowhammerです。
Rowhammer ─ 電荷漏れによるビット反転の物理
DRAMの1ビットは、1個のキャパシタ(蓄電)と1個のアクセストランジスタで構成されます。電荷あり=1、なし=0という極めて単純な記憶で、キャパシタは時間とともに自然放電するため、一定間隔(標準で64ミリ秒)ごとに読み直して書き戻すリフレッシュで電荷を保ちます。
問題は微細化でセル間隔が縮み、隣接行どうしが電気的に干渉するようになった点です。ある行(アグレッサ行)を**開く(activate)**たびに、ワード線の電圧変動や寄生結合で隣接行(ビクティム行)のキャパシタからわずかに電荷が漏れます。1回ならリフレッシュで回復しますが、リフレッシュ周期の64ミリ秒以内に同じ行を何万回も開閉すると、漏れが蓄積して回復が間に合わず、ビクティム行のビットが反転します。
Rowhammerの基本手順(ダブルサイディング)
対象ビクティム行 V の上下の行 A1, A2 を狙う
loop(64ms以内に数万〜数十万回):
A1 を activate -> 読む -> precharge(行を閉じる)
A2 を activate -> 読む -> precharge
※ A1,A2 を交互に叩くと V への結合干渉が最大化
-> リフレッシュ前に V のセル電荷が閾値を割り、ビット反転
鍵となる条件は2つです。第一に、キャッシュをすり抜けて毎回DRAMの行を実際に開く必要があります。キャッシュに当たると行は開かれないため、攻撃側は clflush 命令やキャッシュ追い出し、非テンポラルアクセスでキャッシュを迂回します。第二に、同じ行に当て続けないようメモリコントローラの行バッファを毎回閉じさせる必要があり、上下2行を交互に叩くダブルサイディングが効果的です。
Rowhammerが厄介なのは、これがソフトウェアの欠陥ではなくDRAMセルの物理特性そのものに由来する点です。パッチで「直す」対象のコードがありません。しかも反転は権限の壁を越えます。攻撃者が自分のメモリ領域を叩いて、物理的に隣接する他プロセスやカーネルのページテーブルのビットを反転させれば、ページの参照先を書き換えて権限昇格に至ります(古典的なPTE攻撃)。仮想メモリの論理的な分離は、物理的に隣接するセルの干渉までは守れません。
対策と限界 ─ TRR・ECC・リフレッシュ
防御は「反転を起こさせない」「起きても検知・訂正する」の2系統です。
第一が TRR(Target Row Refresh) で、現代DDR4/DDR5の主防御です。メモリコントローラかDRAM自身が行アクセスの頻度を監視し、特定の行が異常に多く開かれたと判断したら、その隣接行を通常リフレッシュより前に強制リフレッシュして電荷を回復させます。叩かれる前に補充する発想です。
第二が ECC です。サーバー向けのECCメモリはSECDEDで1ビット訂正・2ビット検出ができ、単発の反転なら訂正で吸収します。DDR5はオンダイECCを標準搭載し、微細化由来の単発エラーをチップ内で隠蔽します。
第三がリフレッシュ間隔の短縮です。64ミリ秒を32ミリ秒にすれば、漏れが蓄積する時間窓が半分になり反転に必要な叩き回数が増えます。ただし電力と帯域を食うため安易には縮められません。
| 対策 | 原理 | 守る相手 | 限界 |
|---|---|---|---|
| TRR | 頻繁に叩かれた行の隣接を先回りリフレッシュ | アグレッサ集中型 | 監視テーブルの容量を超える多数行同時攻撃で回避 |
| ECC(SECDED) | 1ビット訂正・2ビット検出 | 単発の反転 | 同一ワードで複数ビット反転すると訂正不能・誤訂正 |
| オンダイECC | DRAMチップ内で単発エラー隠蔽 | 微細化由来エラー | 外部から見えず多ビット反転には無力 |
| リフレッシュ短縮 | 蓄積時間窓を圧縮 | 全般 | 電力・帯域コスト増、根絶はできない |
限界は明確です。TRRは「少数の行が集中的に叩かれる」前提で設計されたため、攻撃側が多数の行を分散して叩く(TRRespass、Half-Doubleなど)と監視テーブルが溢れ、隣接行のリフレッシュをすり抜けます。ECCも、Rowhammerが同一ECCワード内で複数ビットを反転させれば訂正不能になり、最悪は誤訂正でサイレントに壊れます。実際にECC付きサーバーDRAMでも反転が実証されています。
単独で完全な対策は存在しません。現実解はTRRでアグレッサを抑え、ECCで残った単発を吸収し、TDX/SEV-SNPの完全性保護(TDXはMAC、SEV-SNPはRMPによる所有権検証)で「反転後の改竄データや差し替え」を検知して停止させる、という多層防御です。暗号化(機密性)と完全性タグ(改竄検知)とTRR/ECC(物理反転対策)は、それぞれ別の脅威軸を担当する補完関係にあります。Rowhammerが教えるのは、論理層の防御をいくら固めても物理層の特性が壁を貫きうるという、ハードウェアセキュリティの本質的な難しさです。
「SME/TMEは主記憶全体をAES-XTSで透過暗号化(位置をトゥイークに混ぜパターン秘匿)」「TDXは鍵分離+暗号学的MAC、SEV-SNPは鍵分離+RMPのアクセス制御でホストからも秘匿・改竄検知」「Rowhammerはリフレッシュ周期内に隣接行を高頻度activateして電荷漏れでビット反転(物理現象でソフトのバグではない)」「TRRは集中アグレッサ前提で分散攻撃に弱く、ECCは多ビット反転で破れる」の対応を押さえましょう。
まとめ
- SME/TMEはメモリコントローラの暗号エンジンで主記憶全体をAES-XTSにより透過暗号化し、コールドブートやバス盗聴から機密性を守る。鍵はパッケージ内に留まる。
- TDX/SEV-SNPは鍵分離と完全性保護を加え、信頼しないハイパーバイザからもゲストメモリを秘匿する。完全性はTDXが暗号学的MAC、SEV-SNPがRMPによるアクセス制御と手法が異なるが、いずれも暗号文の差し替えやリプレイを検知・拒否する。
- RowhammerはDRAMセルの微細化に起因する物理現象で、隣接行を64ミリ秒以内に高頻度activateして電荷を漏らしビットを反転させ、論理的な権限分離を物理的に貫く。
- 対策のTRR・ECC・リフレッシュ短縮はいずれも完全ではなく、分散攻撃や多ビット反転で破れる。暗号化・完全性・物理対策を組み合わせた多層防御が現実解になる。
機密性そのものの仕組みはメモリコントローラのスケジューリングとDRAM動作が、反転を吸収する訂正符号の数理はECCメモリが、それぞれ土台を掘り下げます。
CPU/メモリ/ディスク Article
メモリ暗号化とRowhammer ─ DRAM物理層の脆弱性を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
メモリ暗号化
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 5
導入後に効く点
Rowhammerは同じ行を高頻度で開閉して隣接行のセル電荷を漏らし、リフレッシュ前にビットを反転させる物理現象で、ソフトのバグではなくDRAMセルの微細化に起因する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「メモリ暗号化 / Rowhammer」に近いか確認する。
- 強みである「SME/TME/TDXは主記憶をAES-XTS等で透過的に暗号化し、TDXは暗号と完全性タグでハイパーバイザからもゲストメモリを秘匿するが、暗号化はビット反転そのものは防げない。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。