- MongoBleed(CVE-2025-14847), 2017’den bu yana tüm MongoDB sürümlerinde bulunan ciddi bir bellek sızıntısı açığıdır; saldırganlar veritabanının heap belleğindeki rastgele verileri okuyabilir
- Açık, zlib sıkıştırma yolundaki bir hatadan kaynaklanır ve kimlik doğrulama olmadan, yalnızca veritabanına bağlanarak istismar edilebilir
- Saldırganlar manipüle edilmiş sıkıştırılmış istekler göndererek sunucunun yanlış boyutta bir arabellek ayırmasını sağlayabilir ve bunun içindeki önceki işlemlere ait bellek verilerini (parolalar, API anahtarları vb.) ortaya çıkarabilir
- MongoDB, 19 Aralık 2025’te bir yama yayımladı, ancak EOL sürümleri (3.6, 4.0, 4.2) düzeltilmedi
- 8 yıldır var olan bu açık, internete açık 210 binden fazla MongoDB örneğini etkiliyor; hem bulut hem de şirket içi ortamlarda derhal yama uygulanması veya sıkıştırmanın devre dışı bırakılması gerekiyor
MongoBleed genel bakış
- MongoBleed(CVE-2025-14847), MongoDB’nin zlib 1 mesaj sıkıştırma yolunda keşfedilen bir açıktır ve 2017’den bu yana tüm sürümleri etkiler
- Saldırganlar kimlik doğrulama olmadan yalnızca veritabanına bağlanarak rastgele heap bellek verilerini okuyabilir
- MongoDB 3.6, 4.0, 4.2 gibi destek sonu (EOL) sürümleri düzeltilmedi
- Bu hata, Mayıs 2017’deki bir PR ile sisteme girdi ve 19 Aralık 2025’te resmen açıklandı
- MongoDB, Atlas bulut hizmeti dahil tüm örneklere yamaların uygulandığını duyurdu
MongoDB iletişim yapısı
- MongoDB, HTTP yerine kendi TCP protokolünü kullanır ve mesajlar BSON (Binary JSON) biçiminde iletilir
- Tüm istekler OP_MSG komutundan oluşur; sıkıştırıldığında OP_COMPRESSED mesajıyla sarılır
- Mesajda
uncompressedSize, originalOpcode, compressorId gibi alanlar bulunur
uncompressedSize, sıkıştırma açıldıktan sonraki beklenen boyutu gösterir
İstismar aşaması 1 — hatalı arabellek ayırma
- Saldırgan,
uncompressedSize değerini gerçekte olduğundan aşırı büyük ayarlayarak sunucunun büyük bir arabellek ayırmasını sağlar
- Örnek: Gerçekte 1KB olan bir mesajı 1MB olarak bildirmek
- MongoDB sunucusu, sıkıştırma açıldıktan sonra gerçek boyutu doğrulamadan kullanıcının belirttiği boyuta güvenir
- Sonuç olarak bellekte
[gerçek veri | başvurulmayan heap çöp verisi] biçiminde bir yapı kalır
- C++ tabanlı MongoDB bellek başlatma yapmadığı için bu alanda önceki işlemlerden kalma hassas veriler bulunabilir
- Örnek: parolalar, oturum token’ları, API anahtarları, müşteri verileri, sistem ayarları vb.
İstismar aşaması 2 — veri sızdırma
- Saldırgan, hatalı BSON girdisi göndererek sunucunun bellekteki çöp verileri bir dize olarak ayrıştırmasını tetikler
- BSON’un ilk alanı bir dizedir ve C dilindeki null sonlandırmalı dize (null-terminated string) kuralını izler
- Saldırgan null sonlandırma karakteri olmayan bir dize gönderirse, sunucu bellekteki diğer verileri de okumaya devam eder
- Örnek:
[ { "a | password: 123\0 | apiKey: jA2sa | ip: 219.117.127.202 ]
- Sunucu bunu hatalı bir BSON alanı olarak algılar ve yanıtındaki hata mesajına ilgili içeriği ekler
"errmsg": "invalid BSON field name 'a | password: 123'"
- Bu süreç tekrarlandığında saldırgan tüm heap belleği tarayarak hassas bilgileri toplayabilir
Etki ve risk düzeyi
- Açık kimlik doğrulama öncesi (pre-auth) aşamada ortaya çıktığı için saldırganlar giriş yapmadan verilere erişebilir
- İnternete açık MongoDB örnekleri anında risk altındadır
- Shodan aramasına göre 213.000’den fazla MongoDB örneği herkese açıktır
- 2017’den 2025’e kadar yaklaşık 8 yıl boyunca varlığını sürdüren bu açık, yapısının basitliği nedeniyle fiilen istismar edilme olasılığı yüksektir
- MongoDB, “şu ana kadar istismar edildiğine dair bir kanıt yok” dedi, ancak resmî bir özür veya ayrıntılı bir zaman çizelgesi yayımlamadı
Azaltma yöntemleri
- Güncel yamalı sürüme (8.0.17 ve üzeri) güncelleyin
- Kısa vadede zlib ağ sıkıştırmasını devre dışı bırakmak da bir azaltma yöntemi olabilir
- MongoDB Atlas kullanıcılarında yama zaten uygulanmış durumda
Ek bilgiler ve ilgili tartışmalar
- Elastic güvenlik ekibi lideri buna ‘MongoBleed’ adını verdi ve PoC(Python betiği) yayımladı
- MongoDB ile Elastic, arama ve analiz işlevleri alanında rekabet ediyor
- İlgili kaynaklar:
Özet
- MongoBleed, zlib sıkıştırma işleme hatası nedeniyle ortaya çıkan bir bellek sızıntısı açığıdır
- Saldırganlar manipüle edilmiş sıkıştırılmış istekler yoluyla önceki bellek verilerini (parolalar, API anahtarları vb.) elde edebilir
- 2017–2025 arasındaki tüm MongoDB sürümleri etkilenir; yama veya sıkıştırmayı devre dışı bırakma zorunludur
- İnternete açık 210 binden fazla örnek potansiyel risk altındadır
- MongoDB yama yayımladı, ancak EOL sürümlerine destek verilmemesi ve kamuya açık yanıtın gecikmesi eleştiriliyor
1 yorum
Hacker News görüşleri
Bu sayede başlatılmamış bellekte anlamlı veri kalmıyordu
Performans düşüşü bekliyordum ama gerçekte ölçülebilir hiçbir etkisi olmadı
Bellek açısından güvenli olmayan diller kullanan herkesin bunu yapması gerektiğini düşünüyorum. Bu Mongo hatası da muhtemelen bu şekilde hafifletilebilirdi
Bu sayede bellek sıkıştırma verimliliği artıyor ve ortalamada performansın hatta iyileştiği söyleniyor
MALLOC_CONF=opt.junk=freeortam değişkeni ayarlanırsa malloc aynı davranışı sergiliyorYani pek çok implementasyon bu özelliği zaten opsiyon olarak sunuyor
Daha fazla performans gerekirse belirli kullanım senaryolarına uygun özel allocator yazılabilir
Böylece sistem allocator’ında mümkün olmayan başka optimizasyonlar da yapılabilir
0xdb, serbest bırakılan belleği ise0xdfile dolduruyorBu sayede use-before-initialization ve use-after-free hataları hızlıca yakalanabiliyor
Bu da varsayılan ayar olarak geliyor
init_on_free=1seçeneğini açmakla aynı şey mi diye merak ediyorumMongo, geliştirmeyi dahili özel repository üzerinde yapıp sonra commit’leri Copybara ile açık repository’ye taşıyor
Tarih karmaşası da bu süreçten kaynaklanıyor
Yazıyı güncelleyip bu durumu ve tarih farkını açıklayacağım
Bizim Atlas cluster’larımız CVE yayımlanmadan birkaç gün önce zaten yükseltilmişti
Günümüzde çoğu allocator’un bunu varsayılan olarak yapması gerekir
Blink tarafında Chris bu alanı iyileştirdi ve sonuçları tüm Chromium’a yayıldı
İlgili dokümanlar da ilginç
Chromium blog yazısı
PartitionAlloc dokümanı
SQL tarafında nadir ama zaman zaman görülüyor
Şema, dayanıklılık, okuma/yazma, bağlantı gibi hiçbir şeyi dert etmemek üzerine kurulu bir anlayış var
Bu yüzden güvenliğin de önemsenmemesi şaşırtıcı değil
Bu yaklaşım “şimdilik rahat edelim” düşüncesine dönüşüyor ve sonunda halka açık DB instance’ı gibi güvenlik sorunlarına yol açıyor
Gerçekte SQL ve NoSQL’i birlikte kullanmak yaygın bir durum
NoSQL, büyük ölçekli veride yüksek erişilebilirlik açısından güçlü; SQL ise ilişkisel veri saklama için uygun
Örneğin iMessage ya da EA’in matchmaking sistemi de NoSQL kullanıyor
Sonuçta ikisine de ihtiyaç var. Rakip değil, birbirini tamamlayan teknolojiler
Örneğin PostgreSQL yalnızca varsayılan ayarlarla bile tüm sistem yetkisine sahip olabilir
Bu yüzden çoğu insan internete açık SQL sunucularının riskini iyi bilir
Ben de şahsen kullanmak istemem ama DynamoDB ya da MongoDB’nin teknik olarak uygun olduğu durumlar var
ilgili video
Ama buffer overflow 2003’ten beri hâlâ var
Bu tür sorunlar dil seviyesinde engellenmedikçe sonsuza kadar tekrar edecektir
Mongo geliştiricilerine geçmiş olsun
Bence ToroDB ya da PostgreSQL’in JSONB’si kullanmak daha iyi