Skip to content

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:

clang -fsanitize=safe-stack -o app app.c

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.

References