Securing Software

Run-time Enforcement

Goals

  • Understand how to retroactively create safe pointers
  • Understand how Control-Flow Integrity (CFI) works
  • Analyze the strengths and weaknesses of CFI
  • Construct basic control-flow graphs

Safe Pointers

  • What properties do we want from safe pointers?
  • What changes are needed to implement safe pointers?

CFI

  • What is the adversary model for CFI?
    • How does this compare to the adversary model for previous defenses we’ve seen (e.g., canaries)?
  • What properties does CFI require to be sound?
  • What guarantees does CFI give us?
    • How does this compare to previous defenses?
  • Why does CFI require a control-flow graph?

  • Control Flow Graphs (CFGs)
    • What is a basic block?
    • How are CFGs defined?
    • Building a CFG
      • What distinguishes a sensitive vs. an insensitive analysis?
      • What properties might an analysis be sensitive to?
      • Define soundness vs. completeness
  • Where and how does CFI instrument a binary?

  • How can CFI instrumentation be verified?

  • What’s the performance impact of CFI?

  • What kinds of attacks can bypass CFI?