福岡で開催されたコンピュータのマイクロアーキテクチャの学会であるMICRO 51において、プリンストン大学のRuby B. Lee教授が「セキュリティに配慮したマイクロアーキテクチャ設計(Security-aware Microarchitecture Design)」と題する基調講演を行った。

今年は、マイクロアーキテクチャのセキュリティ欠陥を突くSpectreやMeltdownといった攻撃が発見(正確には、発見は2017年であるが、広まったのは2018年)され、マイクロアーキテクチャのセキュリティが注目された。そのため、MICRO 51では、Ruby Lee教授の基調講演に加えて、セキュリティに関する論文発表セッションが2つも開催された。また、ラストレベルキャッシュを守る実用的な手法を提案した論文が最優秀論文賞を受賞した。

  • Ruby Lee教授

    Grand Hyattホテルで開催されたMICOR 51でSecurity-aware Microarchitecture Designと題する基調講演を行うプリンストン大のRuby Lee教授

Lee教授は、投機実行、アウトオブオーダ実行、分岐予測などはプロセサの性能を向上させるのに大きく貢献しているが、同時にアタック方法の改善にも大きく貢献しているという。MeltdownやSpectreといったマイクロアーキテクチャの欠陥を突く攻撃は、理論的にそういう攻撃が可能だというだけでなく、実際の脅威になっているという。

MeltdownはOSが使っているメモリやレジスタから情報を盗むことができ、Spectreは同一OSの下で動いている他のユーザプログラムのメモリから情報を盗むことができる。

  • MeltdownとSpectreの概要

    投機実行やOOO、分岐予測などはより強力なアタックを可能にしている。MeltdownはOSのメモリやレジスタから情報を漏洩させ、Spectreは他のユーザプログラムのメモリから情報を漏洩させる (このレポートの中の図、表はMICOR 51におけるLee教授の発表スライドを撮影したものである)

セキュリティの破壊には3つのセキュリティの重要な概念の破壊がある。第一は秘密の情報が盗まれる秘密性(Confidentiality)の破壊、第二はデータが書き変えられてしまうデータの完全性(Integrity)の破壊、第三は正当なユーザが使用できないようにする利用性(Availability)の破壊である。これらの3つの重要なセキュリティの性質は「CIA」と覚えておけばよい。

  • セキュリティのCIA

    主要なセキュリティの破壊にはConfidentiality、Integrity、Availabilityの破壊がある。これらはCIAと覚える

そして、データを守るためにはアクセスコントロール(Access Control)が重要で、データへのアクセスを許可する前に、誰がアクセスしようとしているのか(Authentication)? その人はアクセスが許可されているのか(Authorization)? を確認することが重要である。こちらは「AAA」と覚えればよい。

  • セキュリティのAAA

    情報の保護にはAccess Controlを行って、Authentication、Authorizationを行うことが重要である。こちらはAAAと覚える

しかし、情報は本来通信に使われる目的で作られたものではない秘密の通路を使って盗まれることもある。そのような通路の代表的なものは、サイドチャネルとコバートチャネル、タイミングチャネルである。サイドチャネルは、そこを通って被害者から攻撃者に秘密情報が漏れてしまう。コバートチャネルは被害者側に内通者がおり、コバートチャネルを通して攻撃者に秘密情報を送ってしまう。

タイミングチャネルは命令の実行時間に差ができることで作られるサイドチャネルやコバートチャネルを指す。

  • 攻撃手法

    情報は本来の通信路ではないサイドチャネル、コバートチャネルを使って漏洩されることもある。タイミングチャネルはサイドチャネルやコバートチャネルが命令実行のタイミングの違いで作られるものを指す

次の表は、現在報告されている投機実行メカニズムの欠陥を突く攻撃の一覧である。CVEはCommon Vulnerabilities and Exposuresの略で、発見された攻撃の一覧を作って公開している。最近では、最初に見つかったMeltdownとSpectreの新たなバリエーションが発見され、さらにIntelプロセサの秘密をキープするSGX Enclaveから情報を盗み出すForeshadowやFPU経由で情報を盗み出すLazy FPなど新手の攻撃が加わってきている。

  • マイクロアーキテクチャの欠陥を突く攻撃の一覧

    マイクロアーキテクチャの欠陥を突く攻撃の一覧。MeltdownやSpectreの新しいバリエーションが見つかり、ForeshadowやLazy FPといった新しい攻撃が見つかっている

投機実行に対するアタックは、

  1. マイクロアーキテクチャがアクセス権限のない秘密情報に一時的なアクセスを許容する
  2. 秘密情報をアーキテクチャ状態として残る情報(例えばキャッシュアドレス)に変換することができる
  3. アーキテクチャ状態の変化を攻撃者に送ることができる

という条件が成り立つことが必要である。

  • 攻撃が成り立つ条件

    投機実行の欠陥を突くアタックには、この3つの条件が成り立つことが必要である

例えば、Meldown攻撃の場合は、次の図に示すように、配列Bをキャッシュから消去(Flush)し、例外の発生などの方法で後続の命令の投機実行を開始させ、それが続いている間に、秘密情報に対するロード命令を発行する。そして、読み出されたsecretに4096を掛けてアドレスに変換する。4096を掛けるのは、secretの値によってアクセスするキャッシュラインが異なるようにするためである。

そして、secret情報を使って作ったアドレスの配列Bをロード命令で読み出す。

次にReloadで配列Bを順番にアクセスする。配列Bは最初にすべてフラッシュされているので、ロード命令はキャッシュにヒットすることはなく、メインメモリからデータを読んでくるのでアクセスに長い時間が掛かる。しかし、そのアドレスが前のロード命令でアクセスされたものである場合は、すでにキャッシュにデータが入っているので、アクセスはキャッシュヒットし、短時間でアクセスできてしまう。

このアクセス時間の違いからB[addr]がどのキャッシュラインであるかが分かり、addrの値を知ることができる。例外の発生でプロセサが特権状態になり、そこでアタックのためのメモリアクセスが行なわれると、ユーザプログラムである攻撃者でもOSのメモリでも読み出すことができてしまう。

  • Meltdown攻撃のシナリオ

    Meltdown攻撃のシナリオ。投機実行状態で本来アクセスできないアドレスのデータを読み出し、その秘密データの値を使って特定のキャッシュラインを読み出す。秘密データは投機実行状態を抜けると読めなくなるが、アクセスされたキャッシュラインはその状態で残るので、タイミングアタックが可能になる

Spectreの攻撃では条件分岐命令を使って投機実行を行わせる。if x<array_A_sizeはxにarray_A_sizeより小さい値を入れて条件が成立する状態で何回も実行させ、次回に大きな値をいれても分岐なしと予測するようにしておく。そして、xにarray_A_sizeより大きい値を入れて狙った秘密情報をarray_A(正確にはarray_aの範囲外のデータ)から読み出す。その後の手順はMeltdownと同じである。ただし、攻撃のためのメモリアクセスはユーザ状態で行われるので、同一OS内で実行される他のプロセスのメモリにはアクセスできるか、OSのメモリにはアクセスできない。

  • Spectreの攻撃シナリオ

    Spectreの攻撃シナリオ。Meltdownと似ているが、分岐予測の誤りから生じる投機実行を利用する点が異なる

Foreshadowは、秘密情報を保護するためにIntelプロセサに作られたSGX Enclaveの情報を盗み出すアタックで、このアタックの亜種はOSのメモリやVMMのメモリも読み出すことができる。

  • Foreshadowの概要

    Foreshadowは高度の秘密情報を守るためにIntelが作ったEnclaveのデータを盗み出すことができる

(後編は11月2日に掲載します)