Upgrade to Pro — share decks privately, control downloads, hide ads and more …

開源編譯器,如何實現系統安全最後一哩路

 開源編譯器,如何實現系統安全最後一哩路

COSCUP Talk

D69e77fd50edf1a9c6d5ffcddd03dd90?s=128

Funny Systems

August 20, 2016
Tweet

Transcript

  1. 2016/08/20 COSCUP

  2. 起點 0

  3. Hi COSCUP Kuon,喜歡學習,特別是「安全技術」 http://Funny.Systems/ • 編譯器安全計畫

  4. 貓捉老鼠 年,貓跑不動了! 1

  5. 不能用的劍 一.學術作法 1. 程式語言 • C 語言子集合 (C-Subset) » 沒人用

    • 領域專用語言 (DSL) » 更沒人用 2. 程式方法 • 函數式程式設計 (FP) » 有潛力 – 舊有風格程式碼 (Legacy Code) !?
  6. 明朝的官 二.古代作法 (~2010) 1. 作業系統 • 記憶體隨機化 (ASLR) • 記憶體不可執行

    (DEP/NX) 2. 編譯器 • 堆疊溢位檢測 (StackGuard)
  7. 清朝的劍, 砍→明朝的官 二.古代作法 (~2010) 1. 作業系統 • 記憶體隨機化 (ASLR) »

    有條件繞過 • 記憶體不可執行 (DEP/NX) » 可成熟繞過 2. 編譯器 • 堆疊溢位檢測 (StackGuard) » 有條件繞過 • 靜態分析 » 堪用~可用 – 掃描完,修不完!
  8. 還在發 Paper 階段 三.其他作法 1. 軟體驗證 (Verification) » (軍)工業等級 •

    But … 如果你還想加個新功能 (大驚!) 2. 執行檔二次處理 » 有時候需要 3. 虛擬化 » 看怎麼使用
  9. 軟體安全 系統安全 • OS – Kernel • TCB (Trust Computing

    Base) – Hypervisor • Firmware – TrustZone
  10. 安全觀 2

  11. 聯網性、持續性

  12. 聯網性、持續性

  13. 聯網性、持續性

  14. 跨界 • 軟體缺陷,到底是不是安全問題? 1. Null Pointer 2. Undefined Behavior

  15. 跨界 • 軟體缺陷,到底是不是安全問題? 1. Null Pointer » OS 有關 2.

    Undefined Behavior » 已經是了
  16. 思路 (Idea) 怎麼進去機場裡面? »

  17. 思路 (Idea) « 另一個切入點 »

  18. http://www.appledaily.com.tw/appledaily/article/headline/20110708/3351 3284/

  19. 弱點 (Flaw) Uninitialized Memory、Dangling Pointer Use-After-Free、Double Free Use-After-Return、Use-After-Destructor Null Pointer

    (Dereference) Type Confusion Race Condition、Data Race、TOCTOU
  20. 輔助 (Helper) Non-randomized Memory RWX Memory (ex:JIT) Info Leak、Memory Disclosure

  21. 利用 (Exploit) ROP、JOP、IOP、LOP、SOP、SROP、BROP Data Reuse、Non-Control-Data Attack DOP COOP CROP JIT

    Spray、Heap Spray Stack Spray Stack Pivot 、Stack Hooking
  22. 未知攻、焉知防

  23. 未知攻、焉知防

  24. 建立好的防守 比攻擊更困難

  25. 編譯器 3

  26. C 語言 • Integer 、Float • Pointer 、Array 、Vector 、Structure

    、 Function
  27. 記憶體空間 • Stack • Heap • Global

  28. 編譯器 • Module • Function • Basic Block • Instruction

  29. 編譯器 + 安全 4

  30. 軟體安全 粒度 效能 相容性

  31. 相容性 • Architecture • OS • Kernel-mode vs. User-mode •

    Compiler Extension • Toolchain
  32. 安全編譯階段 1. 建模 2. 解構 3. 轉換 4. 合成

  33. None
  34. C/C++ 語言 • Pointer – Code Pointer – Data Pointer

    – Object Pointer
  35. C/C++ 語言 • Pointer – Code Pointer • Return Address

    • Function Pointer • Method Pointer • Virtual Function Pointer – Data Pointer – Object Pointer
  36. C 語言 • Pointer – 完整性(效驗) • Return Address –

    隔離性 • Return Address – 不可預測性 • Function Pointer、Method Pointer
  37. C 語言 • Array、Global Data – 方向性 • Overflow •

    Underflow – 隔離性 • 邊界防禦
  38. 記憶體空間 • Stack、Global – 讀寫模型 (Read-Write Model) – 順序性 •

    依變數型態 – 不可預測性 • 變數間距
  39. 編譯器階段 • Function – 不可預測性 • 函數間距 – 完整性(效驗) •

    函數依賴關係
  40. 編譯器階段 • Instruction – 不可預測性 • 指令位址隨機化 • 指令序列混淆 –

    抑制 ROP 手法 • 指令序列黑名單
  41. 用老虎、抓老鼠 5

  42. None
  43. StackGuard • 1998 年提出,GCC & LLVM • 透過編譯器,在 Stack Frame

    的 Return Address 前,插入 Canary/Cookie 。 – 用來抑制 Stack Overflow 問題 – Function Pointer on Stack – fork()
  44. CFI – Control Flow Integrity • 2005 年提出,LLVM • 透過編譯器,針對

    Direct/Indirect Control Flow 作完整性驗證 – Call Site & Call Target 互相配對 – 用來抑制 ROP 問題 – Mixing Function Chain & ROP Chain • 3rd Party • Legacy Code • Edge Case
  45. SafeStack • 2005 年左右提出,LLVM • 透過編譯器,依照 Stack 內,變數的各種安 全屬性,重新分配到記憶體其他段落 –

    一種 Dual Stack 策略 – Nested Function – Resize Stack at Runtime
  46. VTV – Virtual Table Verification • 2014 年提出,GCC & LLVM

    • 透過編譯器,針對 Virtual Table 結構,和 Virtual Function 呼叫,中間插入一層驗證 機制 – 主要用來抑制 Use-After-Free – Instantiated Template – tcmalloc
  47. 攻守同源 奇正相長

  48. Q&A