Giriş
PLENTI, açık kaynak kodlu bir Build-Time Render (BTR) platformu olarak tanımlanabilir. Svelte şablonları ile kullanıcıların zengin web sayfaları tasarlamasını sağlamaktadır.
Analiz
CVE-2024-49380 Zafiyetinin incelenmesi esnasında PLENTI üzerinde bulunan postLocal metodu yardımı ile sunucuya dosya yükleme işlemi yapıldığı görülmüştür.
cmd/serve.go#205

PLENTI uygulaması tarafından “core, content, layouts, media ve static” dizinlerinin takip edildiği ve bu dizinlere yapılan dosya yükleme veya güncelleme işlemleri sonrasında 85 numaralı satırda bulunan Build metodunun çalıştırıldığı görülmektedir.
cmd/serve/watcher.go:watcher#85

cmd/build:Build#62 metodunun içeriği incelendiğinde, kullanıcı tarafından yüklenen dosya içeriğinin derlenmesi, küçültülmesi, paketlenmesi vb. bir çok işlemden geçtiği görülmektedir. Gerçekleştirilen işlemlerden en dikkat çeken ise cmd/build/compile.go:compileSvelte#45 metodu olmuştur. compileSvelte metodu içerisinde svelte dosyaların v8go kütüphanesi yardımıyla dinamik bir şekilde oluşturulduğu görülmektedir.
Bu noktada kullanıcı tarafından iki farklı parametre kullanımı ile dinamik olarak sayfa içeriklerinin oluşturulduğu görülmektedir. compileSvelte metodu daha detaylı incelendiğinde, kullancı tarafından parametre olarak dosya yolu bilgisinin layouthPath parametresi içerisine aktarıldığı görülmektedir. cmd/build/compile.go:compileSvelte#105 numaralı satırda ise kullanıcıdan alınan layouthPath değerinin içerdiği / ve . karakterlerinin _ karakteri ile değiştirilmesi sonucunda elde edilen değerin ssrStr parametresi içerisine direkt olarak eklendiği görülmektedir.

ssrStr parametresinin son olarak cmd/build/compile.go:compileSvelte#230 numaralı satırda bulunan RunScript metoduna aktarıldığı görülmektedir.

ssrStr parametre içeriğini konsol üzerinde gösterecek ufak bir kod parçasını uygulamaya ekledikten sonra aşağıdaki istek gönderilmiştir.
POST /postlocal HTTP/1.1
Host: localhost:3000
Content-Length: 124
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.140 Safari/537.36
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
[
{
"action":"create",
"encoding":"text",
"file":"layouts/global/test; eval(`while(1)`);var test.svelte",
"contents":"anethole"
}
]
İstek sonrasında parametre olarak verilen file değerinin sistem tarafından javascript kod bloğu içerisine eklendiği görülmektedir.

Gönderilen kod bloğu ile başlatılan while döngüsünün çalıştırıldığı ve uygulamanın kullanıcılara cevap veremez hale geldiği görülmektedir.

v8go kütüphanesi v8 projesini referans alarak geliştirilmiş olup güvenlik amaçlı bir çok sıkılaştırmaya sahiptir. Bu nedenle dış dünyadan kütüphane ekleme, sistem üzerinde komut çalıştırma gibi metotlara sahip değildir. Fakat mevcut Plenti uygulamasında V8GO kütüphanesi tarafından V8 moturunun 11.1.278 versiyonu kullanıldığı ve bu versiyona ait sandbox atlatılmasına olanak sağlayan bir zafiyet bulunduğu görülmektedir CVE-2024-5830.





