CVE-2024-38816 to nowa, poważna podatność w Spring Framework, która dotyczy aplikacji wykorzystujących Spring WebMvc.fn oraz Spring WebFlux.fn do obsługi zasobów statycznych. Luka ta umożliwia przeprowadzenie ataku typu Path Traversal, co może prowadzić do nieautoryzowanego dostępu do poufnych plików na serwerze. Jeśli korzystasz z funkcjonalnego routingu w tych modułach, istnieje ryzyko, że atakujący może manipulować ścieżkami do plików, aby uzyskać dostęp do danych poza katalogami, do których powinna mieć dostęp aplikacja.

Jakich pakietów dotyczy podatność?

Podatność CVE-2024-38816 dotyczy dwóch głównych pakietów Spring Framework:

  • org.springframework:spring-webmvc– we wszystkich wersjach wcześniejszych niż 6.1.13.
  • org.springframework:spring-webflux – we wszystkich wersjach wcześniejszych niż 6.1.13.

Te pakiety odpowiadają za obsługę żądań HTTP i są szeroko stosowane w aplikacjach webowych. Spring WebFlux jest wykorzystywany do tworzenia reaktywnych aplikacji, natomiast Spring WebMvc jest popularnym wyborem w aplikacjach opartych na tradycyjnym modelu MVC.

Na czym polega CVE-2024-38816?

Podatność umożliwia atakującym manipulowanie ścieżkami plików poprzez wprowadzenie sekwencji takich jak ../. W efekcie aplikacja może ujawnić pliki znajdujące się poza przewidzianym katalogiem aplikacji, co pozwala na nieautoryzowany dostęp do poufnych zasobów.

Skutki ataku:

  • Nieautoryzowany dostęp: Atakujący może uzyskać dostęp do plików systemowych, takich jak konfiguracje aplikacji.
  • Ujawnienie danych: Pliki te mogą zawierać poufne informacje, takie jak hasła do baz danych czy klucze API.
  • Dalsze ataki: Uzyskane informacje mogą posłużyć do przeprowadzenia kolejnych ataków.

Do czego wykorzystywany jest RoutingFunction?

RoutingFunction to interfejs dostępny w module Spring WebFlux, który umożliwia funkcjonalne definiowanie tras (routingu) w aplikacji. Jest szeroko stosowany w aplikacjach wymagających wysokiej wydajności i skalowalności, pozwalając na dynamiczne przetwarzanie żądań HTTP. Dzięki RoutingFunction można definiować bardziej elastyczne trasy, które akceptują parametry od użytkowników, co stwarza dodatkowe ryzyko, jeśli nie są odpowiednio walidowane.

Przykład użycia:

@Bean
public RouterFunction<ServerResponse> route() {
return RouterFunctions.route()
.GET("/files/{filename}", this::serveFile)
.build();
}

public Mono<ServerResponse> serveFile(ServerRequest request) {
String filename = request.pathVariable("filename");
// Kod odpowiedzialny za zwrócenie zawartości pliku
}

W powyższym przykładzie aplikacja obsługuje żądania GET pod ścieżką /files/{filename}, gdzie {filename} jest nazwą pliku podaną przez użytkownika. Brak odpowiedniej walidacji nazw plików może prowadzić do ataku typu Path Traversal.

Czy Twoja aplikacja jest zagrożona?

Podatność dotyczy aplikacji, które:

  • Używają RoutingFunction do definiowania tras HTTP w spring-webflux lub spring-webmvc.
  • Akceptują parametry ścieżki od użytkowników bez odpowiedniej walidacji.
  • Korzystają z pakietów spring-webflux lub spring-webmvc w wersjach wcześniejszych niż 6.1.13.

Aby podatność mogła być wykorzystana, aplikacja musi spełniać określone warunki:

  1. Używanie funkcji WebMvc.fn lub WebFlux.fn: Jeśli korzystasz z funkcji routingu fn do obsługi żądań HTTP i serwowania zasobów, podatność może być aktywna.
  2. Brak odpowiedniej walidacji ścieżek: Jeśli aplikacja nie waliduje i nie normalizuje odpowiednio ścieżek plików dostarczanych przez użytkownika, atakujący może manipulować ścieżkami, dodając sekwencje takie jak ../, aby uzyskać dostęp do plików spoza katalogu aplikacji.

Jeśli Twoja aplikacja korzysta z klasycznych kontrolerów (@Controller lub @RestController) do obsługi żądań i jest zabezpieczona przez Spring Security, podatność nie jest możliwa do wykorzystania. Dodatkowo, jeśli aplikacja nie obsługuje dynamicznego ładowania plików na podstawie danych użytkownika, ryzyko wystąpienia ataku jest znacznie zredukowane.

Jak sprawdzić, czy jesteś zagrożony?

  1. Przejrzyj zależności: Upewnij się, że używasz wersji Spring Framework 6.1.13 lub nowszej.
  2. Analiza kodu: Przejrzyj aplikację pod kątem wykorzystania RoutingFunction i dynamicznego przetwarzania ścieżek plików.

Poprawka w wersji 6.1.13

Podatność CVE-2024-38816 została załatana w wersji 6.1.13 Spring Framework – https://github.com/spring-projects/spring-framework/commit/d86bf8b2056429edf5494456cffcb2b243331c49. Wprowadzono mechanizmy walidacji i normalizacji ścieżek dostarczanych przez użytkownika, aby zapobiec wykorzystaniu sekwencji typu ../.

Główne zmiany:

  • Dodano walidację ścieżek plików, aby nie można było wyjść poza dozwolony katalog.
  • Zaktualizowano metody obsługi żądań, by ograniczyć dostęp do plików jedynie w ramach przewidzianych katalogów.
  • Dodano testy bezpieczeństwa sprawdzające skuteczność nowej walidacji.

Fragment poprawionego kodu:

String filename = request.pathVariable("filename");
Path file = basePath.resolve(filename).normalize();

if (!file.startsWith(basePath)) {
return ServerResponse.status(HttpStatus.FORBIDDEN).build();
}

Metoda normalize() usuwa niebezpieczne sekwencje, a dodatkowe sprawdzenie zapewnia, że dostępne są tylko zasoby wewnątrz zdefiniowanego katalogu.

Podsumowanie

Podatność CVE-2024-38816 to poważne zagrożenie, które może prowadzić do wycieku poufnych danych. Warto jednak pamiętać, że jeśli Twoja aplikacja eksponuje API za pomocą @Controller lub @RestController i stosuje Spring Security, nie jesteś narażony na te zagrożenie. Niemniej jednak, sugeruję natychmiastową aktualizację do najnowszej wersji Spring Framework oraz wprowadzenie odpowiednich mechanizmów walidacji ścieżek.

Zalecane działania:

  • Zabezpieczenia: Ogranicz dostęp do zasobów aplikacji za pomocą Spring Security i odpowiednich adnotacji.
  • Aktualizacja Spring Framework: Zaktualizuj do wersji 6.1.13 lub nowszej.
  • Przegląd zależności: Sprawdź, czy używasz podatnych wersji pakietów spring-webflux lub spring-webmvc.
  • Implementacja walidacji: Upewnij się, że dane wejściowe od użytkowników są odpowiednio walidowane.
Tags: