Code-Pointer Integrity¶
Tüm code pointer'ları (ve onlara ulaşabilecek pointer'ları) korunan bir safe region'a izole ederek control-flow hijacking'e karşı garantili bir savunma sağlar; SafeStack onun ürünleşmiş bileşenidir.
Mechanism¶
Note
CPI (Kuznetsov et al., OSDI 2014), tüm sensitive pointer'ların integrity'sini garanti eder: her code pointer (function pointer'lar, return address'ler, vtable pointer'ları) artı bir code pointer'a transitive biçimde ulaşabilecek her data pointer; bunlar static, type tabanlı bir over-approximation ile hesaplanır. Bunlar, sıradan ve saldırgan tarafından kontrol edilebilen bellek operasyonlarının ulaşamayacağı izole bir safe region'a taşınır — böylece normal bellekteki bir buffer'ı bozmak, korunan bir pointer'ı asla ezemez. Garanti yapısal olarak sağlanır (pointer'lar basitçe ulaşılamaz hâldedir), bu da CFI'den daha güçlüdür: CFI yalnızca bozulmuş bir pointer'ın kontrolü nereye gönderebileceğini kısıtlar, oysa CPI bozulmanın kendisini engeller.
CPS (Code-Pointer Separation), gevşetilmiş, daha düşük overhead'li varyanttır — tam transitive closure'ı değil, yalnızca doğrudan code pointer'ları korur. SafeStack, stack'i bir safe stack (return address'ler, spill'ler, güvenli erişilen local'lar) ve bir unsafe stack (buffer'lar) olarak ayırır; böylece stack overflow'ları return address'lere ulaşamaz.
Walkthrough¶
SafeStack upstream'lenmiş bileşendir; compile ve link zamanında etkinleştir:
Return address'ler, register spill'leri ve güvenli erişilen local'lar safe stack'e gider;
array'ler ve address'i alınmış local'lar unsafe stack'e gider, böylece unsafe stack'teki bir
overflow return address'leri bozamaz. Runtime API'si
__safestack_get_unsafe_stack_ptr() (<sanitizer/safestack_interface.h>), o anki unsafe stack
pointer'ını döndürür.
safe region, x86-32'de hardware segmentation (özel bir segment register) ile, kullanılabilir segmentation'dan yoksun olan x86-64'te ise information hiding + randomization ile izole edilir.
Reported overhead
SafeStack: ortalama < %0.1 (bazen cache locality'den dolayı bir hızlanma). Tam CPI: tek haneli düşük %. CPS: SPEC sınıfı benchmark'larda daha da düşük.
Mitigation¶
x86-64'te safe region yalnızca information hiding ile korunur, hardware enforcement ile değil. Evans et al., "Missing the Point(er)" (IEEE S&P 2015), bir information-disclosure primitive ile birleştirilen bir data-pointer overwrite'ının gizli region'ı de-randomize edip ardından değiştirebileceğini gösterir — segmentation'ı olmayan mimarilerde CPI'yi yenmek. Ayrıca bkz. ASLR info-leak bypass'ları ve hardware ile dayatılan pointer integrity için CHERI capabilities.