CVE-2023-34034 Spring WebFlux Açığı Nedir ?

a3b2jeo.png

logo.png


CVE-2023-34034 Spring WebFlux Açığı Nedir ?
Spring Framework, kurumsal düzeyde Java uygulamalarının geliştirilmesi için altyapı desteği sağlayan, yaygın olarak kullanılan Java tabanlı bir uygulama çerçevesidir.

Spring Security , güçlü bir kimlik doğrulama ve erişim kontrol çerçevesidir ve Spring tabanlı uygulamaların güvenliğini sağlamada bir endüstri standardıdır. Hem kimlik doğrulama hem de yetkilendirme sağlar ve özel gereksinimleri karşılayacak şekilde kolayca genişletilebilir.

Spring WebFlux, Spring 5'te geleneksel Spring Web MVC çerçevesine reaktif programlama alternatifi olarak tanıtıldı .

Spring WebFlux, özünde eşzamansız, engellemeyen ve reaktif programlama paradigmalarını işlemek için tasarlanmıştır. Geliştiricilerin ölçeklenebilir, duyarlı ve dayanıklı uygulamalar oluşturmasına olanak tanıyan reaktif bir programlama modeli sağlar. WebFlux, geleneksel istek başına iş parçacığı yaklaşımını kullanmak yerine, az sayıda iş parçacığıyla aynı anda birden çok isteğin işlenmesini sağlayan reaktif akışlar API'sinden yararlanır.

Güvenlik Açığını İnceleyelim

Dosyadaki değişiklikler web/src/main/java/org/springframework/security/web/server/util/matcher/PathPatternParserServerWebExchangeMatcher.java ilginç görünüyor:

1111.png


Yan yana farka baktığımızda, düzeltmeden önce, sınıfın sınıfta uygulanan yöntemi PathPatternParserServerWebExchangeMatcher kullandığını görebiliriz .parse()PathPatternParser

Düzeltme taahhüdü , sınıfın kendisinde uygulanan ve with yöntemini genişleten yeni bir parse () işlev sunar .PathPatternParserServerWebExchangeMatcherparse()PathPatternParserinitFullPathPattern()

Kaynak koduna baktığımızda, yardımcı fonksiyonun bir dizgenin başına eğik çizgi eklediğini görebiliriz, ancak zaten mevcut değilse.
Kod:
/**
* Prepare the given pattern for use in matching to full URL paths.
* By default, prepend a leading slash if needed for non-empty patterns.
* @param pattern the pattern to initialize
* @return the updated pattern
* @since 5.2.25
*/
public String initFullPathPattern(String pattern) {
    return (StringUtils.hasLength(pattern) && !pattern.startsWith("/") ? "/" + pattern : pattern);
}

Commitment daha fazla bakmak, yeni tanıtılan testle sunulduğunda bu değerlendirmeyi doğrular:
Kod:
class PathPatternParserServerWebExchangeMatcherTests {

    @Test
    void matchesWhenConfiguredWithNoTrailingSlashAndPathContainsSlashThenMatches() {
        PathPatternParserServerWebExchangeMatcher matcher = new PathPatternParserServerWebExchangeMatcher("user/**");
        MockServerHttpRequest request = MockServerHttpRequest.get("/user/test").build();
assertThat(matcher.matches(MockServerWebExchange.from(request)).block().isMatch()).isTrue();
    }
}

Test, yol için bir ayrıştırıcı oluşturur user/** ve yol ile eşleşip eşleşmediğini kontrol eder /user/test. Bu işlemede öne çıkan eğik çizgi eklenmeseydi, yollar eşleşmezdi. initFullPathPattern() eşleştiğinden emin olur.

Tüm bunların bir
**yolla nasıl bir ilişkisi var?

Aşağıdaki özel filtre içerir **. Diyelim ki sitenizdeki yönetici sayfaları dışındaki tüm sayfaları erişilebilir hale getirmek istediniz, aşağıdaki kuralı koymuş olabilirsiniz:

Kod:
    .authorizeExchange()
    .pathMatchers("admin/**")
    .hasRole(Roles.ADMIN)
               
    .and()
    .authorizeExchange()
    .anyExchange()
    .permitAll();

Artık altındaki her sayfaya admin/yalnızca yöneticiler tarafından erişilebileceğini düşünelebilir.

admin/Düzeltmeden önce, önünde / işareti eksik olduğundan ve altındaki tüm web sayfalarına admin/herkes erişebileceğinden , bu kural herhangi bir URL ile eşleşmiyordu .



Proof-of-Concept

Kullanıcı ve Yönetici rollerini içeren ve Spring Security'nin savunmasız bir sürümünü kullanan basit bir Spring WebFlux uygulaması oluşturduk.

Bu uygulamada, bir oturum açma sayfası ve bir yönetici uç noktası vardır.

Kurallar şu şekilde belirlenir:

Kod:
http
    // disable CSRF
    .csrf().disable()

    // add AuthenticationWebFilter and set the handler
    .formLogin()
    .authenticationSuccessHandler(new WebFilterChainServerAuthenticationSuccessHandler())
    .authenticationFailureHandler(((webFilterExchange, exception) -> Mono.error(exception)))

               
    .and()
    .authorizeExchange()
    .pathMatchers("admin/**")
    .hasRole(Roles.ADMIN)
               
    .and()
    .authorizeExchange()
    .anyExchange()
    .permitAll();

return http.build();

.anyExchange().permitAll() tarafından talimat verilen yönetici sayfaları dışında tüm sayfaların erişilebilir olmasına izin verir .pathMatchers(“admin/**”).hasRole(Roles.ADMIN).

Güvenlik açığı nedeniyle, “admin/**” başında eğik çizgi olmadığı için kural hiçbir URL ile eşleşmez. Örneğin, bir saldırgan , fiilen yönetici olmadan URL'ye serbestçe erişebilir . “/admin/supershell”PoC'miz, bu sayfalara nasıl hala erişilebileceğini gösterir.

Bir saldırgan, bu savunmasız şekilde "güvenli" bir uç noktanın farkındaysa, herhangi bir kimlik doğrulaması olmadan ayrıcalıklı uç noktalara erişmek önemsizdir.

2_A-Simple-Spring-WebFlux-Application.gif

CVE-2023-34034'ten Kimler Etkilenir?

Güvenlik açığı aşağıdaki koşullar altında geçerlidir:

Web uygulaması, Spring WebFlux çerçevesini kullanır (eski bir "Spring MVC" çerçevesini kullanan uygulamalar etkilenmez).
Web uygulaması, Spring Security'nin savunmasız bir sürümünü kullanıyor. Örneğin, 5.6.0.
Web uygulaması, Spring Security erişim kurallarını ayarlamak için URL yolu filtrelemeyi kullanır. URL yolu modeli eğik çizgi karakteriyle ( ) BAŞLAMAZ /. Örneğin, pathMatchers("admin/supershell"). Bu, tek bir sayfayı, bu örnekte sayfayı etkileyecektir admin/supershell.
Ayrıca, URL yolu birden çok bölümlü joker karakter ( ) içeriyorsa, **bu, güvenlik açığının önem derecesini artırır. Örneğin, pathMatchers("admin/**"). Bu, URL yolu altındaki tüm sayfaları, bu örnekte sayfanın altındaki her şeyi etkileyecektir admin.
iyileştirme
Spring Security sürümünüzü aşağıdakilerden birine yükseltmeniz şiddetle tavsiye edilir:


6.1.2+
6.0.5+
5.8.5+
5.7.10+
5.6.12+

Yukarıdakiler, Spring Framework sürümlerini gerektirir:

6.0.11+
5.3.29+
5.2.25+

Alternatif olarak , Spring Security'de kullanılan herhangi bir URL filtresine bir eğik çizgi / ekleyin.

Örneğin, değiştir -


pathMatchers("admin/**")

ile -

pathMatchers("/admin/**")

Kullandığım Kaynaklarım : Frog Ltd Şirketi

a3b2jeo.png















 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.