ロウハンマー

ロウハンマー (row hammer, rowhammer) は、ダイナミックRAM (DRAM) に起きる意図的でない副作用で、複数のメモリセルから電荷が漏れ出し、メモリセル間で電気的な相互作用が起きるために、元のメモリアドレスで指定されていない近くの行の内容が漏れだす可能性があるという現象（行間干渉）である。このようなメモリセル間の分離の回避は近年のDRAMのメモリセルの密度の高さに起因しており、同じ行を何回もすばやく有効にするよう特別に細工されたメモリアクセスパターンによって引き起こされることがある。
ロウハンマーはコンピュータ・セキュリティで権限昇格に悪用（→エクスプロイト）されており、
攻撃者と被害者が高速ネットワークで接続されている場合はネットワークベースの攻撃も理論的には可能である。
ロウハンマーを防ぐいくつかの異なるハードウェアベースの技法が存在する。これにはDRAM メモリモジュールのタイプとプロセッサによるサポートを必要とするものが含まれる。

ロウハンマーはDDRやDDR2 SDRAMモジュールにはほとんど、または全く影響しない。多くのDDR3やDDR4 SDRAMモジュールには影響を及ぼす。

背景

DRAMの内部では、格納されたデータの各ビットは１個のキャパシタ（コンデンサ）と１個のトランジスタで電気的に実装された独立なメモリセルを占有する。キャパシタの充電状態（充電されているかいないか）によりDRAMメモリセルが2進値"1"を持つか"0"を持つかが決まる。集積回路には膨大な数のDRAMメモリセルが、データの読み書きとリフレッシュのためにセルを編成する付加的なロジック回路と共に詰め込まれている。
さらに、メモリセル（イラストでは青の四角）は行列に編成され、行アドレスと列アドレスによって選択される。メモリアドレスは行アドレスデコーダと列アドレスデコーダ（イラストではそれぞれ垂直と水平な緑の長方形）によって行アドレスと列アドレスに分割される。読み出し動作では行の行アドレスが選択された後（この選択は行アクティベーションとも呼ばれている）、この行のすべてのメモリセルからのビットは行バッファ（イラストでは赤い四角）を構成するセンスアンプに移され、ここから列アドレスによって1ビットが選び出される。その結果、読み出し動作は破壊的な性質を持つ。 DRAM の設計はメモリセルの電荷を行バッファに移すことによって読み出した値を後で再びメモリセルに書き戻すことを要求しているからである。書き込み動作でも同様にしてアドレスを解釈するが、1ビットの変更に対して行全体を再書き込みする構造となっている。
自然放電するキャパシタを用いてデータを保持するため、DRAMのメモリセルは時間とともにデータを失っていくので、周期的にすべてのメモリセルを書き込み直す必要がある。これはメモリリフレッシュ動作（リフレッシュ）と呼ばれている。
DRAMの構造上、宇宙線その他の影響を受けて保持したデータがランダムに変化するソフトエラーと言う誤動作が起きやすい。
誤動作対策にはいくつかの技法があり、DRAMの信頼性を向上させている。よく使われるものにはECCメモリやその改良版（ロックステップメモリなど）がある。

概要

DRAM集積回路の密度の向上は、電荷を少ししか蓄えられない物理的に小さなメモリセルをもたらし、結果として動作のノイズマージンは減少し、メモリセル相互間の電磁相互作用の度合いが増大し、データ損失の可能性が上昇した。
結果として外乱エラー (disturbance error) が観測された。それはメモリセルが相互の動作を妨害することにより、影響されたメモリセルに格納されたビットの値がランダムに変化することで明らかとなった。
外乱エラーについての指摘は1970年代初期にさかのぼる。初の商業的DRAM集積回路 (IC)・インテル1103以来、メモリセル間の絶縁性向上、製品検査の実施など、DRAMメーカーは種々の技術で外乱エラーを軽減してきた。
しかし研究者は2014年に、2012年・2013年に製造された商用のDDR3 SDRAMチップが外乱エラーの影響を受けることを確かめた。その中で、観測されたビット反転を導く副作用をロウハンマー (row hammer) と命名している。
DDR3メモリでロウハンマーが起こる機会は、高いメモリセル密度に起因するメモリセル間相互作用の結果がもたらしたとはじめは考えられていたが、高速な DRAM 行選択動作が主な原因であると究明された。
高速な行選択動作は対応する行選択線に電圧変動を引き起こし、近くの（ほとんどの場合、隣の）行（被害行 (victim row) と呼ばれる）にあるキャパシタに自然状態よりも高い放電率を誘発するのが観測された。影響されたメモリセルが電荷を一定以上失ってもリフレッシュされないとき、外乱エラーが起こる。
テストでは（キャッシュのフラッシュとともに）約139,000回のメモリ行アクセスを続けると外乱エラーが観測される可能性があり、影響を受けるメモリセルが1,700個のうち1個にのぼる恐れがあることが示されている。
また、これらのテストは外乱エラーの頻度は環境温度の上昇には実質的に影響されず、DRAMの記憶内容に依存することを示している。特定のビットパターンによって外乱エラーの頻度が大幅に高まるのである。
両側干渉 (double-sided hammering) と呼ばれるバリエーションは、被害行を取り巻く2つの行を動作させるものである。この節のイラストでは、紫色の被害行にビット反転を誘発するねらいで両方の黄色の行を動作させる。
テストでは、この方法により被害行の片側の隣接行だけを動作させる場合に比べて外乱エラーの頻度が大きく上昇する可能性があることを示している。

緩和策

ロウハンマーの検出・予防・修正・緩和には様々な手法が存在し、効果もそれぞれである。
テストによると、単純なECCによる対策は、1ビットのエラー修正と2ビットのエラー検出能力を持つが、メモリの1ワードに3つ以上のビット反転が起きることがあり、外乱エラーのすべてを修正あるいは検出できないことを示している。

より効果的な対策は、通常の 64ms間隔よりも頻繁にリフレッシュを行うことである。

しかしこの方法では消費電力と処理のオーバーヘッドが増大する。いくつかのメーカーはファームウェアの更新によってこの種の緩和策を提供している。
もう少し手の込んだ方法として、カウンタに基づいて頻繁にアクセスされる行を特定し、前もって隣接する行をリフレッシュするというものがある。別の方法として、アクセスされた行の隣接行をアクセス頻度に関係なくときどきランダムにリフレッシュするというものもある。
研究は、これら2つの予防策の性能への影響は無視できる程度だと説明している。
Ivy Bridgeマイクロアーキテクチャのリリース以後、インテル Xeonプロセッサは疑似目標行リフレッシュ (pseudo target row refresh, pTRR) と呼ばれるものをサポートしている。pTRR対応DDR3 DIMMはロウハンマー効果を緩和するように被害行となりそうな行を自動的にリフレッシュし、メモリ性能や消費電力にほとんど影響を与えない。
pTRR非対応のDIMMが使われた場合、デフォルトでこれらのXeonプロセッサはDRAMのリフレッシュ頻度を通常の2倍にする。結果として、メモリアクセスのレイテンシが少し増え、メモリの帯域幅が最大2〜4%減少する。
JEDECの発行したLPDDR4モバイルメモリ規格には、
オプション回路として目標行リフレッシュ (target row refresh, TRR) と呼ばれるもののサポートが含まれている。これは性能や消費電力にほとんど影響を与えずにロウハンマー効果を予防する。
さらに、JEDECの発行したDDR4メモリ規格には含まれていないにもかかわらず、一部のメーカーはDDR4製品にTRRを実装している。
内部的にTRRは行選択動作の数を数え、あらかじめ決められたチップ固有の最大動作数 (maximum activate count, MAC)・最大動作時間 (maximum activate window, tMAW) の値と比較することで、被害行となりそうな行を特定し、これらの行をリフレッシュしてビット反転を予防する。
MAC 値は、DRAM の特定の行が、その隣接行が被害行と認識されるまでの時間 tMAW と同じかそれ以下の一定時間間隔のうちに遭遇しうる行選択動作の合計数の最大値である。TRR はまた、タイミング・ウインドウ tMAW のうちに2つの隣接行の行選択動作の合計が MAC の制限に達したとき、被害行としてフラグを立てる。
ロウハンマーの悪用は、高速なDRAM行選択動作を膨大な数で行う必要があるため多数のキャッシュされないメモリアクセスを行いキャッシュミスを引き起こすので、
ハードウェアパフォーマンスカウンタを使ってキャッシュミス発生率をモニターすることで異常なピークとして検出できる。
2013年12月3日にリリースされたメモリ診断ソフトMemtest86 Version 5.0 には、コンピューターのRAMが外乱エラーに影響されるかどうかを検査するロウハンマーテストが追加された。これはUEFIブートのコンピュータでしか機能しない。UEFIのないコンピュータではロウハンマーテストのない古いバージョンが起動する。

影響

プロセスに割り当てられていないメモリへのアクセスを防止するメモリ保護は、最新のオペレーティングシステムの背後にある概念の1つである。
プログラム（や一般にコンピュータシステム）は特定のタスクを実行するために要求される限られた権限を持つ各部分であるプロセスに分割されるが、リングプロテクションなど他のセキュリティ機構とメモリ保護を組み合わせることで、プロセス間の特権分離が達成できる。
特権分離を使うと、コンピュータセキュリティに対する攻撃の効果をシステムの特定の部分に制限することにより、潜在的な被害の範囲を小さくすることもできる。
外乱エラー（→#概要）は、基盤にあるメモリのハードウェアを直接操作するユニークな攻撃経路を実質的に作ることで、プロセスがメインメモリの任意の部分を変更できるようになり、メモリ保護のさまざまな層をとても低いハードウェアレベルで「短絡する」ことにより効果的に打ち破ってしまう。
これと比較して、バッファオーバーフローのような「従来の」攻撃経路は、プログラムのさまざまなミスを悪用して保護機構をソフトウェアのレベルで迂回し、他の方法ではアクセスできないメインメモリの内容を変更することを狙っている。