Ana Sayfa

Linux'ta /proc/self/mem: Yazılamaz Belleğe Yazma Sırrı

1 dk okuma

Linux çekirdeğinin ilginç ve çoğu zaman gözden kaçan bir özelliği, /proc/*/mem psödo-dosyasının "punch through" semantiğidir. Bu özellik, normalde yazılabilir olmayan sanal bellek bölgelerine bile doğrudan yazma işlemi yapılabilmesine olanak tanır. Bu davranış, bir hata veya güvenlik açığı olmaktan ziyade, Julia JIT derleyicisi ve rr hata ayıklayıcısı gibi projeler tarafından aktif olarak kullanılan kasıtlı bir tasarımdır. Bu durum, ayrıcalıklı kodun sanal bellek izinlerine ne ölçüde tabi olduğu ve donanımın çekirdek bellek erişimini ne kadar kısıtlayabileceği gibi temel soruları gündeme getirir. Makale, bir işletim sistemi ile çalıştığı donanım arasındaki karmaşık ilişkiyi ve çekirdeğin bu kısıtlamaları nasıl aşabildiğini inceler.

Yazar, bu "punch through" semantiğini göstermek için bir C++ kodu örneği sunar. Bu örnekte, program önce kendisi tarafından eşlenen salt okunur bir bellek sayfasına (PROT_READ) /proc/self/mem aracılığıyla veri yazar. Ardından, daha da dikkat çekici bir şekilde, libc kütüphanesindeki getchar fonksiyonunun yürütülebilir koduna 0xcc (x86-64 yazılım kesme noktası talimatı) baytı yazar. Programın çıktısı, her iki yazma işleminin de başarılı olduğunu kanıtlar: salt okunur sayfa değiştirilir ve değiştirilen getchar fonksiyonu çağrıldığında bir SIGTRAP sinyali alınır. Bu deney, /proc/self/mem'in sadece veri bölgelerini değil, aynı zamanda sistem kütüphanelerinin yürütülebilir kodunu bile değiştirebildiğini göstererek, Linux çekirdeğinin bellek erişimi üzerinde ne kadar güçlü bir kontrol sağlayabildiğini ortaya koyar.

İçgörü

Linux'taki `/proc/self/mem` psödo-dosyası, standart bellek izinlerini aşarak salt okunur veya yürütülebilir bellek bölgelerine doğrudan yazma yeteneği sunarak sistem programlama ve hata ayıklama için güçlü bir araç sağlar.

Kaynak