CHERI capabilities¶
Spatial ve heap-temporal memory safety'yi ISA seviyesinde dayatan, taklit edilemez (unforgeable) 128-bit hardware capability'leri (bounds + permission'lar + tag).
Mechanism¶
Note
Bir CHERI capability'si, 128-bit'lik bir in-memory value artı out-of-band tutulan 1-bit'lik bir validity tag'tir (129-bit'lik mimari bir value). 128 bit; base/bounds'u, permission'ları (load, store, instruction-fetch, capability load/store) ve bir object type'ı (otype) sıkıştırılmış bir bounds encoding'i ile encode eder. Capability'ler taklit edilemez (unforgeable): yalnızca özel capability instruction'ları tag-valid bir capability üretebilir ve bir capability'yi tutan belleğe yapılan herhangi sıradan bir write, tag'i otomatik olarak 0'a temizleyerek onu geçersiz kılar. Capability'ler monotonic'tir — yazılım, daha kısıtlı bir pointer türetmek için bounds'u daraltabilir ya da permission düşürebilir, ama asla bounds'u genişletemez veya permission ekleyemez (guarded manipulation / provenance).
CHERI C/C++'ta sıradan pointer'lar capability'lere derlenir, dolayısıyla her dereference hardware tarafından bounds-check edilir; bu da spatial safety (out-of-bounds erişim trap eder) ve OS desteğiyle heap temporal safety (free edilmiş allocation'lar revoke edilir, böylece dangling pointer'lar fault verir) sağlar. return/code pointer'larının kendileri de bounded capability'ler olduğundan, buffer-overflow tabanlı ROP/JOP yapısal olarak engellenir.
Walkthrough¶
Capability formatı ve temel instruction'lar (CHERI ISA adlandırması):
CSetBounds— bir capability'nin bounds'unu daraltır (hermallocdönüşünde ve sub-object'te kullanılır).CAndPerm— permission düşürür.- capability load/store ve capability-relative branch'ler; out-of-bounds ya da untagged bir dereference bir capability fault doğurur.
- Özel capability'ler: PCC (program-counter capability, executable kodu bound'lar) ve DDC (default data capability, hybrid mode'da legacy integer-pointer erişimlerini aracılar).
Mode'lar:
- pure-capability — tüm pointer'lar capability'dir.
- hybrid — annotate edilmiş pointer'lar legacy integer pointer'ların yanında capability'dir (DDC ile gate'lenir).
Buffer overflow behaviour
Bir malloc'lanmış buffer'ın sonunun ötesine yazmak — ki bu buffer'ın dönen capability'sinin
bounds'u CSetBounds ile allocation'a ayarlanmıştır — komşu belleği ya da bir return address'i
sessizce bozmak yerine, suçlu store anında bir hardware bounds-check hatasını (capability
exception) tetikler.
Hardware/software: Arm'ın Morello board'u, UK Digital Security by Design programı kapsamında CHERI'yi bir ARMv8-A core üzerinde (Neoverse-N1 sınıfı, Ocak 2022'de erişilebilir) gerçekler. CheriBSD, spatial olarak memory-safe bir kernel ve userspace ile gelir; heap temporal safety v23.11'den beri varsayılan olarak etkindir.
Mitigation¶
Kalan boşluklar ("bypass" yüzeyi): CheriBSD/Morello'da stack temporal safety implemente edilmemiştir ve kernel temporal safety yoktur; temporal safety yalnızca heap'e özgüdür ve revocation'a bağımlıdır. Sub-object overflow'ları açık bir opt-in sub-object bounds gerektirir. CHERI; logic bug'ları, data-only saldırıları ya da bounds içindeki type confusion'ı durdurmaz. ARM Memory Tagging Extension içindeki hardware tagging ile karşılaştır.