JavaScript kütüphanelerinde meydana gelen çeşitli hatalardan dolayı ortaya çıkan Prototype Pollution zafiyeti web uygulamalarını güvensiz hale getirmektedir.
Prototype Pullution Nedir?
Prototip tabanlı bir programlama dili olan JavaScript’te yeni bir nesne oluşturulduğunda; oluşturulan bu yeni nesne toString, cunstructor ve hasOwnProperty gibi işlevleri içeren bir prototip nesnenin özelliklerini ve yöntemlerini taşır.
Obje tabanlı kalıtım programcıların işini kolaylaştırırken güvenlik açıklıklarına da davetiye çıkarmaktadır. Kötü niyetli kişiler bir objenin özelliklerini değiştirerek tüm web uygulaması genelinde değişikliklere neden olabilmektedir.
Saldırganın doğrudan nesneyi değiştirmesi de gerekmemektedir. Nesnenin “__proto__” özelliği vasıtasıyla ona erişim sağlanabilir. İlgili nesnede bir değişiklik meydana geldiğinde ise yapılan değişiklik tüm JavaScript nesnelerine uygulanır.
Prototip Pollution Zafiyeti Neden Kaynaklanır ve Nasıl Sömürülür?
Prototip kirliliği, Lo-Dash ve JQuery kütüphanelerinde meydana gelen hatalardan kaynaklanmaktadır. Zafiyetin ortaya çıkmasının önüne geçebilmek için Lo-Dash ve JQuery’nin güncel olduğundan emin olunması gerekmektedir.
Detaylı incelenecek olursa, zafiyetin asıl sebebi güvensiz merge, clone, extend ve path assignment operasyonlarının kullanılmasıdır. Örneğin “merge” operasyonuna ilişkin güvensiz bir kullanım şu şekildedir:
- var merge = function(hedef, kaynak) {
- for(var attr in kaynak) {
- if(typeof(hedef[attr] === ‘object’ && typeofkaynak[attr] === ‘object’){
- merge(hedef[attr], kaynak[attr]);
- } else{
- hedef[attr] = kaynak[attr];
- }
- }
- return hedef;
- };
Yukarıdaki gibi bir merge fonksiyonunun kirletilmesi için saldırganın tek yapması gereken şey aşağıdaki gibi bir JSON verisi oluşturmaktır.
- {
- “foo”:”bar”,
- “__proto__”: {
- “polluted”: “true”
- }
- }
Daha sonrasında oluşturulan bu JSON verisi merge fonksiyonu kullanılarak herhangi bir JavaScript nesnesine enjekte edilmektedir.
Prototype Pollution Zafiyetinin Sisteme Etkisi Nedir?
Prototype Pollution açığı, tek bir nesneyi etkilemekle kalmayıp uygulamadaki tüm nesneleri etkilemektedir. Dolayısıyla açıktan dolayı ortaya çıkacak bir sorun tüm web uygulamasını etkisi altına alır. Ancak zafiyetin tam etkisi, web uygulamasına göre değişmektedir. Uygulamanın arkasında yatan mantıksal yapıya göre Prototype Pollution zafiyeti; uzaktan kod çalıştırma (RCE), siteler arası script çalıştırma (XSS) ve SQL enjeksiyonu gibi güvenlik açıklıklarının oluşmasına neden olabilmektedir. Çoğunlukla ise XSS zafiyetini tetiklemektedir.
Prototype Pollution Zafiyeti Nasıl Giderilir?
Güvenlik açığının kapatılması için yapılması gereken açığın meydana geldiği lokasyona göre değişkenlik göstermektedir. Eğer açıklık bir kütüphaneden dolayı meydana geliyorsa, ilgili kütüphane son sürüme güncellenmelidir.
Açığın ortaya çıkmasına sebep olan yukarıda bahsedildiği gibi bir fonksiyon ise bu durumda da ilgili fonksiyona attribute’un “__proto__” olup olmadığını kontrol eden bir koşul eklenmelidir. Yukarıda verilen Prototype Pollution zafiyeti içeren kodun güvenlik açıklığının giderilmiş hali aşağıdaki gibidir.
- var merge = function(hedef, kaynak) {
- for(var attr in kaynak) {
- if(attr === “__proto__”) continue;
- if(typeof(hedef[attr] === ‘object’ && typeofkaynak[attr] === ‘object’){
- merge(hedef[attr], kaynak[attr]);
- } else{
- hedef[attr] = kaynak[attr];
- }
- }
- return hedef;
- };