AI Hacking - Hackerlar Siber Saldırılarda Yapay Zekayı Nasıl Kullanıyor?

Şimdi Oku
Site çevirileri için yapay zeka kullanıyoruz ve doğruluk için çaba göstersek de her zaman %100 kesin olmayabilir. Anlayışınız için teşekkür ederiz.

Mongoose CVE-2025-23061 ve CVE-2024-53900'ün Teknik Keşfi

tarafından OPSWAT
Bu Gönderiyi Paylaş

Mongoose, Node.js uygulamalarında veritabanı etkileşimlerini basitleştiren MongoDB için bir Nesne Veri Modelleme (ODM) kütüphanesidir. Mongoose, şema tabanlı bir çözüm sunarak JavaScript nesnelerinin MongoDB belgeleriyle eşleştirilmesini sağlar ve daha kolay yönetim ve doğrulama için verilerin yapılandırılmasına yardımcı olan bir soyutlama katmanı görevi görür. Özel mantık yürütme için ara katman yazılımı ve sezgisel bir sorgu oluşturma sistemi gibi özelliklerle Mongoose, MongoDB ile çalışmanın verimliliğini artırır. "Node.js için zarif MongoDB nesne modellemesi" olarak tanımlanan Mongoose, GitHub'da 27 bin yıldız toplayarak geliştiriciler arasındaki yaygın kullanımını ve takdirini yansıtıyor.

OPSWAT Burs Programı ve Kritik Güvenlik Açığı Keşfi

Merkezi Vietnam'da bulunan OPSWAT Kritik Altyapı Siber Güvenlik Yüksek Lisans Burs Programı, yüksek lisans öğrencilerine kritik altyapının güvenliğini sağlama konusunda uygulamalı deneyim kazandırmaktadır. Bu programın bir parçası olarak, bursiyerler kötü amaçlı yazılım tespiti, dosya güvenliği ve tehdit önleme gibi alanlarda gerçek dünyadaki zorlukların üstesinden gelmek için OPSWAT uzmanlarıyla işbirliği yaparak siber güvenlik açıklarını analiz etme ve ele alma fırsatına sahip olurlar. 

OPSWAT Fellowship programı sırasında katılımcılar çeşitli ürünler, kütüphaneler ve işletim sistemlerinde bilinen CVE'leri sistematik olarak araştırır ve yeniden üretir. Bu girişimin bir parçası olarak, seçkin bursiyerlerimizden biri olan Dat Phung, üretim ortamlarında yaygın olarak benimsenmesi nedeniyle Mongoose'u incelemeyi seçti. Kasım 2024'te, kütüphanenin derinlemesine bir analizini gerçekleştirirken Mongoose'da kritik bir güvenlik açığı keşfetti. Güvenlik açığı, bir saldırganın $where değerinden yararlanmasına izin vererek Node.js uygulama sunucusunda Uzaktan Kod Yürütme (RCE) potansiyeline yol açıyordu. Sorunun derhal Mongoose'a bildirilmesi üzerine, 8.8.3 sürümünün bir parçası olarak bir yama yayınlandı ve CVE-2024-53900 Ulusal Güvenlik Açığı Veritabanı'nda (NVD) açıklandı.

CVE-2024-53900 & CVE-2025-23061 Zaman Çizelgesi

  • 7 Kasım 2024: Dat Phung, Mongoose'da kritik bir güvenlik açığı tespit etti ve Snyk'e bir güvenlik raporu sundu. 
  • 26 Kasım 2024: Mongoose, bu güvenlik açığını gidermek ve düzeltmek için 8.8.3 sürümünü yayınladı. 
  • 2 Aralık 2024: Ulusal Güvenlik Açığı Veritabanı (NVD) bu güvenlik açığı için CVE-2024-53900'ü açıkladı. 
  • 17 Aralık 2024: Mongoose'un 8.8.3 yamasını analiz ettikten sonra Dat Phung, RCE'yi (Uzaktan Kod Yürütme) hala etkinleştiren bir bypass buldu. Tidelift'e ayrıntılı bir güvenlik raporu gönderildi. 
  • 13 Ocak 2025: Mongoose, bypass'ı etkili bir şekilde ele alan gelişmiş bir yama sunan 8.9.5 sürümünü yayınladı. 
  • 15 Ocak 2025: Ulusal Güvenlik Açığı Veritabanı (NVD), yeni tespit edilen güvenlik açığının ciddiyetini vurgulayarak CVE-2025-23061'i resmi olarak açıkladı.

Mongoose'un Populate() Yöntemi

Mongoose ayrıca belgeler arasındaki ilişkilerle çalışma yeteneğini geliştiren populate() adlı kullanışlı bir özellik de sağlar. MongoDB sürümleri ≥ 3.2 birleştirmeler için $lookup toplama operatörüne sahipken, Mongoose'un populate() özelliği, bir referansı ilgili belgelerden karşılık gelen verilerle otomatik olarak değiştirmek için daha güçlü bir alternatif sunar. Bu özellikle farklı MongoDB koleksiyonları arasındaki ilişkileri yönetmek için kullanışlıdır, örneğin bir belgenin _id'si ile diğerine başvurması gibi. [2] 

İsim, yaş ve biyografi alanlarıyla bir yazar için Mongoose şeması tanımlayan JavaScript kodu
Yazarlar Şeması
Başlık, açıklama, fiyat ve yazar referansları dahil olmak üzere kitaplar için bir Mongoose şeması tanımlayan JavaScript kodu
Kitaplar Şeması
Kitap ayrıntılarını alan ve yazar veya inceleme alanlarını dolduran bir Node.js rotası için JavaScript kod parçacığı
Nodejs uygulaması

Mongoose'da bir şema tanımlanırken, ref seçeneği kullanılarak bir alan başka bir modele referans verecek şekilde ayarlanabilir. Daha sonra populate() yöntemi, referans verilen alanı (bir ObjectId) ilgili modeldeki tam belge ile değiştirmek için kullanılır. Örneğin, bir kitap mağazası uygulamasında, bookSchema 'daki author alanı Author belgesini referans alır ve review alanı Reviews belgesini referans alır. populate() yöntemi, geliştiricilerin kitap modelini sorgularken yazar alanını (bir ObjectId olan) tam Yazar belgesiyle değiştirmesini sağlar.

populate(), geliştiricilerin kitap modelini sorgularken yazar alanını (bir ObjectId olan) tam Yazar belgesiyle değiştirmelerine olanak tanır:

Genişletilmiş yazar bilgileri olmadan kitap ayrıntılarını depolayan bir MongoDB belgesinin JSON temsili
populate() kullanmamak
Populate işlevi kullanılarak genişletilmiş yazar ayrıntılarına sahip bir MongoDB belgesinin JSON gösterimi
populate() işlevini kullanma

Ayrıca, Mongoose'un populate() yöntemi, hangi ilgili belgelerin alınacağını ve nasıl alınacağını tanımlamak için özel sorguları destekler. Eşleşme ve seçenekler gibi özellikler, geliştiricilerin ilgili belgeleri filtrelemesine, sıralamasına, sınırlamasına ve atlamasına olanak tanıyarak esnek veri alma yetenekleri sunar.

Yazarları yaşa göre filtrelemek için Mongoose'un populate işlevini kullanan özel bir sorguyu gösteren JavaScript kodu
Mongoose'da populate() işlevinde özel sorgu

CVE-2024-53900 Analizi

OPSWAT Siber Güvenlik Lisansüstü Burs programının bir parçası olarak, bilinen CVE'leri yeniden üretmek için Mongoose'u analiz ederken Dat Phung, MongoDB belgeleri arasındaki ilişkileri ele almada önemli bir rol oynayan populate() yönteminin iç işleyişine ilişkin kapsamlı bir inceleme gerçekleştirdi. populate() yöntemi hem dize hem de nesne argümanlarını destekler ve geliştiriciler alınan verilere belirli filtreler uygulamak için eşleşme seçeneğini kullanabilir:

Bir sorguda yazarları yaşlarına göre filtrelemek için $where operatörünün kullanımını gösteren JavaScript kodu

Yukarıdaki örnekte, eşleşme seçeneği, Sorgu ve Projeksiyon Operatörleri - MongoDB Kılavuzu v8.0'da ayrıntılı olarak açıklandığı gibi MongoDB sorgu operatörlerini içerebilen bir filtre nesnesidir. Dikkate değer bir operatör, JavaScript'in doğrudan MongoDB sunucusunda yürütülmesini sağlayan $where'dir. Ancak, MongoDB sunucusundaki bu yürütme kısıtlıdır ve yalnızca temel işlemleri ve işlevleri destekler.

MongoDB map-reduce işlemleri için kullanılabilen JavaScript işlevlerini ve özelliklerini listeleyen tablo

Dat Phung, populate() yönteminin iş akışını anlamak için Mongoose kaynak kodunda derinlemesine bir analiz gerçekleştirdi. Uygulamanın model üzerinde populate () yöntemini çağırmasının ardından populate() işlevinin tetiklendiğini tespit etti. Bu fonksiyon içinde Mongoose, MongoDB sunucusunda $where operatörü ile sorguyu yürüten _execPopulateQuery() fonksiyonunu çağırır. Daha sonra, yabancı koleksiyondaki tüm belgeler sonraki adımlarda popülasyon için alınır.

Bir Mongoose populate sorgusunun yürütülmesini analiz eden VS Code hata ayıklama oturumunun ekran görüntüsü

Mongoose, MongoDB'den verileri aldıktan sonra, assignVals ( ) işlevini çağırarak iki modeli "birleştirmeden" önce verileri hazırlamak için _assign( ) işlevini çağıran _done( ) geri arama işlevini çalıştırır.

VS Code'da Mongoose'daki $where sorgusuyla ilgili vurgulanmış JavaScript kodunu gösteren bir hata ayıklama oturumu

Güvenlik açığı, alınan veriler Mongoose'un assignVals() işlevi tarafından işlendiğinde ortaya çıkabilir. Bu fonksiyon eşleşme seçeneğinin bir dizi olup olmadığını kontrol eder ve eğer öyleyse her bir operatörü sift() fonksiyonuna aktarır. Aynı adı taşıyan harici bir kütüphaneden içe aktarılan sift() işlevi, bu sorguları uygulama sunucusunda yerel olarak işler. Bu yerel işleme, özellikle kullanıcı kontrollü girdiyi işlerken bir güvenlik riski oluşturur.

Bir JavaScript işlevi içindeki değişken atamalarını gösteren bir VS Code hata ayıklama oturumu

Bunu daha fazla araştırmak için Dat Phung, koşulların yerine getirildiğinden emin olmak için eşleşme seçeneğindeki değerleri değiştirdi ve böylece veri akışının ek analizi için sift() işlevini çağırdı.

Bir $where filtre koşulu ile bir Mongoose sorgusunu gösteren bir JavaScript kod parçası

Koşul yerindeyken, $where işleci daha sonra sift() işlevine aktarıldı.

Bir JavaScript işlevinde filtrelenmiş değerleri gösteren bir VS Code hata ayıklama oturumu

sift kütüphanesi, MongoDB benzeri sözdizimi kullanarak diziler veya JSON nesneleri gibi veri koleksiyonlarını filtrelemek ve sorgulamak için tasarlanmış hafif bir JavaScript yardımcı programıdır. Resmi belgelere göre, "Sift, JavaScript'te MongoDB sorgularını kullanmak için küçük bir kütüphanedir." sift() işlevi, MongoDB benzeri filtre işlemlerini veritabanı sunucusu yerine uygulama sunucusunda değerlendirir, bu da güvenilmeyen girdiyi işlerken sistemi önemli güvenlik risklerine maruz bırakabilir.

Bir dizi nesneyi yaş kriterine göre filtrelemek için Sift.js kullanan basit bir JavaScript kod parçacığı
Bir Sift kod örneği

Analizine devam eden Araştırmacımız, sift kütüphanesinin createDefaultQueryTester() işlevinde bir sorun tespit etmiştir. Bu işlev, eşleşme dizisindeki her bir işlemi çalıştırılabilir JavaScript işlevlerine dönüştürür ve bu işlevler daha sonra MongoDB belge verilerini yerel olarak filtrelemek ve işlemek için kullanılır. Bunu başarmak için createDefaultQueryTester( ), createNamedOperation() fonksiyonunu çağırır ve match dizisinden $where gibi işlemleri argüman olarak geçirir. 

Sorgu işlemlerine ve işlev yürütmeye odaklanan bir VS Code hata ayıklama oturumu

Eşleşme dizisindeki her işlem için createNamedOperation, işlemin desteklenip desteklenmediğini kontrol eder ve ardından ilgili işleve aktarır.

Where, $eq ve $exists gibi sorgu operatörlerini gösteren bir JavaScript hata ayıklama oturumu

İşlem $where ise, match dizisindeki $where işlecinden türetilen ve kullanıcı tarafından kontrol edilebilen ham "params" değeri kullanılarak bir JavaScript işlevi oluşturulur.

CSP (İçerik Güvenliği İlkesi) etkinleştirildiğinde işlevin yürütülmesini gösteren vurgulanmış bir JavaScript parçacığı

CVE-2024-53900: İstismar Detayları

MongoDB, daha önce analiz edildiği gibi $where işlemi aracılığıyla JavaScript işlevlerinin yürütülmesini sınırlarken, sift() işlevi bu işlevlerin bu tür kısıtlamalar olmaksızın yürütülmesine izin verir. Bu girdi doğrulama ve kısıtlama eksikliği, doğrudan kullanıcı girdisi tarafından kontrol edilen "params" değeri istismar edilebileceğinden ve potansiyel olarak kod enjeksiyon saldırılarına yol açabileceğinden önemli bir güvenlik açığı ortaya çıkarmaktadır. Bu sorunu daha ayrıntılı bir şekilde incelemek için Dat Phung aşağıdaki sorguyu oluşturmuştur:

Potansiyel olarak güvenli olmayan bir işlev yürütme ile $where koşulunu kullanan bir Mongoose sorgusunu gösteren bir JavaScript parçacığı

Başlangıçta, sorgu başka bir işlemi yürütmede başarısız oldu ve aşağıdaki hatayla sonuçlandı:

Tanımlanmamış bir global referans nedeniyle sunucu yürütme hatasını gösteren bir MongoDB hata günlüğü

Bu hata, Mongoose'un kontrolü sift() fonksiyonuna geçirmeden önce MongoDB sunucusunda $where işlemini yürütmeye çalıştığını gösterir. Ancak, MongoDB'nin $where cümlesindeki JavaScript işlevleri üzerindeki kısıtlamalar nedeniyle, sorgunun yürütülmesini engelleyen bir hata oluşur. Sonuç olarak Mongoose, sift() fonksiyonuna ulaşamadan işlemi durdurur.

Arkadaşımız bu sınırlamayı aşmak için uygulama sunucusunda bulunan ve MongoDB sunucusunda bulunmayan "global" değişkenden yararlanmıştır. Bu yaklaşım, MongoDB sunucusundaki kısıtlamayı atlamasına ve sorgunun sift() işlevine ulaşmasına olanak sağlamıştır:

Kodlama sürecindeki bir sorunu vurgulayan "kod çalışmıyor" metnini gösteren bir bilgisayar monitörü

Bu değerle, Mongoose MongoDB üzerinde $where işlemini yürüttüğünde, "global" değişkeninin olmaması üçlü operatörün (typeof global != "undefined" ?global.process.mainModule.constructor._load("child_process").exec("calc") : 1) 1 döndürerek MongoDB'nin hata vermesini önler. Sonuç olarak, sorgu MongoDB sunucusunda sorunsuz bir şekilde yürütülür.

Ancak aynı değer "global" değişkenin bulunduğu uygulama sunucusunda çalışan sift() fonksiyonuna ulaştığında aşağıdaki fonksiyonun oluşturulmasını tetikler:

Kalın harflerle "merhaba dünya" ifadesini içeren tek renkli bir ekran

Uzaktan Kod Yürütme (RCE) Kavram Kanıtı

Blogun başında verilen uygulama örneğinde, bir saldırgan aşağıdaki isteği gönderirse, Uzaktan Kod Yürütme (RCE) saldırısını başarıyla gerçekleştirebilir:

"the new york times" metnini kalın bir yazı tipiyle belirgin bir şekilde gösteren siyah beyaz ekran
Mongoose CVE güvenlik açıklarının teknik ayrıntılarını, veri akışını ve güvenlik ihlali noktalarını gösteren diyagram

Video, sift kütüphanesi ile birlikte $where operatörünün kötüye kullanımını önlemek için uygun girdi doğrulamasından yoksun olan 8.8.3 öncesi Mongoose sürümlerini etkileyen CVE-2024-53900 için Kavram Kanıtı'nı göstermektedir.

Eksik Düzeltme ve CVE-2025-23061

Dat Phung'un güvenlik raporuna dayanarak, Mongoose daha önce tanımlanan güvenlik açığını (CVE-2024-53900) kamuya açıklanmadan önce çözmeyi amaçlayan bir yama sundu. İlgili yama(Automattic/mongoose@33679bc) , populate() işlevine aktarılan match özelliği içinde $where kullanımına izin vermemek için bir kontrol ekledi.

Bu kod parçacığı, populate() işlevine aktarılan eşleşme özelliğinin bir dizi olup olmadığını kontrol eder. Eğer öyleyse kod, $where operatörünü içerip içermediğini görmek için dizideki her nesneyi yineler. Eğer $where tespit edilirse, bir hata ortaya çıkar ve kötü amaçlı yükün riskli sift() fonksiyonuna yayılması engellenir.  

Sonuç olarak, CVE-2024-53900'den yararlanan yük bu kontrolde başarısız olur çünkü match dizisindeki bir nesne $where içerir ve sift() işlevine ulaşmasını etkili bir şekilde engeller.

Bu güncelleme $where 'in tek bir iç içe geçme seviyesi içinde doğrudan kullanımını doğru bir şekilde engellerken, hem MongoDB hem de sift kütüphanesinin tam olarak desteklediği bir yapı olan $or operatörünün içine gömüldüğünde $where 'i algılayamaz.

MongoDB $or operatörünü destekler
Sift kütüphanesi $veya operatörünü destekler

Sonuç olarak, bir saldırgan yamanın tek seviyeli kontrolünden kaçmak için $where öğesini $or öğesinin altına yerleştirebilir. Mongoose, eşleşme dizisindeki her nesnenin yalnızca üst düzey özelliklerini incelediğinden, bypass yükü tespit edilmeden kalır ve sonunda sift kütüphanesine ulaşarak kötü amaçlı RCE'yi etkinleştirir.

Mongoose 8.8.3'teki düzeltmeyi atlamak için kullanılan yük

CVE-2025-23061 için Kavram Kanıtı

Dat Phung, düzeltmenin eksik doğasını göstermek için örnek uygulamayı Mongoose 8.9.4 (8.8.3'ten sonraki) sürümünü kullanarak yeniden oluşturdu. Bir saldırgan $whereöğesini bir $or cümlesinin içine yerleştirerek kontrolü başarıyla atlatabilir ve RCE elde edebilir.

Kavram kanıtı istismarı, CVE-2025-23061'in 8.9.5'ten önceki Mongoose sürümlerinde nasıl tetiklenebileceğini ve bir saldırganın sunucuda rastgele kod çalıştırmasına izin verdiğini göstermektedir:

Hafifletme ve Rehberlik

Yukarıda bahsettiğimiz güvenlik açıklarını azaltmak için lütfen sisteminizin Mongoose'un en son sürümüne güncellendiğinden emin olun.

SBOM Motorunu Kullanan MetaDefender Core Bu Güvenlik Açığını Tespit Edebilir

OPSWAT MetaDefender CoreGelişmiş SBOMSoftware Bill of Materials) özellikleriyle donatılmış olan MetaDefender Core, kurumların güvenlik risklerini ele almada proaktif bir yaklaşım benimsemelerini sağlar. MetaDefender Core , yazılım uygulamalarını ve bağımlılıklarını tarayarak, listelenen bileşenlerdeki CVE-2024-53900 ve CVE-2025-23061 gibi bilinen güvenlik açıklarını tanımlar. Bu da geliştirme ve güvenlik ekiplerinin yama çalışmalarına öncelik vermesini sağlayarak olası güvenlik risklerini kötü niyetli aktörler tarafından istismar edilmeden önce azaltır. 

Aşağıda MetaDefender Core tarafından SBOM ile tespit edilen CVE-2024-53900 ve CVE-2025-23061'in ekran görüntüsü yer almaktadır:

Ek olarak, CVE'ler aşağıdaki yöntemlerle de tespit edilebilir MetaDefender Software Supply ChainBu güvenlik açıklarını tespit etmek için SBOM ile MetaDefender Core 'dan yararlanır.

OPSWAT ile Güncel Kalın!

En son şirket güncellemelerini almak için bugün kaydolun, hikayeler, etkinlik bilgileri ve daha fazlası.