ABD’de National Security Agency ‘in 2022 Kasım ayında bellek güvenliği konusunda yaptığı tavsiye niteliğindeki açıklama, bir devlet kurumu tarafından programlama disiplinine dair yapılan nadir fikir belirtme ve müdahalelerden biri. C ve C++ gibi bellek güvenliğinin programcının inisiyatifine bırakıldığı dillerin yerine Rust, Ruby™, Java, Go gibi dillerin kullanılmasının önerildiği açıklamada; NSA Siber Güvenlik Teknik Müdürü Neal Ziring, bellek güvenliği sağlanmış diller kullanılmasının güvenli yazılım geliştirmenin bir zorunluluğu olduğunu belirtiyor. Peki bir devlet kurumunun bu derece dikkatini çeken “bellek güvenliği” ya da “memory safety” problemi nedir?
Programlamada Bellek Yönetimi
C ve C++, bellek güvenliğinden program hızı lehine feragat etmiş programlama dillerinin başında gelirler. “Garbage Collection” ya da “Reference Counting” gibi yaklaşımlarla hız kaybının göze alınarak bellek yönetiminin programcıdan soyutlandığı dillerin (Örn: Java, C#, Python) aksine, bu dilleri kullanan programcı, program sonlanana kadar bellekte yaşayan objelerin takibini yapmak, objelerin kendisine ayrılan adres bloğundan taşmayacağını garanti etmek ve gerektiğinde objelerin yaşamını sonlandırarak programa tahsis edilen ilgili RAM bloğunu işletim sistemine iade etmek zorundadır. Bu yükümlülüklerin tam olarak yerine getirilmemesi halinde ortaya çıkan problemler iyi senaryoda programın performans kaybı yaşaması ve kötü senaryoda programın üzerinde çalıştığı sistemi tehlikeye sokacak kadar ciddi bir güvenlik açığına sahip olmasıdır. Microsoft tarafından paylaşılan istatistiklere göre Microsoft ürünlerinin tamamında her yıl tespit edilen güvenlik zaaflarının ortalama %70’i bellek güvenliği sağlanamaması nedeniyle meydana geldi.
Bu aynı zamanda bellek
güvenliğinin programcı
inisiyatifine bırakılmadığı
yani “memory-safe” dillerin
kullanılmış olması halinde
tüm tespit edilen güvenlik
zaaflarının %70’inin baştan
var olamayacağı anlamına
da geliyor.
Bellek Yönetiminde Yeni Yaklaşımlar
Yakın zamana kadar C ve C++’ın güvenli programlama zorluğuna karşılık vadettiği performans getirisi hız gereksinimleri yüksek projeler için bu dillerin kullanımını zorunlu kılıyordu. Ancak daha sonra yaygınlaşan alternatif bellek yönetim teknikleri bu durumu bir tercih haline getiriyor. Örneğin “Ownership” yaklaşımını benimseyen Rust programlama dili, bellek güvenliğini derleme zamanında garanti ederek çalışma zamanında programın hız kaybına uğramamasını sağlıyor ve de bellek güvenliği problemlerini tamamen elimine ediyor. Benzer gelişmelerin üretim ortamlarında yeterince yaygınlaşmasıyla hafıza güvenliğini hız için feda etmek, artık bir tercih denilebilir. Bu savı desteklemek için ise; Google’ın, Android 13’ün kaynak kodunun %20’sinin Rust programlama dilinin oluşturduğunu açıklaması ve beraberinde paylaşılan, Android’de keşfedilen güvenlik zafiyetlerinin Rust dilinin Android kaynak koduna dahil olmasıyla yıllara
göre düşüş trendi içerisine girdiği istatistik:
https://security.googleblog.com/2022/12/memory-safe-languages-in-android-13.html
Safety measures make memory-unsafe languages slow
Mobile devices have limited resources and we’re always trying to make better use of them to provide users with a better experience (for example, by optimizing performance, improving battery life, and reducing lag). Using memory unsafe code often means that we have to make tradeoffs between security and performance, such as adding additional sandboxing, sanitizers, runtime mitigations, and hardware protections. Unfortunately, these all negatively impact code size, memory, and performance.
Microsoft’un, Nisan 2023’de Windows NT kernel’ında bazı kütüphanelerin Rust ile tekrar yazılmaya başlandığını duyurması:
https://www.theregister.com/2023/04/27/microsoft_windows_rust/
Microsoft Azure CTO’su Mark Russinovich ‘in Eylül 2022’de yaptığı, “yeni projeler C++ yerine Rust tercih etmeli” açıklaması:
https://www.theregister.com/2022/09/20/rust_microsoft_c/
ispat olarak verilebilir.
Endüstrinin “memory-unsafe” dillerden uzaklaşma trendine girmesiyle bahsi geçen dillerde bellek yönetimini kolaylaştırmak adına radikal adımlar da atılıyor. C++ örneğinde, ISO C++ Komitesi üyesi Herb Sutter’ın, “Güvenli C++” sloganıyla başlattığı “cppfront” kişisel projesi: Cpp2, cppfront – Sutter’s Mill
(Herb Sutter’ın projeye dair CppCon konferansında yaptığı “C++ 10 kat daha güvenli ve basit olabilir mi?” başlıklı konuşmasına buradan ulaşabilirsiniz.)
yine C++ geliştirici topluluğu tarafından Smart Pointer, RAII gibi alternatif bellek yönetim implementasyonlarının sıklıkla tavsiye edilmesi gibi örnekler görülebilir.
Her ne kadar “memory-unsafe” dillerin terk edilmesini yakın zamanda beklemesek de bu dillerin geleceklerinin parlak olduğu da söylenemez.