Ana Sayfa

Ruby Array Pack Zafiyeti: Bellek Sızıntısı Tehdidi

1 dk okuma

Ruby 4.0.0'ın piyasaya sürülmesiyle birlikte, Ruby MRI'daki tamsayı işleme hataları yeniden incelenirken, Array sınıfının pack örnek metodunda kritik bir güvenlik açığı keşfedildi. Bu zafiyet, tahsis edilen dize arabelleğinin dışından bellek okunmasına olanak tanıyan bir bellek sızıntısına yol açıyor. Güvenlik açığı, 2002'de yayınlanan Ruby 1.6.7'den Ruby 4.0.0'a kadar olan tüm sürümleri etkiliyor.

pack metodu, bir dizi elemanını ikili bir dizeye dönüştürmek için bir şablon dizesi argümanı kabul eder. Bu şablon dizesi, "H" (onaltılık dize) veya "m" (base64 kodlu dize) gibi yönergelerden oluşur. Yönergeleri, bir yönergenin ne kadar tüketmesi gerektiğini belirten bir tekrar sayısı takip edebilir (örneğin, "H2" iki onaltılık karakter tüketir). Zafiyetin temelinde, bu tekrar sayısının beklenmedik bir şekilde negatif hale getirilebilmesi yatıyor. ruby/pack.c içindeki kodda, tekrar sayısını alan len değişkeni signed long tipindeyken, bu değeri atayan STRTOUL makrosu unsigned long döndürüyor. Bu imzasız ve imzalı tip uyuşmazlığı, büyük imzasız değerlerin len değişkenine atandığında negatif olarak yorumlanmasına neden oluyor.

Negatif bir tekrar sayısı oluşturma yeteneğiyle, X yönergesi bu durumu istismar ediyor. X yönergesi, "bir bayt geri gitmek" için tasarlanmıştır. Negatif bir tekrar sayısı ile kullanıldığında, X yönergesi dize arabelleğinin dışına çıkarak bellek okumasına izin verir. Bellek sızıntısı zafiyetlerinin ciddi etkileri olsa da, bu metodun gerçek Ruby uygulamalarında nadiren kullanıldığı ve bir saldırganın metodun argümanları üzerinde kontrol sahibi olmasının çok daha nadir olduğu belirtiliyor. Bu zafiyet için PR #15763 üzerinden bir düzeltme süreci devam etmektedir.

İçgörü

Bu güvenlik açığı, Ruby'nin temel veri işleme mekanizmalarındaki tip uyuşmazlıklarının ciddi bellek sızıntılarına yol açabileceğini gösteriyor.

Kaynak