stack canary 的認識

在前面的博客裏面,已經介紹了 stack overflow 的攻擊原理,其中也設計到了 GCC 編譯器的 stack canary 技術,用於預防 stack overflow.

現在再來詳細瞭解一下stack canaries 的種類,已經他們的作用吧。


如果能在運行時檢測出 stack overflow 破壞,就有可能對函數棧進行保護。目前的堆棧保護實現大多使用基於 “Canaries” 的探測技術來完成對這種破壞的檢測.  

要檢測對函數棧的破壞,需要修改函數棧的組織,在緩衝區和控制信息(如 EBP 等)間插入一個 canary word。這樣,當緩衝區被溢出時,在返回地址被覆蓋之前 canary word 會首先被覆蓋。通過檢查 canary word 的值是否被修改,就可以判斷是否發生了溢出攻擊。

常見的 canary word:

  • Terminator canaries
  • 由於絕大多數的溢出漏洞都是由那些不做數組越界檢查的 C 字符串處理函數引起的,而這些字符串都是以 NULL 作爲終結字符的。選擇 NULL, CR, LF 這樣的字符作爲 canary word 就成了很自然的事情。例如,若 canary word 爲 0x000aff0d,爲了使溢出不被檢測到,攻擊者需要在溢出字符串中包含 0x000aff0d 並精確計算 canaries 的位置,使 canaries 看上去沒有被改變。然而,0x000aff0d 中的 0x00 會使 strcpy() 結束複製從而防止返回地址被覆蓋。而 0x0a 會使 gets() 結束讀取。插入的 terminator canaries 給攻擊者製造了很大的麻煩。
  • Random canaries
  • 這種 canaries 是隨機產生的。並且這樣的隨機數通常不能被攻擊者讀取。這種隨機數在程序初始化時產生,然後保存在一個未被隱射到虛擬地址空間的內存頁中。這樣當攻擊者試圖通過指針訪問保存隨機數的內存時就會引發 segment fault。但是由於這個隨機數的副本最終會作爲 canary word 被保存在函數棧中,攻擊者仍有可能通過函數棧獲得 canary word 的值。
  • Random XOR canaries
  • 這種 canaries 是由一個隨機數和函數棧中的所有控制信息、返回地址通過異或運算得到。這樣,函數棧中的 canaries 或者任何控制信息、返回地址被修改就都能被檢測到了。

目前主要的編譯器堆棧保護實現,如 Stack Guard,Stack-smashing Protection(SSP) 均把 Canaries 探測作爲主要的保護技術,但是 Canaries 的產生方式各有不同。下面以 GCC 爲例,簡要介紹堆棧保護技術在 GCC 中的應用。


當然,stack canaries 還是可以被攻破的,這個以後再述吧。


注:

在windows OS 裏面,類似的技術被稱爲 security cookies.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章