Eski GCC sürümlerinde yürütülebilir yığın olmadan iç içe fonksiyon çağırma yöntemi geliştirildi
Öne çıkanlar
- Eski GCC sürümlerinde iç içe fonksiyonlar yığın üzerinde çalıştırılabilir tramplen kodu üretiyor.
- Yeni yöntem tramplen kodunu çalıştırmadan içindeki adres ve çerçeve verilerini doğrudan okuyor.
- Yığın kodu yürütülmediği için ikili dosyalardaki çalıştırılabilir yığın bayrağı patchelf ile kaldırılabiliyor.
Yazılımcı Martin Uecker, GCC'nin eski sürümlerinde iç içe fonksiyonların (nested functions) çağrılması sırasında ortaya çıkan yürütülebilir yığın (executable stack) güvenlik riskini aşmaya yönelik yeni bir yöntem yayımladı. GCC 17 ve Clang sürümlerindeki yeni yerleşik fonksiyonların aksine eski derleyiciler, iç içe fonksiyon adresleri için yığında doğrudan çalıştırılan tramplen (trampoline) kod blokları oluşturuyor.
Uecker'ın geliştirdiği yöntemde, yığına yazılan tramplen kod bloğu doğrudan çalıştırılmıyor; bunun yerine tramplen içindeki kod adresi ve statik çerçeve işaretçileri bayt seviyesinde okunuyor. Elde edilen değerler __builtin_call_with_static_chain yerleşik fonksiyonu aracılığıyla doğrudan hedef fonksiyona aktarılıyor. Kod bloğu hiçbir zaman yürütülmediği için ikili dosya patchelf aracıyla yürütülemez yığın bayrağına güvenle dönüştürülebiliyor.
Bu yaklaşım, Uecker'ın deneysel açık kaynak kütüphanesi noplate üzerinde hayata geçirildi. Geliştirici ayrıca tramplen kodunu çağırma noktasında yorumlayan hafif bir yapı kullanarak fonksiyon tanımlayıcısı gibi değerlendirme fikrinin de uygulanabileceğini belirtti.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.