Aralık 2025'in başında React ekibi, React Server Components altyapısında kimlik doğrulama gerektirmeden uzaktan kod çalıştırmaya imkân veren kritik bir güvenlik açığı duyurdu. Açık, CVE-2025-55182 numarasıyla kayda geçti, en yüksek önem derecesi olan CVSS 10.0 ile puanlandı ve güvenlik topluluğunda React2Shell adıyla anılmaya başladı. Duyurudan kısa süre sonra açığın gerçek saldırılarda kullanıldığı raporlandı. Bu yazıda React2Shell'in ne olduğunu, neden bu kadar ciddi olduğunu, projenizin etkilenip etkilenmediğini nasıl anlayacağınızı ve yama sonrasında atlanmaması gereken adımları teknik olmayan yöneticilerin de takip edebileceği bir dille anlatıyoruz.
React Server Components nedir?
React, modern web arayüzlerinin büyük bölümünde kullanılan bir JavaScript kütüphanesidir. Klasik kullanımda React bileşenleri kullanıcının tarayıcısında çalışır. React Server Components (RSC) ise bileşenlerin bir kısmının sunucuda çalıştırılmasını ve tarayıcıya yalnızca sonucun gönderilmesini sağlayan bir yaklaşımdır. Bu sayede sayfalar daha hızlı açılır, veritabanı sorguları doğrudan sunucu tarafında yapılabilir ve tarayıcıya giden JavaScript miktarı azalır.
Sunucu ile tarayıcı arasındaki bu iletişim, React'in Flight adı verilen kendi veri formatı üzerinden yürür. Tarayıcı, bir form gönderdiğinde veya bir Server Action (sunucuda çalışan fonksiyon) çağırdığında, isteğin içeriği bu formatta sunucuya gelir; sunucu da bu veriyi çözerek, yani deserialize ederek işler. React2Shell tam olarak bu çözme aşamasında ortaya çıkan bir hatadır.
Next.js'in App Router yapısı, React Router'ın RSC desteği, Waku gibi çatılar ve Vite ya da Parcel için geliştirilen RSC eklentileri bu altyapıyı kullanır. Dolayısıyla açık yalnızca React ile değil, React Server Components'i kullanan her çatı ile ilgilidir.
React2Shell açığı nasıl çalışır?
Serileştirme (serialization), bellekteki bir veri yapısının ağ üzerinden gönderilebilecek bir metne veya bayt dizisine çevrilmesidir. Deserialization ise bunun tersidir: gelen veri yeniden nesnelere dönüştürülür. Bu işlem, gelen verinin güvenilir olduğu varsayılarak yapılırsa ciddi bir risk doğar. Saldırgan, sıradan bir veri yerine sunucunun beklemediği yapıda, özel olarak hazırlanmış bir içerik gönderir; sunucu bu içeriği çözerken saldırganın istediği nesneleri oluşturur ve sonunda saldırganın belirlediği kodu çalıştırır.
React2Shell'de sorun, RSC sunucu paketlerinin Flight formatındaki istekleri çözerken yeterli doğrulama yapmamasından kaynaklanıyordu. Kamuya açık teknik analizlere göre saldırganın tek bir özel hazırlanmış HTTP isteği göndermesi yeterliydi; oturum açmasına, bir hesaba sahip olmasına veya kullanıcıyla etkileşime girmesine gerek yoktu. Üstelik uygulamanın kendisi hiçbir Server Action tanımlamamış olsa bile, RSC desteğinin açık olması bazı yapılandırmalarda saldırı yüzeyi oluşturmak için yeterliydi. Bu üç özelliğin bir araya gelmesi, yani kimlik doğrulamasız erişim, düşük saldırı karmaşıklığı ve doğrudan kod çalıştırma, açığın 10 üzerinden 10 puan almasının nedenidir.
Uzaktan kod çalıştırma (RCE), saldırganın sunucunuzda sizin uygulamanızın yetkileriyle istediği komutu çalıştırabilmesi demektir. Uygulamanın okuyabildiği her dosya, ortam değişkeni ve veritabanı bağlantısı saldırganın da erişimine açılır.
React2Shell kimleri etkiler?
Açık, React 19 sürüm hattındaki RSC sunucu paketlerini etkiler. Resmî duyuruya göre etkilenen paketler şunlardır:
- react-server-dom-webpack
- react-server-dom-parcel
- react-server-dom-turbopack
Duyuruda 19.0, 19.1 ve 19.2 sürüm hatlarındaki belirli sürümler etkilenen sürümler olarak listelendi. Bu paketleri doğrudan siz kurmamış olabilirsiniz; çoğu projede bunlar kullanılan çatı tarafından dolaylı bağımlılık olarak getirilir. Bu nedenle aşağıdaki tablo, sık karşılaşılan senaryolar için bir ilk değerlendirme sunar:
| Proje türü | Etkilenme durumu |
|---|---|
| Next.js 15 veya 16, App Router kullanan | Yamalı sürüme yükseltilmediyse etkilenir. En kritik grup budur. |
| Next.js, yalnızca Pages Router kullanan | Resmî duyuruya göre etkilenmez, yine de Next.js'i güncel tutmak önerilir. |
| Next.js 14 kararlı sürümler | Kararlı 14.x sürümleri listede yer almadı; bazı deneysel (canary) sürümler için ayrı uyarı vardı. |
| React Router, Waku, Vite veya Parcel RSC eklentisi kullanan | RSC paketlerinin sürümüne bağlıdır, mutlaka kontrol edilmelidir. |
| Sunucu bileşeni olmayan klasik React uygulaması (tarayıcıda çalışan tek sayfa uygulama) | RSC sunucu paketi kullanmıyorsa bu açıktan etkilenmez. |
| React 18 ve öncesi | Etkilenen paketler bu sürümlerde kullanılmadığı için kapsam dışıdır. |
Tablodaki değerlendirme genel bir yol göstericidir. Kesin sonuç için projenin kilit dosyasındaki gerçek paket sürümlerine bakmak gerekir.
Projemin etkilenip etkilenmediğini nasıl kontrol ederim?
Kontrolü yazılım ekibiniz veya projeyi geliştiren firma birkaç dakika içinde yapabilir. Önerilen sıra şöyledir:
- Kilit dosyasını inceleyin: package-lock.json, yarn.lock, pnpm-lock.yaml veya bun.lock dosyasında react-server-dom ile başlayan paketleri ve next paketinin sürümünü arayın. package.json dosyasındaki sürüm aralığı yanıltıcı olabilir; sunucuya gerçekte kurulan sürüm kilit dosyasında yazar.
- Bağımlılık ağacını sorgulayın: Paket yöneticisinin "bu paket neden kurulu" sorgusu (npm için npm ls, pnpm ve yarn için why komutları) ile RSC paketlerinin hangi bağımlılık üzerinden geldiğini görün.
- Güvenlik denetimi çalıştırın: npm audit veya kullandığınız paket yöneticisinin denetim komutu, bilinen açıkları listeler. Bu araçlar yardımcıdır ancak tek başına yeterli kabul edilmemelidir.
- Canlı sunucudaki sürümü teyit edin: Geliştirme bilgisayarındaki sürüm ile sunucuda çalışan derlemenin sürümü farklı olabilir. Özellikle elle dağıtım yapılan projelerde sunucudaki node_modules klasörü veya konteyner imajı ayrıca kontrol edilmelidir.
- Tüm ortamları listeleyin: Test, hazırlık (staging) ve unutulmuş eski kurulumlar da internete açıksa aynı risk geçerlidir. Saldırganlar en çok bu unutulmuş ortamları bulur.
React2Shell için hangi sürüme güncellemek gerekir?
React ekibi ilk düzeltmeleri her sürüm hattı için ayrı yama sürümleriyle yayımladı (19.0.1, 19.1.2 ve 19.2.1). Next.js tarafında da desteklenen her ana sürüm hattı için yamalı sürümler çıkarıldı. Ancak sonraki haftalarda aynı bileşenlerde hizmet dışı bırakma (DoS) ve kaynak kodu ifşası gibi ek açıklar duyuruldu ve bunlar için de yeni yamalar yayımlandı. Bu nedenle hedefiniz ilk yama değil, kullandığınız sürüm hattının en güncel yama sürümü olmalıdır.
Kesin sürüm numaraları için her zaman react.dev blogundaki güvenlik duyurularını ve nextjs.org üzerindeki güvenlik bültenlerini esas alın. Kullandığınız çatının (React Router, Waku vb.) kendi duyurularını da kontrol edin. Güncelleme sonrasında kilit dosyasının yeniden oluşturulduğundan, projenin yeniden derlendiğinden ve yeni derlemenin gerçekten canlıya alındığından emin olun. Sık yapılan bir hata, package.json dosyasını güncelleyip eski derlemeyi çalıştırmaya devam etmektir.
Yama yaptım, iş bitti mi?
Hayır. Yama, açığın bundan sonra kullanılmasını engeller; ancak duyuru ile yama arasındaki sürede sunucunuza erişilmiş olabilir. Özellikle internete açık ve yamayı birkaç gün geciktirmiş projelerde, sunucunun ele geçirilmiş olabileceği varsayımıyla hareket etmek gerekir. Yama sonrası kontrol listesi şu şekildedir:
Sırları ve anahtarları yenileyin
Uzaktan kod çalıştırma açıklarında saldırganların ilk hedefi ortam değişkenleridir. Veritabanı şifreleri, API anahtarları, ödeme sağlayıcısı anahtarları, e-posta (SMTP) şifreleri, bulut sağlayıcısı erişim anahtarları ve oturum imzalama anahtarları genellikle .env dosyasında veya ortam değişkenlerinde durur. Açık bir dönem boyunca yamasız kaldıysanız bu sırların tamamını yenileyin ve eski değerleri iptal edin. Yenileme sırasında sırları kod deposundan ve web kök dizininden tamamen çıkarmak için de iyi bir fırsat doğar.
Sunucu loglarını inceleyin
Web sunucusu, ters vekil sunucu (reverse proxy) ve uygulama loglarında şu işaretlere bakın:
- Normalde form veya Server Action çağrısı almayan adreslere gelen olağan dışı POST istekleri.
- Next-Action veya RSC başlıklarını içeren, tanımadığınız IP adreslerinden gelen ve hata kodlarıyla sonuçlanan istekler.
- Gövdesi alışılmadık derecede uzun veya bozuk görünen Flight formatlı istekler.
- Aynı IP'den kısa aralıklarla farklı adreslere yapılan sistematik denemeler.
Log saklama süreniz kısa ise eski kayıtlar silinmiş olabilir. Bu durumda sunucu üzerindeki diğer izlere ağırlık verin.
Sunucuda yeni süreç ve dosya arayın
Uygulamanın çalıştığı kullanıcıya ait tanımadığınız süreçler, yüksek işlemci kullanan bilinmeyen programlar (kripto para madenciliği yazılımları sık görülür), zamanlanmış görevlere (cron) eklenmiş yeni satırlar, geçici klasörlerde (/tmp gibi) çalıştırılabilir dosyalar ve SSH yetkili anahtar dosyalarına eklenmiş yabancı anahtarlar kontrol edilmelidir. Sunucudan dışarıya doğru açılmış beklenmedik ağ bağlantıları da önemli bir işarettir.
Şüphe varsa temiz kurulum yapın
Ele geçirildiğine dair güçlü bir işaret bulduysanız sunucuyu temizlemeye çalışmak yerine, güvenilir bir kaynaktan yeni bir sunucu veya konteyner kurup yamalı uygulamayı oraya taşımak daha güvenlidir. Kişisel veri işleyen bir sistemde ihlal şüphesi doğduysa 6698 sayılı Kanun kapsamındaki bildirim yükümlülükleri de gündeme gelebilir; bu konuda güncel mevzuatı ve hukuk danışmanınızın görüşünü esas alın.
Otomatik tarayıcılar sunucunuzu ne kadar sürede bulur?
Kritik bir açık kamuoyuna duyurulduğunda, otomatik tarama botları çoğu zaman saatler içinde internetteki sunucuları denemeye başlar. Bu botlar hedef seçmez; IP aralıklarını ve alan adlarını sırayla tarar, açığa sahip olabilecek her sunucuya aynı istekleri gönderir. Kendi sunucu loglarımızda da bu tür dalgaları düzenli olarak görüyoruz. Tipik örüntüler şunlardır:
- Ortam değişkenlerini içeren dosyaları okumaya yönelik /.env, /.env.local, /.env.production gibi adres denemeleri.
- RSC geliştirme araçlarına ait, normalde yalnızca geliştirme ortamında bulunması gereken uç noktalara yönelik istekler. Örneğin /__vite_rsc_findSourceMapURL adresine, filename parametresi olarak file:///proc/self/environ değeri verilerek sunucu sürecinin ortam değişkenleri okunmaya çalışılır.
- Next.js uygulamalarının bilinen yollarına Next-Action başlığıyla gönderilen ve gövdesinde bozuk Flight verisi bulunan POST istekleri.
Bu örüntüler iki önemli dersi hatırlatır. Birincisi, "sitemiz küçük, kimse bizi hedeflemez" düşüncesi geçerli değildir; botlar herkesi tarar. İkincisi, geliştirme modunda çalışan bir sunucunun internete açık bırakılması, yamalı bir üretim derlemesine göre çok daha geniş bir saldırı yüzeyi sunar. Üretim ortamında yalnızca üretim derlemesi çalışmalıdır.
WAF geçici bir çözüm olabilir mi?
Web uygulama güvenlik duvarı (WAF), uygulamaya ulaşmadan önce istekleri inceleyen bir katmandır. React2Shell duyurusunun ardından büyük CDN ve barındırma sağlayıcıları, bilinen saldırı kalıplarını engelleyen kurallar yayımladı. Bu kurallar, yamayı uygulayana kadar geçen sürede riski azaltmak için değerlidir.
Ancak WAF'ı kalıcı bir çözüm olarak görmemek gerekir. Kurallar bilinen saldırı biçimlerine göre yazılır; saldırganlar ise isteği farklı biçimlerde kodlayarak bu kuralları atlatmanın yollarını arar. Doğru yaklaşım, WAF'ı yamaya kadar zaman kazandıran ve sonrasında ek bir savunma katmanı olarak çalışan bir araç olarak konumlandırmaktır. Kalıcı çözüm her zaman yamalı sürümdür.
Benzer açıklara karşı nasıl hazırlıklı olunur?
React2Shell ne ilk ne de son kritik açık olacak. Aynı hafta içinde PHP, Java veya başka bir ekosistemde de benzer bir duyuru çıkabilir. Hazırlıklı olmak için süreç tarafında şu alışkanlıkları kurmak gerekir:
| Alan | Önerilen uygulama |
|---|---|
| Envanter | Hangi projede hangi çatı ve sürüm kullanıldığını, hangi sunucuda çalıştığını gösteren güncel bir liste tutun. |
| Bağımlılık takibi | Kilit dosyalarını depoda saklayın, otomatik bağımlılık güncelleme ve açık uyarısı araçlarını etkinleştirin. |
| Hızlı dağıtım | Bir yamanın test edilip birkaç saat içinde canlıya alınabildiği bir dağıtım hattı kurun. |
| Sır yönetimi | Sırları kod deposunda tutmayın, düzenli aralıklarla yenileyin ve kimin hangi sırra eriştiğini bilin. |
| En az yetki | Uygulamayı yönetici yetkisiyle değil, yalnızca ihtiyaç duyduğu dosyalara erişebilen bir kullanıcıyla çalıştırın. |
| Log ve izleme | Logları sunucu dışında, yeterli süre saklayın ve olağan dışı trafik için uyarı tanımlayın. |
| Bakım sözleşmesi | Projeyi geliştiren ekiple güvenlik güncellemelerinin kimin sorumluluğunda olduğunu yazılı olarak netleştirin. |
Son madde çoğu zaman gözden kaçar. Proje teslim edildikten sonra bakım anlaşması yapılmamışsa, kritik bir açık duyurulduğunda kimin harekete geçeceği belirsiz kalır. Kaynak kodun ve sunucu erişimlerinin kimde olduğu da bu noktada önem kazanır. Bakım ve destek kalemlerinin bir yazılım projesinin toplam maliyetine nasıl yansıdığını yazılım projesi maliyeti nasıl belirlenir yazımızda ele aldık.
Sık yapılan hatalar
- Yalnızca package.json dosyasını güncellemek: Kilit dosyası yenilenmeden ve proje yeniden derlenmeden canlıdaki sürüm değişmez.
- Test ortamlarını unutmak: İnternete açık eski bir hazırlık ortamı, ana siteden daha kolay bir giriş kapısıdır.
- Sırları yenilememek: Yama sonrası eski anahtarlarla devam etmek, sızmış olabilecek bilgileri geçerli bırakmak demektir.
- WAF'a güvenip yamayı ertelemek: Güvenlik duvarı kuralları atlatılabilir, yamanın yerini tutmaz.
- Geliştirme sunucusunu üretimde çalıştırmak: Geliştirme modundaki uç noktalar, botların özellikle aradığı hedeflerdir.
Sonuç
React2Shell, modern web çatılarının sunduğu kolaylıkların arka planda karmaşık bir sunucu iletişimine dayandığını ve bu iletişimdeki tek bir doğrulama hatasının sunucunun tamamını tehlikeye atabileceğini gösterdi. Etkilenen bir proje yönetiyorsanız sırasıyla sürümü kontrol edin, en güncel yamaya geçin, sırları yenileyin ve logları inceleyin. React ve Next.js tabanlı projelerin güvenli mimariyle geliştirilmesi ve bakımı için özel yazılım geliştirme, kurumsal siteler için ise web tasarım hizmetimizi inceleyebilirsiniz. Mevcut projenizin güvenlik durumunu birlikte değerlendirmek isterseniz bizimle iletişime geçin.
Sık sorulan sorular
React2Shell açığı Next.js Pages Router kullanan siteleri etkiler mi?
Resmî duyurulara göre açık, React Server Components altyapısıyla ilgilidir ve Next.js'te App Router kullanan projeleri etkiler. Yalnızca Pages Router kullanan projeler bu açıktan etkilenmez; yine de Next.js'i desteklenen en güncel yama sürümünde tutmak önerilir.
React 18 kullanan bir proje React2Shell'den etkilenir mi?
Etkilenen paketler React 19 sürüm hattındaki React Server Components sunucu paketleridir. React 18 ve öncesini kullanan, RSC sunucu paketi barındırmayan projeler bu açığın kapsamı dışındadır. Kesin değerlendirme için kilit dosyasındaki paket sürümlerini kontrol edin.
Yama yükledikten sonra şifreleri değiştirmek gerekli mi?
Proje açık duyurulduktan sonra bir süre yamasız kaldıysa evet. Uzaktan kod çalıştırma açıklarında saldırganlar öncelikle ortam değişkenlerindeki veritabanı şifrelerini ve API anahtarlarını hedefler; bu nedenle tüm sırların yenilenmesi ve eski değerlerin iptal edilmesi gerekir.
WAF kullanıyorsam güncelleme yapmasam olur mu?
Hayır. WAF kuralları bilinen saldırı kalıplarını engeller ancak farklı biçimde kodlanmış isteklerle atlatılabilir. WAF yalnızca yamaya kadar zaman kazandıran ek bir katmandır; kalıcı çözüm etkilenen paketleri yamalı sürüme yükseltmektir.
Sunucumun ele geçirilip geçirilmediğini nasıl anlarım?
Loglarda olağan dışı POST istekleri, sunucuda tanımadığınız süreçler, zamanlanmış görevlere eklenmiş yeni satırlar, geçici klasörlerdeki çalıştırılabilir dosyalar ve beklenmedik dış bağlantılar başlıca işaretlerdir. Güçlü bir şüphe varsa sunucuyu temizlemek yerine temiz bir kurulum yapmak daha güvenlidir.
