Linux çekirdeğinde boş referansların kullanılması
Geçtiğimiz günlerde Google Project Zero ekibinden araştırmacıların, NULL işaretçisinin referanssızlaştırılmasından kaynaklanan Linux çekirdeğindeki güvenlik açıklarından yararlanmanın bir yöntemini geliştirdikleri duyuruldu .
Şimdiye kadar, NULL işaretçi referanssızlaştırmasıyla ilgili çekirdek sorunlarına gereken önem verilmemişti , çünkü bu tür sorunların ayrıcalık yükseltmeye veya kişinin kendi kodunu yürütmesine yol açan saldırılara dönüştürülmesinin gerçekçi olmadığı düşünülüyordu (ayrıcalıksız işlemleri adres alanının alt bölgesine eşlemek yasaktır).
Genel kural olarak, bu tür hatalar çekirdek tarafından "oops" uyarılarının oluşturulmasına yol açar ; ardından sorunlu görevler tamamlanır ve sistemin durdurulmasına gerek kalmadan durum eski haline getirilir.
Yeni saldırı yöntemi , referans sayacının (refcount) değerinde artışa yol açabilen ve bu da sayacın taşmasına ve refcount ile ilişkili belleğin serbest bırakılmasına neden olabilen "oops" durumlarının ele alınmasına dayanmaktadır .
Bu durumda, istismar, serbest bırakıldıktan sonra kullan saldırılarına özgü manipülasyonlara indirgenir (nesnenin referans sayısının sıfır olduğu, hafızanın serbest bırakıldığı, ancak aslında serbest bırakılan hafızaya işaret eden çalışan bağlantılar olduğu bir durum ortaya çıkar).
Şu anda, Linux çekirdeği bir işlem bağlamından null referans hatası tetiklediğinde, çekirdek panikinden farklı bir hata ( oops) oluşturur. Panik, çekirdeğin yürütmeye devam etmenin güvenli bir yolu olmadığını ve bu nedenle tüm yürütmeyi durdurması gerektiğini belirlediğinde meydana gelir. Ancak, çekirdek bir hata (oops) sırasında tüm yürütmeyi durdurmaz ; bunun yerine, elinden geldiğince toparlanmaya çalışır ve yürütmeye devam eder.
Bir NULL işaretçisinin başvurusunun kaldırılması, burada "oops" durumunu kontrollü bir şekilde oluşturmanın bir yolu olarak kullanılır. Sorun şu ki, 232 bitlik bir yeniden sayım taşmasına ulaşmak için yaklaşık 32 "ayy" durum çağrısı gerekiyor.
Pratik açıdan bakıldığında, önerilen güvenlik açığı kullanılarak bir saldırı gerçekleştirmek için yaklaşık sekiz gün boyunca sürekli olarak yanlış yerde (OOP) durumlar üretilmesi gerekmektedir . Başarılı olması durumunda, bu güvenlik açığı kodunuzu çekirdek düzeyinde çalıştırmanıza olanak tanır.
İstismarda kullanılan NULL işaretçi başvurusu Ekim ayında düzeltildi, ancak benzer sorunlar nadir olmadığından ve daha önce güvenlik açıkları olarak değil hata olarak ele alındığından, geliştiriciler "oops" oluşumunu manipüle eden saldırıları önlemek için Linux çekirdeğine genel koruma ekleyecekler. ."
Bir görev söz konusu olduğunda, bu, mevcut çekirdek yığınının atılması ve doğrudan do_exit'i çağıran make_task_dead'e gidilmesi anlamına gelir. Çekirdek ayrıca dmesg'e bir "çökme" günlüğü ve hata oluştuğunda çekirdeğin hangi durumda olduğunu gösteren bir çekirdek izi gönderir. Bellek bozulması açıkça meydana geldiğinde bu garip bir seçim gibi görünebilir; bununla birlikte amaç, çalışan bir sistemde hata ayıklamanın arızalı bir sistemden çok daha kolay olduğu felsefesiyle çekirdek hatalarının tespit edilmesini ve günlüğe kaydedilmesini kolaylaştırmaktır.
Özellikle , Kernel 6.2, maksimum "oops" sayısını sınırlamak için değişiklikler içerir . Varsayılan olarak 10 oops olarak belirlenen sınıra ulaşıldıktan sonra (istenirse oops_limit parametresi kullanılarak değiştirilebilir), çekirdek bir "panik" durumuna geçiş başlatacak ve ardından yeniden başlatma işlemi gerçekleştirecektir; bu da referans sayacını sıfırlamak için gereken yineleme sayısına izin vermeyecektir.
Kısıtlamanın daha önce yayınlanmış ancak halen desteklenen çekirdek dallarına ve popüler dağıtımların çekirdek paketlerine de aktarılması planlanıyor.
Son olarak, bu konu hakkında daha fazla bilgi edinmek isterseniz , ayrıntıları aşağıdaki bağlantıda bulabilirsiniz.