Remote Code Evaluation Zafiyeti

Sven Morgenroth - 24 Nisan 2017 -

Bu yazıda, Remote Code Evaluation zafiyetinin ne olduğu, saldırganların bu zafiyeti nasıl suistimal ettiği ve saldırılara karşı hangi tedbirlerin alınması gerektiği anlatılmaktadır.

Remote Code Evaluation Zafiyeti

Remote Code Evaluation Nedir?

Remote Code Evaluation (RCE), kullanıcı girdisinin bir string ya da bir dosyaya enjekte edilmesi ve bu girdinin kullanılan programlama diline ait parser (ayrıştırıcı) tarafından uygulanmasıyla ortaya çıkan bir açık türüdür. Bu durum, genelde, web geliştiricilerinin beklediği bir şey değildir. Bir Remote Code Evaluation zafiyeti suistimale açık web uygulaması ya da web sunucusunun tümü üzerinde bir risk meydana getirebilir. RCE ile ilgili önemli bir nokta şu ki neredeyse tüm programlama dillerinde açığın temelini oluşturan söz konusu evaluation (değerleme) fonksiyonları mevcuttur.

RCE’yi Bir Örnekle Açıklayalım

Kullanıcı girdilerinin, kodun evaluate edilmesini sağlayan fonksiyonlara enjekte edilmesine izin verdiğiniz takdirde bir code evaluation (kod değerleme) meydana gelebilir. Kasti olarak, örneğin, bir hesap makinesi programı yazmak amacıyla matematik fonksiyonlarına erişirken; veya tesadüfen bu olay meydana gelebilir. Tesadüfi denmesinin sebebi şu ki kullanıcı tarafından kontrol edilen bir girdinin söz konusu fonksiyonlara enjekte edilmesi geliştiricilerin istediği bir şey değildir. Zaten, genelde, böyle bir uygulamaya başvurulması önerilmez. Çünkü bu tarz bir uygulama, code evaluation’ın kullanımı açısından kötü bir pratik olacaktır.

Code Evaluation İstismarına Bir Örnek

Her kullanıcı için dinamik olarak değişken isimlerinin oluşturulmasını isteyebilir ve kullanıcılara ait kayıt tarihlerini depoluyor olabilirsiniz. PHP’de bunu aşağıdaki kodla yapmak mümkün:

eval("\$$user = '$regdate');

Kullanıcı adı, genel olarak kullanıcılar tarafından kontrol edilen bir girdi olduğundan, saldırgan aşağıdaki gibi yeni bir isim üretebilir:

x = 'y';phpinfo();//

Sonuç olarak PHP kodu şu hali alır:

$x = 'y';phpinfo();// = '2016';

Görüldüğü üzere değişken x olarak çağırıldı ve y değerini aldı. Saldırgan bu değeri değişkene atayabildikten sonra noktalı virgül (;) kullanarak yeni bir komut başlatabilir hale geldi. Böylelikle string’in geri kalanını derleme dışında bırakabilir ve bunun sonucunda herhangi bir söz dizimi hatası da almaz. Kodu çalıştırdığındaysa sayfada phpinfo çıktısı gösterilir. Bunun sadece PHP’de değil girdiyi evaluate eden fonksiyonların bulunduğu tüm dillerde meydana gelebileceğini unutmamak gerekir.

Stored RCE’yi Bir Örnekle Açıklayalım

Bu metot, yukarıdaki örnekten farklı olarak spesifik bir fonksiyona dayanmamaktadır. Dil yorumlayıcısı tarafından parse edilen belli dosyalar üzerinde meydana gelmektedir. Bir web uygulamasına eklenen konfigürasyon dosyası buna örnek olabilir. İstenmeyen bir durumun meydana gelmemesi için yorumlayıcı tarafından yürütülen dosyalarda kullanıcı girdilerini kullanmaktan kaçınmak gerekir. Bu istismar tekniği çoğu kez, dosya türü ve uzantısı üzerinde gerekli kontrolleri yapmayan bir upload (yükleme) fonksiyonu ile beraber görünür.

Stored Code Evaluation İstismarına Bir Örnek

Her kullanıcı için bir kontrol paneli sunan bir web uygulaması geliştirdiğinizi varsayalım. Kontrol paneli, bir parametreye bağlı olarak belirlenen ve sonrasında bir konfigürasyon dosyasında saklanan bazı kullanıcı ayarlarına (dil değişkeni gibi) sahip. Beklenen girdi şöyle olurdu:

?language=de

Yukarıdaki girdi daha sonra konfigürasyon dosyasına $lan = ‘de’; şeklinde yansıtılır. Bir saldırgan dil parametresini şu şekilde değiştirirse:

de';phpinfo()//

Yukarıdaki kod dosyada şu hali alır:

$lan = 'de';phpinfo()//';

Son olarak konfigürasyon dosyası web uygulamasına eklendiğinde yukarıdaki kod yürütülecektir. Bu da saldırganlara istedikleri komutu çalıştırma imkanı sunar.

RCE Zafiyetinin Etkileri

Bir flaw’ı çalıştırabilen saldırgan bunu genellikle sunucunun ya da programlama dilinin getirdiği ayrıcalıklarla yapabilmektedir. Dillerin çoğunda sistem komutu verilebilir, dosyalarda ya da bağlantılı veritabanlarında yazma, okuma ve silme işlemleri gerçekleştirilebilir.

RCE’yi Engellemenin Yolları

Genel bir tavsiye vermek gerekirse evaluate edilmiş kodun içinde kullanıcı girdilerini kullanmaktan kaçınmak iyi bir tercih olabilir. En iyi seçenek eval gibi fonksiyonları hiçbir zaman kullanmamak olurdu. Ayrıca ilgili dil tarafından ayrıştırılabilen dosya içeriklerinin kullanıcılar tarafından düzenlenmesine engel olmak gerekir. Buna kullanıcıların, web uygulamasında yükleyebileceği ya da oluşturabileceği dosyaların uzantılarına ve isimlerine karar verememeleri de dahildir.

RCE’yi Engellemek için Neler Yapmamalısınız

  • Kullanıcı girdisini sanitize etmek… Kısıtlamalar için yapılan bypass işlemleri ihtimalinden dolayı çoğu zaman mümkün olmamaktadır.
  • Sunucudaki dosyaların içeriğini ya da uzantısını değiştirme kararını ve güvenli dosya yükleme yolları için tercihi kullanıcılara bırakmak.
  • Herhangi bir kullanıcı kontrollü girdiyi callback veya evaluation fonksiyonlarına göndermek.
  • Özel karakterleri ya da fonksiyon isimlerini blacklist’e almak… Bu yöntemle güvenli bir implementasyonu sağlamak neredeyse imkansızdır.