ぶうううん's Cafe

どうにかこうにか。備忘録に近い。

Control Flow Integrity(CFI)についてまとめてみた。

Control Flow Integrity(CFI)

 大学の研究でリサーチしたので、こちらにも少し書いておきたいと思います。

CFIとは何か

 CFIとは、間接呼び出しの飛び先、リターンアドレスを検証するコードをプログラムに挿入する[1]ことによる防御機構である。CFIは対象とするbranchによって、forward edgeもしくはbackward edgeを制限する。forward edgeではcall命令もしくはjump命令などの分岐命令を用いた攻撃を防ぎ、backward edgeではret命令を用いた攻撃を防ぐ。つまり、対象とするgadgetの種類が違うわけである。

CFIのメリット

 CFIによって、ROPやJOPといった攻撃を防ぐことが可能となる。forward edgeを対象とするとCOPやJOPを防ぐことができ、backward edgeを対象とするとROPを防ぐことができる。典型的なBOFによる攻撃(スタックに直接shellcodeを積む攻撃)に加え、これらの攻撃を防ぐことは非常に有効である。

CFIの実装例とIntel CET

 例えば以下のようなソフトウェアで実装例が存在する。

  • Windows (Control Flow Guard)
  • Clang

 確認したところ、実装例の多くはソフトウェアベースの実装であった。しかしながら、Intelの次世代CPU(Tiger Lake Architecture)ではIntel CETというハードウェアベースの実装が存在する。Intel CETは次の2つの技術から成る防御機構である。

  • Shadow Stack
  • Indirect Branch Tracking

Shadow Stackはbackward edge、Indirect Branch Trackingはforward edgeをそれぞれ対象としている。つまり、これらを合わせて使用することでJOPやCOP、ROPを防ぐことが可能である。
 Shadow Stackでは、専用のスタック領域(Shadow Stack)を用意し、Shadow Stackとコールスタックの両方にリターンアドレスをpushする。retする直前に両方のスタックから取り出したアドレスを比較する。比較した結果、アドレスが違うならばBOFを検知したとして例外を発生させる。
 Indirect Branch Trackingでは専用の命令(ENDBRANCH命令)が新規にISAに追加された[2]。ENDBRANCH命令はコンパイラによりjump先のアドレスに埋め込まれ、間接分岐によってjumpした際、jump先にこの命令が存在しない場合はBOFを検知したとして例外を発生させる。

References

[1] 株式会社FFRI:Windowsのセキュリティ新機能Control Flow Guardについて、FFRI Monthly Research、入手先 <https://www.ffri.jp/assets/files/monthly_research/MR201412_Control_Flow_Guard_JPN.pdf> (参照2020-12-31)。
[2] IntelIntel Releases New Technology Specifications to Protect Against ROP attacks、Intel Developer Zone、入手先<https://software.intel.com/content/www/us/en/develop/blogs/intel-release-new-technology-specifications-protect-rop-attacks.html> (参照2020-12-31)。