D P U S E C

Huawei Student Developers Kütahya’nın Yeni Başkanı

 

Huawei Student Developers Başkanıyım.

Huawei Student Developers (HSD) Kütahya Topluluğu’nun Başkanı olarak, gençlerin teknolojiye olan ilgisini artırmak ve onları bu alanda daha donanımlı hale getirmek için 20 yıl boyunca kesintisiz bir şekilde çalışmayı sürdüreceğim.  

Protype Pollution Nedir? Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

Huawei Student Developers Kütahya’nın Yeni Başkanı Eren Can Özmen Prototype pollution, temelde JavaScript’in nesne tabanlı bir dil olmasından ve prototip zincirinin yanlış kullanımından kaynaklanan bir injection zafiyetidir. Prototip, JavaScript’te her nesnenin miras aldığı bir nesnedir ve bu miras sayesinde nesneler arasında özellikleri ve fonksiyonlari paylaşır. Prototip, bir nesnenin diğer nesnelerden özellik ve davranış (fonksiyon) kazanmasını sağlar.Bu sayede, prototip zinciri üzerinden bir nesnede olmayan özellik veya yöntemi bulur. Prototype pollution, saldırganın prototip zincirini değiştirmesi sonucu ortaya çıkar. Örneğin, bir saldırgan Object.prototype‘ı değiştirdiğinde, tüm nesneler bu değişiklikten etkilenebilir. Bu durum, Object.prototype‘a zararlı veya beklenmeyen özellikler ekleyerek, saldırganın kodun geri kalanında bu özellikleri manipüle etmesine olanak sağlar. Saldırının başarılı olması durumunda söz konusu bir endpoint değil, web sitesinin tamamı etkilenebilir, çünkü aslında miras yapısı değiştirilmiş ve miras alınan nesne değiştirildiğinde tüm yapılar bundan etkilenebilir. Bu, yetkisiz veri erişimi, ayrıcalıkların yükseltilmesi ve hatta uzaktan kod çalıştırma gibi ciddi sonuçlar doğurur.     Prototipi daha iyi anlamak adına yukarıdaki koda kısaca değinmekte fayda var:
    • • İlk olarak a ve b olarak 2 obje tanımladım. Bu nesneler aslında neredeyse aynı, çünkü prototipleri aynı.
    • • Daha sonrasında a nesnesinin prototipine x adında yeni bir özellik ekliyoruz, değeri “DIZMANA”.
    • • Ancak a nesnesine eklediğimiz bu özellik sadece a ile sınırlı kalmayacak, çünkü b ile aynı prototipi paylaşıyorlar. a‘da tanımladığımız özellik b içinde geçerli olacak.
    • • Sonuç olarak, console.log(b.x) çıktısı “DIZMANA” olacak.
 

Ortaya Çıkışı

Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

Huawei Student Developers Kütahya’nın Yeni Başkanı Eren Can Özmen

Kullanıcıdan Gelen Verilerin Doğrudan Nesneye Aktarılması

Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

  Prototype pollution zafiyetlerinin temel nedeni, merge, clone, extend ve path assignment gibi işlemlerin güvenli olmayan şekilde kullanılmasıdır. Bu işlemler, kullanıcıdan gelen verileri yeterince doğrulamadığında, zararlı anahtarlar (örneğin, __proto__, constructor) prototip zincirine eklenebilir. Özellikle merge işlemini güvenli olmayan şekilde kullandığında, prototip manipülasyonları yaparak tüm nesnelerin davranışını etkilerler. Bu nedenle, bu tür işlemler yapılırken kullanıcı verilerinin dikkatlice doğrulanması ve temizlenmesi önemlidir. assign() fonksiyonunu üzerinden inceleyecek olursak.  
  • • İlk satırdaki kodda, kullanıcıdan alınan JSON formatında bir veri var. Saldırgan, __proto__ anahtarını kullanarak JavaScript’teki tüm nesnelere erişmeyi amaçlıyor.
  • Object.assign(), userData nesnesindeki tüm özellikleri obj nesnesine ekler. Ancak, __proto__ anahtarı obj‘ye değil, JavaScript’teki tüm nesneleri temsil eden Object.prototype‘a eklenir.
  • • Bu sayede, saldırgan Object.prototype‘ı manipüle ederek isAdmin adında yeni bir özellik ekler.
  • obj.isAdmin özelliği doğrudan obj‘de tanımlı olmadığından undefined döner.
  • console.log({}.isAdmin) ise, Object.prototype‘a eklenen isAdmin özelliğini prototip zincirinde bulur ve true döner.
 

Bazı Güncel Olmayan JavaScript Kütüphaneleri

Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

Huawei Student Developers Kütahya’nın Yeni Başkanı Eren Can Özmen Prototype pollution, özellikle JavaScript kütüphanelerinde sıkça karşılaşılan bir güvenlik açığıdır. Aşağıda, geçmişte bu tür saldırılara karşı savunmasız olan başlıca JavaScript kütüphaneleri listelenmiştir:
  1. 1. Lodash: Lodash, JavaScript’te sık kullanılan yardımcı fonksiyonlar sunan popüler bir kütüphanedir. Özellikle _.merge(), _.defaults(), ve _.extend() gibi fonksiyonlar geçmişte prototype pollution saldırılarına karşı savunmasızdı.
  2. 2. jQuery: jQuery, eski JavaScript projelerinde yaygın olarak kullanılan bir kütüphanedir. $.extend() ve $.merge() gibi fonksiyonları, nesne birleştirme işlemleri sırasında __proto__ anahtarının eklenmesine izin verdiği için zafiyetli durumdaydı.
  3. 3. Hoek: Hoek, Node.js ekosisteminde kullanılan bir yardımcı kütüphanedir. hoek.merge() fonksiyonu, prototype pollution zafiyetine karşı savunmasızdı. Bu açık, özellikle Hapi.js framework’ü ile birlikte kullanılan eski sürümlerde ortaya çıkmıştır.
  4. 4. Deepmerge: Deepmerge, nesneleri derinlemesine birleştirmek için kullanılan bir kütüphanedir. __proto__ gibi özel anahtarların yanlış işlenmesi sonucu prototype pollution açıkları ortaya çıkar.
  5. 5. Yargs-parser: yargs-parser, komut satırı argümanlarını ayrıştırmak için kullanılan bir kütüphanedir. Geçmişte bu kütüphanede de prototype pollution saldırılarına yol açan güvenlik açıkları mevcuttu.
  6. 6. Dot-prop: Dot-prop, nesneler üzerinde nokta notasyonu ile derinlemesine erişim ve ayar işlemlerini kolaylaştıran bir kütüphanedir. Yanlış kullandıklarında, prototype pollution’a yol açabilecek zafiyetler oluşturuyorlardı.
 

Örnek Bir Lab

Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

Huawei Student Developers Kütahya’nın Yeni Başkanı Eren Can Özmen Burada çözeceğim laba buraya tıklayarak ulaşabilirsiniz. Kod, özetle bizden bir input bekliyor ve bu inputun içeriği şu şekilde bir JSON dosyası olmalı: auth kısmında giriş bilgileri, message kısmında ise text bilgisi olarak bizden input bekleniyor. Normal bir kullanıcı olarak yorum yapabiliyoruz, ancak yorumları silmemiz yalnızca admin olduğumuzda mümkün. Bu labda, admin gibi yorumları silmeyi amaçlıyoruz. Kodda zafiyet yaratacak yere geçecek olursak, aşağıda görüldüğü üzere dikkatli kullanılması gereken _.merge fonksiyonu kullanılmış. Görünen o ki _.merge fonksiyonuna parametre olarak gidecek message, herhangi bir ön işleme tabi tutulmamış. Zafiyet tam olarak buradan doğacak. Şimdi basitçe bir yorum yapalım ve çıktıyı inceleyelim daha sonra bu yorumu silmeye çalışacağız. Şimdi yapmış olduğum bu yorumu silmeye çalışalım bunun için kod içerisinde silme yetkimizi kontrol eden canDelete yapısını Prototype pollution zafiyetinden yararlanarak var edecek ve bunu 1 değerine eşitleyeceğiz (normalde bu sadece admin kullanıcısına tanımlı ve true olarak tanımlı.). Bunun için göndereceğimiz istek aşağıdaki gibi olacak. Son adım olarak yaptığımız ilk yorumu sadece yorum yapabilen “DIZMANA” kullanıcısı olarak silmeye çalışalım bunun için aşağıdaki istekte bulunacağım ve görebileceğimiz üzere başarılı.

Mitigation

Huawei Student Developers Kütahya’nın Yeni Başkanıyım?

Huawei Student Developers Kütahya’nın Yeni Başkanı Eren Can Özmen
  • Kullanıcı Girdilerini Temizleyin (Sanitize): Kullanıcıdan gelen JSON verilerini doğrulayın ve özellikle __proto__, constructor, prototype gibi kritik özelliklere izin vermeyin.
  • Kütüphaneleri Güncel Tutun: Güvenlik açıklarına sahip eski sürümlerden kaçınmak için kullanılan kütüphanelerin en güncel ve güvenli sürümlerini kullanın.
  • Güvenli Birleştirme Yöntemleri Kullanın: Derin kopyalama yaparken, yalnızca güvenli ve izin verilen özellikleri birleştiren kütüphaneler veya fonksiyonlar kullanın.
  • Yalnızca Gerekli Verileri İşleyin: Beklenmeyen veya ihtiyaç duyulmayan veri anahtarlarını işleme dahil etmeyin. Yalnızca izin verilen ve gerekli verileri kabul edin.
  • Güvenlik Testleri Uygulayın: npm audit veya benzeri araçlarla düzenli güvenlik taramaları yaparak kullanılan kütüphanelerdeki güvenlik açıklarını tespit edin.
  • Prototip ZinciriniDoğrudan Manipüle Etmeyin: Object.create(null) gibi yöntemler kullanarak prototip zincirine sahip olmayan nesneler oluşturun, böylece prototip kirlenmesine karşı koruma sağlarsınız.
 

Kaynak

https://medium.com/@HSDHaber/huawei-student-developers-k%C3%BCtahyan%C4%B1n-yeni-ba%C5%9Fkan%C4%B1-eren-can-%C3%B6zmen-2ca8667b2ed7 https://www.cobalt.io/blog/a-pentesters-guide-to-prototype-pollution-attacks https://learn.snyk.io/lesson/prototype-pollution/ https://github.com/Kirill89/prototype-pollution-explained https://hackerone.com/reports/998398