Poznaj swoją podatność – XSS w Liferay
Cross Site Scripting, określany w skrócie jako XSS, to podatność prawie tak stara jak sam Web Dev. Wydawać by się mogło, że skoro już tyle istnieje to będzie pojawiać się coraz rzadziej? Cóż – jak mawia klasyk – nic bardziej mylnego.
OWASP Top 10 to lista dziesięciu najpopularniejszych zagrożeń dla bezpieczeństwa aplikacji webowych, opracowywana przez Open Web Application Security Project. Jest to zasób edukacyjny, który pomaga organizacjom w identyfikacji i zapobieganiu najczęstszym błędom związanym z bezpieczeństwem aplikacji. Co się jednak stanie, jeśli zajrzymy na listę topowych podatności z lat 2013, 2017 i 2021 dla aplikacji internetowych(choć przytaczana wersja grafiki w tym przypadku skupiona jest na nieco innym aspekcie)?
Skupiając się tylko na XSS, można zauważyć, że w listach z 2013 i 2017 roku (i wcześniejszych) podatność znajdowała się odpowiednio na 3. i 7. miejscu. W 2021 roku po prostu scalono ją z innymi podatnościami polegającymi na wstrzyknięciu kodu. Czy zatem oznacza to, że problem został rozwiązany? Tyle lat wałkowania tematu przecież na pewno nie poszło na marne?
Jak wygląda podatność XSS i do czego można ją wykorzystać?
Wyobraźmy sobie stronę internetową z formularzem, w którym użytkownicy mogą wpisać swoje imiona. Po zatwierdzeniu formularza, imiona są wyświetlane na liście na stronie.
Jeśli aplikacja nie escapuje lub nie sanityzuje poprawnie danych wejściowych, atakujący może wpisać kod JavaScript zamiast imienia. Kod ten zostanie następnie wykonany w przeglądarce każdego użytkownika, który wyświetli listę.
Przykład złośliwego kodu:
<script>
alert("Cześć z XSSI!");
// Możliwe jest też wykonanie innych akcji, np.:
// - Kradzież ciasteczek
// - Przejęcie konta
// - Przekierowanie na złośliwą stronę
</script>
Po zatwierdzeniu formularza przez atakującego, każdy użytkownik, który wyświetli listę, zobaczy wyskakujące okienko z alertem “Cześć z XSSI!”.
- To tylko prosty przykład. Kod JavaScript można użyć do wykonywania znacznie bardziej szkodliwych akcji, takich jak:
- Kradzież ciasteczek użytkowników, co może umożliwić atakującemu zalogowanie się na ich konta.
- Przejęcie kontroli nad kontami użytkowników.
- Przekierowanie użytkowników na złośliwe strony internetowe, które mogą zawierać malware lub phishingowe formularze logowania.
Podatność XSS może mieć poważne konsekwencje dla użytkowników i właścicieli stron internetowych. Ważne jest, aby stosować odpowiednie środki ostrożności w celu ochrony przed tego typu atakami.
XSS w Liferay
Czy podatność, o której wiemy od lat i znamy skuteczne sposoby ochrony przed nią, wciąż żyje?
Niestety tak… A najlepszym przykładem jest spora paczka nowych podatności odkrytych w popularnym rozwiązaniu Liferay. To platforma typu open source do tworzenia serwisów internetowych i aplikacji webowych. Napisana w języku Java, oferuje szeroki zakres funkcji, takich jak zarządzanie treścią, tworzenie stron, integracja z systemami zewnętrznymi i workflow. Skalowalność Liferaya czyni go popularnym wyborem dla firm i organizacji potrzebujących platformy do tworzenia złożonych i wymagających aplikacji webowych.
Właśnie w składnikach Liferaya kilka tygodni temu odkryto i zgłoszono całkiem pokaźną liczbę podatności (lista zawiera tylko te o wartości CVSS powyżej 9.0).
- CVE-2024-26269 w com.liferay:com.liferay.frontend.js.web (wersje [,5.0.52))
- CVE-2024-25152 w com.liferay:com.liferay.users.admin.web (wersje [,6.0.20))
- CVE-2024-25601 w com.liferay:com.liferay.expando.taglib (wersje [,5.0.8))
- CVE-2023-40191 w com.liferay:com.liferay.configuration.admin.web (wersje [,5.0.75))
- CVE-2023-40191 w com.liferay:com.liferay.account.service (wersje [,2.0.110))
- CVE-2023-42496 w com.liferay:com.liferay.frontend.taglib.clay (wersje [,13.13.1))
- CVE-2023-42498 w com.liferay:com.liferay.portal.language.override.web (wersje [,1.0.37))
- CVE-2024-25147 w com.liferay.portal:com.liferay.portal.impl (wersje [,7.8.0))
- CVE-2024-26266 w com.liferay:com.liferay.announcements.web (wersje [,6.0.20))
- CVE-2023-47795 w com.liferay:com.liferay.document.library.web (wersje [,6.0.20))
- CVE-2024-25602 w com.liferay:com.liferay.users.admin.web (wersje [,6.0.20))
Całkiem pokaźna lista, prawda? Założenie, że XSS jest martwe lub, że przy dzisiejszym procesie testowania oprogramowania wystąpienie tego typu zagrożenia jest nieprawdopodobne, nie ma nic wspólnego z rzeczywistością. Może w takim razie odkryte w popularnej platformie Liferay podatności XSS wymagają przygotowania wyrafinowanego payloadu?
CVE-2024-26266 – exploitacja i poprawka
Odkryto podatność typu Stored XSS, która umożliwia zdalnym uwierzytelnionym użytkownikom wstrzykiwanie dowolnego skryptu lub kodu HTML. Atak jest przeprowadzany poprzez wprowadzenie odpowiednio spreparowanych danych w pole imienia, drugiego imienia lub nazwiska użytkownika tworzącego wpis w widżecie (1) Ogłoszenia lub (2) Alertów.
Commit w repozytorium na GItHub, który usuwa ten konkretny błąd to: Commit7a2ae77
Sama poprawka również nie jest szczególnie skomplikowana. Jej celem jest uniemożliwienie wykonania zapisanego w bazie danych kodu. Czy jest to jednak najlepsze możliwe rozwiązanie?
Atak z wykorzystaniem podatności typu XSS Stored (persistent) składa się z dwóch kroków:
- Zapisanie w bazie danych lub innej przestrzeni złośliwego kodu (payloadu).
- Wyświetlenie i wykonanie tego kodu w kontekście przeglądarki ofiary.
W zaprezentowanym powyżej commitcie uniemożliwiono realizację drugiego kroku. Niezależnie od tego, co system pobiera z bazy danych, zostanie to wyświetlone użytkownikowi bez wykonania.
Istnieje jednak lepsze rozwiązanie: skoncentrowanie się na uniemożliwieniu wstrzykiwania (punkt 1) kodu i zapisywania go w bazie danych.
Co robić?
Przede wszystkim, gdy korzystasz z Liferay – zaktualizuj! Również, jeśli chcesz chronić się przed atakami polegającymi na wstrzyknięciu kodu, a w szczególności przed XSS, stosuj dwie warstwy ochrony:
Weryfikuj dane wejściowe. Czy na pewno uzasadnione jest wpuszczenie pola o wartości <script>Jacek
i zapisanie go w kolumnie “Imię”? Nie wpuszczaj niepoprawnych danych do aplikacji.
Dane dynamiczne wyświetlaj na froncie po ich wcześniejszym “escapowaniu” lub poprawnej sanityzacji. Wiele frameworków udostępnia domyślnie funkcjonalności realizujące tego typu zadania, korzystaj z nich!