CVE-2024-43414
Açıklama
Apollo Federation, API'lerin bildirimsel olarak birleşik bir grafikte oluşturulması için kullanılan bir mimaridir. Her ekip, grafiğin kendi bölümüne bağımsız olarak sahip olabilir; bu da onların otonom ve artımlı olarak teslimat yapmalarını sağlar. @apollo/query-planner >=2.0.0 ve <2.8.5 sürümleri, bir hizmet reddi (denial-of-service) zafiyetinden etkilenmektedir. @apollo/gateway >=2.0.0 ve <2.8.5 sürümleri ile Apollo Router <1.52.1 sürümü de @apollo/query-planner kullanımları nedeniyle etkilenmektedir. Eğer @apollo/query-planner'dan yeterince karmaşık bir sorguyu planlaması istenirse, sonsuz döngüye girebilir ve işlemi asla tamamlamayabilir. Bu durum, sınırsız bellek tüketimine ve sonucunda sistemin çökmesine veya bellek yetersizliği (out-of-memory - OOM) nedeniyle sonlandırılmasına yol açar. Bu sorun, birden fazla alt grafik (subgraph) tarafından çözülebilen en az bir tane @key olmayan alanınız varsa tetiklenebilir. Bu paylaşılan alanları belirlemek için her bir alt grafiğin şeması incelenmelidir. Paylaşılan alanların belirlenme mekanizması, alt grafiklerinizin kullandığı Federation sürümüne göre değişiklik gösterir. Alt grafiklerinizin Federation 1 mi yoksa Federation 2 mi kullandığını şemalarını inceleyerek kontrol edebilirsiniz. Federation 2 alt grafik şemaları, kullanılan Federation sürümüne referans veren bir @link direktifi içerirken, Federation 1 alt grafikleri içermez. Örneğin, bir Federation 2 alt grafiğinde @link(url: "https://specs.apollo.dev/federation/v2.0") gibi bir satır bulursunuz. Alt grafik şemanızda benzer bir @link direktifi mevcut değilse, Federation 1 kullanıyordur. Bir süpergrafiğin hem Federation 1 hem de Federation 2 alt grafiklerinin karışımını içerebileceği unutulmamalıdır. Bu sorun, Apollo sorgu planlayıcısının bazı durumlarda Javascript'in Number.MAX_VALUE değerini aşan bir Number kullanmaya çalışmasından kaynaklanmaktadır. Javascript'te Number.MAX_VALUE değeri (2^1024 - 2^971)'dir. Sorgu planlayıcı gelen bir graphql isteği aldığında, sorguyu parçalara ayırır ve her parça için parçayı çözmek üzere potansiyel yürütme adımlarının bir listesini oluşturur. Bu adaylar, sorgu planlayıcının daha büyük sorgunun parçalarını karşılamak için izleyeceği adımları temsil eder. Normal operasyonların bir parçası olarak sorgu planlayıcı, toplam sorgu için olası sorgu planlarının sayısını gerektirir ve hesaplar. Yani, sorgunun her parçası için sorgu planı adaylarının sayısının çarpımına ihtiyaç duyar. Normal koşullar altında, tüm sorgu planı adaylarını oluşturduktan ve tüm permütasyonların sayısını hesapladıktan sonra sorgu planlayıcı, adayları sıralamaya ve optimal olmayan seçenekleri budamaya geçer. Özellikle alanların birden fazla alt grafik üzerinden çözülebildiği oldukça karmaşık sorgularda, bu durum tüm sorgu planı permütasyonlarının sayısının hızla artmasına neden olabilir. En kötü senaryolarda, bu sayı Number.MAX_VALUE'dan daha büyük bir sayıya ulaşabilir. Javascript'te Number.MAX_VALUE aşıldığında, Javascript bu değeri "infinity" (sonsuz) olarak temsil eder. Aday sayısı sonsuz olarak değerlendirilirse, sorgu planlayıcının optimal olmayan sorgu planlarını budamaktan sorumlu bileşeni aslında adayları budamaz ve bu da sorgu planlayıcının gerekenden çok daha fazla sayıda sorgu planı adayını değerlendirmesine neden olur. Bu sorun @apollo/query-planner v2.8.5, @apollo/gateway v2.8.5 ve Apollo Router v1.52.1 sürümlerinde giderilmiştir. Kullanıcıların yükseltme yapmaları önerilir. Birden fazla alt grafikten çözülebilen hiçbir alan olmadığından emin olunarak bu sorundan kaçınılabilir. Tüm alt grafikler Federation 2 kullanıyorsa, alt grafik şemalarınızın hiçbirinin @shareable direktifini kullanmadığından emin olarak etkilenmediğinizi onaylayabilirsiniz. Federation 1 alt grafikleri kullanıyorsanız, birden fazla alt grafik tarafından çözülebilen herhangi bir alan olmadığını doğrulamanız gerekecektir.
Nasıl düzeltilir
- apollographql apollo_gateway2.8.5 ya da sonraki bir sürüm
- apollographql apollo-router1.52.1 ya da sonraki bir sürüm
- apollographql apollo_helms-charts_router1.52.1 ya da sonraki bir sürüm
- apollographql apollo_query-planner2.8.5 ya da sonraki bir sürüm
- apollographql apollo_router1.52.1 ya da sonraki bir sürüm
- apollo-router1.52.1 ya da sonraki bir sürüm
- @apollo/query-planner2.8.5 ya da sonraki bir sürüm
- @apollo/gateway2.8.5 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| apollographql apollo_gateway | 2.0.0 ≤ v < 2.8.5 | 2.8.5 |
| apollographql apollo-router | v < 1.52.1 | 1.52.1 |
| apollographql apollo_helms-charts_router | v < 1.52.1 | 1.52.1 |
| apollographql apollo_query-planner | 2.0.0 ≤ v < 2.8.5 | 2.8.5 |
| apollographql apollo_router | v < 1.52.1 | 1.52.1 |
| apollo-routercrates.io | v < 1.52.1 | 1.52.1 |
| @apollo/query-plannernpm | 2.0.0 ≤ v < 2.8.5 | 2.8.5 |
| @apollo/gatewaynpm | 2.0.0 ≤ v < 2.8.5 | 2.8.5 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.