Bu Help Net Security röportajında, Açık Kaynak Güvenlik Vakfı (OpenSSF) Genel Müdürü Omkhar Arasaratnam, bellek açısından güvenli programlama dillerinin evrimini ve bunların C ve C++ gibi dillerin sınırlamalarına yanıt olarak ortaya çıkışını tartışıyor.
Elli yılı aşkın bir süredir devam eden bellek güvenliği endişeleri, programcıların bellek yönetimi görevlerinden soyutlanmasını içeriyor. Java, Rust, Python ve JavaScript gibi modern diller, bellek yönetimini programcı adına ele alarak bu endişeleri hafifletir ve böylece düşük seviyeli bellek yönetimiyle ilişkili riskler olmadan kod kalitesine odaklanılmasına olanak tanır.
Bellek açısından güvenli programlama dillerinin gelişimini tartışabilir misiniz? C ve C++ gibi dillerin bellek güvenliği açısından sınırlamalarına yanıt olarak nasıl ortaya çıktılar?
Hafıza güvenliğine ilişkin endişeler 50 yılı aşkın süredir devam ediyor. Bellek güvenliği, programcının güvenli bir şekilde gerçekleştirilmesi zor olan ayrıntılı bellek yönetimi işlevlerinden soyutlanmasını içerir.
Örneğin, C veya C++'da programcıların, yönetimi karmaşık olabilen belleği ayırması ve yeniden ayırması gerekir. Ne kadar bellek ayırdıklarını takip etmeli ve yalnızca uygun şekilde ayrılmış belleğin kullanıldığından emin olmalıdırlar. Bu belleğe artık ihtiyaç duyulmadığında, programcının onu güvenli bir şekilde imha etmesi gerekir. Java, Rust, Python ve JavaScript gibi diller, programcı adına bellek yönetiminin inceliklerini ele aldıkları için programcının “belleğin güvenli olmamasını” önler.
Yazılım geliştirmede, özellikle sistem programlama veya çekirdek geliştirme gibi yüksek riskli ortamlarda bellek açısından güvenli diller kullanmanın başlıca avantajları nelerdir?
Bir işletim sistemi çekirdeği, tüm sistem üzerinde tam yetkiye sahip olarak çalışır. Bu, güvenli olmayan bellek kullanımı gibi güvenlik sorunlarının tüm sistemin güvenliğine zarar verebileceği anlamına gelir.
Bir geliştiricinin C veya C++ gibi bellek açısından güvenli olmayan dilleri bellek güvenliği sorunlarına yol açmadan tam olarak kullanması mümkün olsa da tarih bize bunun aksini gösterdi. Microsoft, ürünlerindeki CVE'lerin %70'inin bellek güvenliği sorunlarından kaynaklandığını tahmin ediyor. Google benzer bir çalışma yürüttü ve Android CVE'lerinin %90'ının bellek güvenliğiyle ilişkilendirilebileceğini buldu.
Go, Python, Rust ve Java, bellek korumalı dillerin mükemmel örnekleridir. Ne yazık ki bu dillerin tümü çekirdek geliştirme için kullanılamaz. Rust, Linux çekirdeğinde desteklenen ikinci resmi dil olma yolunda ilerliyor. Bu tamamlandığında, Linux çekirdek geliştiricilerinin çekirdeğin hassas bölümlerini tamamen bellek açısından güvenli bir dilde yeniden yazmasına olanak tanıyacak.
Geliştiriciler ve kuruluşlar, özellikle eski sistemlerde, bellek açısından güvenli dillere geçiş yaparken ne gibi zorluklarla karşılaşıyor?
Bellek açısından güvenli dillere geçiş yaparken çeşitli konuların dikkate alınması gerekir:
1. Geliştiriciler — Yeni bir dile geçiş yaparken mevcut geliştiricilerinizi eğitmeniz veya bu dile aşina olanları bulmanız gerekir. Ayrıca hata ayıklamanızı değiştirmeniz ve bunu destekleyecek sistemler oluşturmanız da gerekebilir.
2. Donanım desteği — C ve C++ gibi eski diller çok çeşitli farklı platformlarda desteklenirken Rust gibi daha yeni dillerin desteği daha sınırlıdır. Donanım desteğinin olmaması bu yeni dile geçiş yapmanızı engelleyebilir.
3. Düzenleyici gereklilikler — Bazı güvenlik açısından kritik sistemler, güvence veya sertifika eksikliği nedeniyle yeni bir bellek güvenliği diline geçişi engelleyebilecek çok sıkı teknik veya güvenlik gereksinimlerine sahiptir.
4. Hatalar — Eski kodun yeni bir dile yeniden düzenlenmesi hatalara yol açabilir. Bazı durumlarda, usta programcılar yeni mantık hatalarından kaçınabilirken, yeni bir dilde yeniden yazılan eski kod, istemeden farklı davranabilir ve bu da üretimde beklenmeyen hatalara neden olabilir.
Pratik anlamda, C/C++ gibi dillerdeki mevcut kod tabanları, bellek açısından güvenli dillerin faydalarından yararlanmak için nasıl aşamalı olarak uyarlanabilir veya yeniden yazılabilir?
Rust'ta kodu yeniden yazmak önemli bir iştir. OpenSSF geçen yıl ONCD Bilgi Talebine yanıt verdiğinde bu zorluğu kabul ettik. Cevabın Rust'ta her şeyi yeniden yazmak olduğuna inanmıyoruz.
Topluluğun yeni projelere başlarken Rust'ta yazmayı düşünmesini teşvik ediyoruz. Ayrıca, genellikle kötüye kullanılan veya tehlikeye atılan alanlar veya “taç mücevherlerini” tutan alanlar gibi kritik kod yolları için de Rust'u öneriyoruz. Başlamak için harika yerler kimlik doğrulama, yetkilendirme, şifreleme ve bir ağdan veya kullanıcıdan girdi alan her şeydir.
Bellek güvenliğini benimsemek, güvenlikteki her şeyi bir gecede çözmeyecek olsa da, bu önemli bir ilk adımdır. Ancak en iyi programcılar bile doğası gereği hafıza açısından güvenli olmayan dilleri kullanırken hafıza güvenliği hataları yaparlar. Programcılar, bellek açısından güvenli diller kullanarak, düşük seviyeli bellek yönetimiyle tehlikeli bir şekilde uğraşmak yerine, daha yüksek kalitede kod üretmeye odaklanabilirler.
Ancak her şeyi bir gecede yeniden yazmanın imkansız olduğunu kabul etmeliyiz. OpenSSF, programcıların mevcut kod tabanlarını önemli ölçüde etkilemeden eski kodları daha güvenli hale getirmelerine yardımcı olmak için bir C/C++ Sağlamlaştırma Kılavuzu oluşturdu. Risk toleransınıza bağlı olarak bu, kısa vadede daha az riskli bir yoldur.
Yeniden yazma veya yeniden oluşturma işleminiz tamamlandıktan sonra dağıtımın dikkate alınması da önemlidir. Birçok kritik altyapı endüstriyel kontrol sistemine kurumsal ağ tarafından kolayca erişilemez, bu nedenle yeniden yazılan kodun yeniden dağıtılması, yeniden yazmanın kendisinden daha uzun sürebilir.
Bellek açısından güvenli programlama dillerinin geleceğine ilişkin bakış açınız nedir? Belirli sektörlerde standart haline gelmesini mi öngörüyorsunuz, yoksa geleneksel dillere her zaman yer olacak mı?
Belirli endüstriler veya sektörler göz önüne alındığında ilginç bir ikilik ortaya çıkar. Önemli sistemleri yeni bir dile geçirmek için acele etmek istemezsiniz ancak ironik bir şekilde, bu güvenlik özelliklerinden bazılarının en değerli olduğu yer burasıdır. Bellek açısından güvenli dillerin belirli sektörlerde standart hale gelip gelmeyeceğini bilmiyoruz ve bazı endüstriler, güvenlik veya güvenilirlik nedeniyle daha muhafazakar geçiş gereksinimlerine sahip olduğundan bunları benimsemek daha yavaş olacaktır. Sistem istikrarı ile değişim hızı arasında ters bir ilişki vardır.
Bellek açısından güvenli dillerde yeni projelere başlamanın genel amaçlı faydaları vardır. Örneğin Alpha-Omega, Prossimo'nun Rust'ta TLS ve QUIC'yi uygulamayı amaçlayan bir projesi olan Rustls'ın geliştirilmesini finanse etti. Bu protokolleri bellek açısından güvenli bir dilde uygulayarak OpenSSL Heartbleed güvenlik açığı gibi sorunları önleyebiliriz.
Hafıza açısından güvenli dillerin benimsenmesini teşvik etmede eğitim ve toplum desteğinin rolü ne kadar önemlidir? Geçiş yapmak isteyen geliştiricilere hangi girişimleri veya kaynakları önerirsiniz?
Eğitim, sahip olduğumuz en iyi siber güvenlik savunmasıdır. Birçok ilkokul, Python'u ilk programlama dili olarak öğretmeye başladı. Gelecekte Rust gibi hafıza açısından güvenli diğer dillerin de erken yaşta tanıtıldığını görmeyi umuyoruz.
Ek olarak Rust Vakfı, Rust'a genel bir bakış sağlayan saygın bir kitap olan “Rust Programlama Dili” de dahil olmak üzere bir dizi araç ve materyal sağlar. Aynı zamanda bir eğitim ve sertifikasyon programı da geliştiriyor.
Devamını oku:
Beyaz Saray: Ülkeyi korumak için hafıza korumalı programlama dilleri kullanın