第26回 メモリの脆弱性

RowHammer(ローハンマー)とRAMBleed(ラムブリード)という言葉を知っているでしょうか? 一般的にはあまり聞きなれない言葉だと思います。しかしストレージとも関係するメモリの脆弱性、つまりその性質を悪用されるとサイバー攻撃等を受けて大きな損害を被るという話です。

いわゆる理系、特にコンピューターの技術について少しでも学んだことのある人であれば、コンピューターが間違いを犯すことに疑問を呈しないのですが、そうでない人にとってコンピューターが間違いを犯す、特に記憶違い、計算間違いを犯すことは想像もしないようです。しかしコンピューターは間違いを犯すことがあるのです。それはプログラムの間違いや人間の操作ミスではなく、人と同じように、単純に記憶間違いや計算間違いをするのです。その詳細については紙面(記述量)の都合上省きます。

コンピューター、特に一般に利用されるパソコンの場合、記憶はメモリと呼ばれる半導体記憶装置がその役割を担います。記憶ではなく、記録、つまり恒常的に利用するデータの場合はストレージと呼ばれる記憶媒体に格納されます。ストレージには物理的には半導体もあれば、磁気記憶媒体、テープ等様々なデバイスが利用されます。パソコンは高速に処理することが肝要ですので、それが重視される半導体メモリを用いて、データを記憶するのです。

パソコンが複雑な計算を行う原理は、CPU(中央演算装置)と呼ばれる単純な計算を高速に行う装置とメモリと呼ばれる高速に読み書きが行われる記憶装置によって、複雑な計算を単純な計算の繰り返しで行うことにあります。パソコンの性能を決定付けるいくつかの要因の一つがメモリの容量、つまりどれだけ記憶出来るかということと、その読み書きの高速性です。

現在では、このパソコンのメモリとしてDRAM(Dynamic Random Access Memory、ディーラム)と呼ばれる半導体メモリが用いられます。パソコンを購入する際に、メインメモリが4GBとか8GBと書いているのは、通常、このDRAMの容量のことです。このDRAMですが、リフレッシュと呼ばれる常に書き込みを行わなければ記憶が消えてしまいます。つまり電源を抜くと記憶が消えてしまうのです。電源に関わらず、記憶が消えないほうが電力の消費量の点からも、使い勝手からも都合がよいのですが、大容量で、しかも安価に提供できることから、パソコンではDRAMが一般的に使われているのです。

このDRAMですが誤る、つまり記憶された1ビットが電磁的な干渉で反転することがあるのです。特に最近の大容量、高速動作、そして低電力の要求から、より小さく製作、つまり高密度化が図られ、その影響で誤りを起こす頻度が無視できなくなっています。概念的に言えば、DRAMでは1ビット毎に記憶する箱があり、その中に電荷があるかないか(電気を帯びているか否か)で記憶しています。高密度化によって、その箱があまりにも小さくなり、隣の箱に電荷が洩れてしまうことがあるのです。

RowHammerとは物理的に隣接したメモリセル、つまり電荷を入れる箱の周辺を特定の方法でアクセスすることによって、わざとその電荷を逃がし、本来、電荷が入っている箱であるにも関わらず、電荷がなくなり、誤りが起こることです。2014年にこの現象が明らかになり、具体的な攻撃方法として問題となりました。当初はこの現象を利用して、わざと誤りを起こし、システム障害を引き起こす攻撃法が主でした。2019年になって、このRowHammerを利用して、本来読み取ることが出来ないメモリ領域を読み取ることを可能にする方法が提案されました。それがRAMBleedと呼ばれる攻撃方法です。たとえば、この攻撃方法を使って、暗号化鍵を外部から読み取ることができる可能性が指摘されています。具体的には、OpenSSHと呼ばれる、パソコンをリモートアクセス(遠隔操作)する際に、そのすべての通信を暗号化するツールにおいて、その暗号化鍵を導出する方法が提案されています。我々、神戸大の研究グループは、RAMBleedを用いて、一般にhttpsと呼ばれるwebの暗号化通信に用いられるOpenSSLの暗号化鍵を導出する可能性について考察しています。

RAMBleedの基本的原理は以下の通りです。暗号化鍵のあるビットが1か0のどちらであるかを判定したいとします。先ほどの箱の例で、3つの箱が隣接している場合、両サイドの箱に電荷がある場合、中央の箱に誤りが起こることはありません。電荷がある場合を1,ない場合は0とします。この場合、1-0-1、あるいは1-1-1となるわけですが、誤りが起きないわけです。しかし、両サイドが0の場合、0-0-0の場合、誤りが起こらないのですが、0-1-0の場合、誤りが起こり0-0-0となってしまうことがあるのです。知りたい暗号化鍵のビットを両サイドに置くことが出来、かつ中央のビットを自由に読み書きできたとするならば、中央のビットが誤っていることがわかれば、両サイドのビットは高い確率で0であるとわかります。必ず誤りが起こるというわけではないのですが、この暗号化鍵の0であるか1であるかというわずかの偏りを利用して、何度も暗号化を行って、つまり不正なことを行うことなく、気づかれることもなく、暗号化鍵全体を推定するのです。実際、求めなくてはならない暗号化鍵は1,000ビット以上ですが、数時間程度で鍵を導出することが可能となります。

RAMBleedの基になるRowHammer対策として、最近のDDR4というDRAMの規格では、TRR(Target Row Refresh)と呼ばれる対策がなされています。しかし、このTRRに対しても新たな攻撃法が提案されており、その攻撃方法の難易度(実行の難しさ)は小さくないとしても、不審な通信の管理といった対策は必要となっています。

https://rambleed.com/