#はじめに
rowhammer攻撃というメモリの値を無理やり書き換えてしまう手法について調べてみました。
#脆弱性の内容
##前提知識
DRAMの原理とCPU cacheについて知っておく必要があります。役に立ちそうな資料を列挙しておきますので読み漁ってください。
【wikipedia】Dynamic Random Access Memory
DRAMとは
この図が重要です。「ランク」と「バンク」の関係についておさえます。
今さら聞けないメモリーの基礎知識 FP~BEDO DRAM編
Ryzenで話題になった、メモリの”Rank”って何のこと?
「ランク」の説明です
##rowhammer
DRAMとCPU cacheについて理解できたということにして、本題に入ります。
紫の行が値を書き換えたいメモリセルの行、victim rowです。
その上下に黄色い行があります。
この黄色い行に猛烈に値を書き込んでやると、ノイズが大量に発生し、victim rowのメモリセルのキャパシタの電荷が影響を受け、結果値が書き換わります。これが rowhammer です。
ノイズ任せなのでvictim rowのどのメモリセルが影響を受けるのか、値が1になるのか0になるのかはコントロールできません。
(電荷が抜ける方向が主になると思うので値は0になりやすいと思いますが、1になる場合もあるようです。なので1次資料では bit flip という表現を使ってます)
PoCは以下。CPU cacheに乗っているとDRAMまで届かないのでclflushでCPU cacheをフラッシュし、追い出しています。
code1a:
mov(X)、%eax //アドレスXから読み込み
mov(Y)、%ebx //アドレスYから読み込み
clflush(X)//アドレスXのキャッシュをフラッシュする
clflush(Y)//アドレスYのキャッシュをフラッシュする
jmp code1a
この攻撃を成功させるには
- DDR3, DDR4 でECC無し版
- DRAMの構成がわかっていること
- リフレッシュが行われる前に攻撃
が必要です。
1は、rowhammerがノイズ任せなので微細加工の進化によるところが大きいそうです。微細加工によりノイズに弱くなりますからね。 「DDR ゃ DDR2 SDRAM モジュールにはほとんど、または全く影響しない。多くの DDR3 や DDR4 SDRAM モジュールには影響を及ぼす。」とのことです。またECCでエラー訂正するのは効果が高いそうです。
2は、ソフトウェアでアクセスできるアドレスは論理アドレスですが、rowhammerの原理からして物理アドレスに変更し、かつ同一バンク内にある上下行の物理アドレスを特定する必要があります。
linuxだと
$sudo decode-dimms
で調べられるようです。(macOSではdecode-dimmsは無かったです。。システムレポートでもわからず)
3は、リフレッシュが行われるとvictim rowの電荷がチャージされて元気になってしまうのでやり直しになる。ということですね。
#感想
面白い攻撃があるものです。
#参考
Rowhammer問題私的まとめ
【Project Zero】Exploiting the DRAM rowhammer bug to gain kernel privileges
JVNVU#92147586 統合型 GPU に対する WebGL を利用したサイドチャネル攻撃 および Rowhammer 攻撃
#履歴
2018/8/12 初版