福岡で開催されたコンピュータのマイクロアーキテクチャの学会であるMICRO 51において、プリンストン大学のRuby B. Lee教授が「セキュリティに配慮したマイクロアーキテクチャ設計(Security-aware Microarchitecture Design)」と題する基調講演を行った。
今年は、マイクロアーキテクチャのセキュリティ欠陥を突くSpectreやMeltdownといった攻撃が発見(正確には、発見は2017年であるが、広まったのは2018年)され、マイクロアーキテクチャのセキュリティが注目された。そのため、MICRO 51では、Ruby Lee教授の基調講演に加えて、セキュリティに関する論文発表セッションが2つも開催された。また、ラストレベルキャッシュを守る実用的な手法を提案した論文が最優秀論文賞を受賞した。
Lee教授は、投機実行、アウトオブオーダ実行、分岐予測などはプロセサの性能を向上させるのに大きく貢献しているが、同時にアタック方法の改善にも大きく貢献しているという。MeltdownやSpectreといったマイクロアーキテクチャの欠陥を突く攻撃は、理論的にそういう攻撃が可能だというだけでなく、実際の脅威になっているという。
MeltdownはOSが使っているメモリやレジスタから情報を盗むことができ、Spectreは同一OSの下で動いている他のユーザプログラムのメモリから情報を盗むことができる。
セキュリティの破壊には3つのセキュリティの重要な概念の破壊がある。第一は秘密の情報が盗まれる秘密性(Confidentiality)の破壊、第二はデータが書き変えられてしまうデータの完全性(Integrity)の破壊、第三は正当なユーザが使用できないようにする利用性(Availability)の破壊である。これらの3つの重要なセキュリティの性質は「CIA」と覚えておけばよい。
そして、データを守るためにはアクセスコントロール(Access Control)が重要で、データへのアクセスを許可する前に、誰がアクセスしようとしているのか(Authentication)? その人はアクセスが許可されているのか(Authorization)? を確認することが重要である。こちらは「AAA」と覚えればよい。
しかし、情報は本来通信に使われる目的で作られたものではない秘密の通路を使って盗まれることもある。そのような通路の代表的なものは、サイドチャネルとコバートチャネル、タイミングチャネルである。サイドチャネルは、そこを通って被害者から攻撃者に秘密情報が漏れてしまう。コバートチャネルは被害者側に内通者がおり、コバートチャネルを通して攻撃者に秘密情報を送ってしまう。
タイミングチャネルは命令の実行時間に差ができることで作られるサイドチャネルやコバートチャネルを指す。
次の表は、現在報告されている投機実行メカニズムの欠陥を突く攻撃の一覧である。CVEはCommon Vulnerabilities and Exposuresの略で、発見された攻撃の一覧を作って公開している。最近では、最初に見つかったMeltdownとSpectreの新たなバリエーションが発見され、さらにIntelプロセサの秘密をキープするSGX Enclaveから情報を盗み出すForeshadowやFPU経由で情報を盗み出すLazy FPなど新手の攻撃が加わってきている。
投機実行に対するアタックは、
- マイクロアーキテクチャがアクセス権限のない秘密情報に一時的なアクセスを許容する
- 秘密情報をアーキテクチャ状態として残る情報(例えばキャッシュアドレス)に変換することができる
- アーキテクチャ状態の変化を攻撃者に送ることができる
という条件が成り立つことが必要である。
例えば、Meldown攻撃の場合は、次の図に示すように、配列Bをキャッシュから消去(Flush)し、例外の発生などの方法で後続の命令の投機実行を開始させ、それが続いている間に、秘密情報に対するロード命令を発行する。そして、読み出されたsecretに4096を掛けてアドレスに変換する。4096を掛けるのは、secretの値によってアクセスするキャッシュラインが異なるようにするためである。
そして、secret情報を使って作ったアドレスの配列Bをロード命令で読み出す。
次にReloadで配列Bを順番にアクセスする。配列Bは最初にすべてフラッシュされているので、ロード命令はキャッシュにヒットすることはなく、メインメモリからデータを読んでくるのでアクセスに長い時間が掛かる。しかし、そのアドレスが前のロード命令でアクセスされたものである場合は、すでにキャッシュにデータが入っているので、アクセスはキャッシュヒットし、短時間でアクセスできてしまう。
このアクセス時間の違いからB[addr]がどのキャッシュラインであるかが分かり、addrの値を知ることができる。例外の発生でプロセサが特権状態になり、そこでアタックのためのメモリアクセスが行なわれると、ユーザプログラムである攻撃者でもOSのメモリでも読み出すことができてしまう。
Spectreの攻撃では条件分岐命令を使って投機実行を行わせる。if x<array_A_sizeはxにarray_A_sizeより小さい値を入れて条件が成立する状態で何回も実行させ、次回に大きな値をいれても分岐なしと予測するようにしておく。そして、xにarray_A_sizeより大きい値を入れて狙った秘密情報をarray_A(正確にはarray_aの範囲外のデータ)から読み出す。その後の手順はMeltdownと同じである。ただし、攻撃のためのメモリアクセスはユーザ状態で行われるので、同一OS内で実行される他のプロセスのメモリにはアクセスできるか、OSのメモリにはアクセスできない。
Foreshadowは、秘密情報を保護するためにIntelプロセサに作られたSGX Enclaveの情報を盗み出すアタックで、このアタックの亜種はOSのメモリやVMMのメモリも読み出すことができる。
(後編は11月2日に掲載します)