CVE-2022-1438: Persistent XSS w Keycloak — User Impersonation
Historia mojego pierwszego CVE — jak podczas rutynowego testu penetracyjnego odkryłem podatność Persistent XSS w Keycloak Admin Console, która trafiła do bazy MITRE i otrzymała oficjalne advisory od Red Hat.
CVE-2022-1438 — Persistent Cross-Site Scripting w Keycloak / Red Hat Single Sign-On
Keycloak to open-source'owy serwer uwierzytelniania i zarządzania tożsamością, rozwijany przez Red Hat. Stanowi podstawę produktu Red Hat Single Sign-On (RH-SSO) i jest wykorzystywany przez tysiące organizacji na całym świecie do zarządzania dostępem użytkowników, federacji tożsamości i Single Sign-On.
Kontekst odkrycia
W grudniu 2021 roku, pracując jako pentester w firmie SISOFT S.C., prowadziłem test penetracyjny dla klienta, którego aplikacja wykorzystywała framework Keycloak 15.0.2 jako centralny system uwierzytelniania. Podczas rutynowego badania panelu administracyjnego zidentyfikowałem podatność typu Persistent XSS w module tworzenia użytkowników Admin Console.
To było moje pierwsze odkrycie, które otrzymało numer CVE — moment, który dla każdego pentestera jest szczególny. Nie dlatego, że podatność była wyjątkowo skomplikowana, ale dlatego, że udowodniła, iż nawet w dojrzałych, szeroko stosowanych projektach open-source, podstawowe błędy walidacji mogą zostać przeoczone.
Szczegóły podatności
| CVE ID | CVE-2022-1438 |
|---|---|
| Typ | CWE-79: Stored Cross-Site Scripting |
| Produkt | Keycloak / Red Hat Single Sign-On (RH-SSO) |
| Testowana wersja | Keycloak 15.0.2 |
| Komponent | Admin Console — User Impersonation |
| CVSS 3.1 (NIST) | 4.8 MEDIUM |
| CVSS 3.1 (Red Hat) | 6.4 MEDIUM |
| Wektor CVSS (NIST) | AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N |
| Wektor CVSS (Red Hat) | AV:N/AC:H/PR:H/UI:R/S:U/C:H/I:H/A:H |
| Poprawka | Red Hat Single Sign-On 7.6.2 (RHSA-2023:1043) |
Analiza techniczna
Przyczyna źródłowa
Pole username w module tworzenia użytkowników Keycloak Admin Console było walidowane wyłącznie po stronie front-endu. Po przechwyceniu żądania HTTP (np. za pomocą Burp Suite) walidacja mogła zostać całkowicie ominięta, co pozwalało na umieszczenie payloadu XSS w nazwie użytkownika.
Encje HTML nie były sanityzowane podczas procesu impersonacji użytkownika — funkcji pozwalającej administratorowi zalogować się jako inny użytkownik w celu diagnostyki. Gdy system wyświetlał komunikat o próbie impersonacji podczas istniejącej sesji, nazwa użytkownika (zawierająca payload) była renderowana bez escapowania.
Kluczowa obserwacja: Walidacja wyłącznie po stronie klienta (front-end) to jeden z najczęstszych antywzorców bezpieczeństwa. Każdy pentester wie, że walidacja client-side jest jedynie wygodą dla użytkownika — nigdy nie stanowi mechanizmu bezpieczeństwa. Dane zawsze muszą być walidowane po stronie serwera.
Payload
Prosty, klasyczny payload XSS wykorzystujący tag <img> z atrybutem onerror. Wystarczył do potwierdzenia podatności — bardziej zaawansowane payloady mogłyby realizować kradzież sesji, modyfikację danych czy lateral movement w ramach panelu administracyjnego.
Proof of Concept — komunikat „You are already authenticated as different user" renderuje payload XSS. Alert wyświetla wartość KEYCLOAK_SESSION, potwierdzając możliwość kradzieży sesji administratora
Kroki reprodukcji
- Utwórz nowego użytkownika w sekcji administracyjnej Keycloak
- Przechwyć żądanie tworzenia użytkownika (np. Burp Suite) i zmodyfikuj pole
username, wstawiając payload XSS - Zaloguj się jako nowo utworzony użytkownik (z payloadem w nazwie)
- Wróć do Admin Console — wybierz innego użytkownika (nie tego z payloadem)
- Zmodyfikuj wybranego użytkownika — np. ustaw nowe hasło jako tymczasowe
- Użyj opcji „Impersonate" na zmodyfikowanym użytkowniku
- Podaj nowe dane logowania po wyświetleniu monitu o uwierzytelnienie
- System wyświetli komunikat: „You are already authenticated as different user '[user + payload]' in this session. Please sign out first."
- Payload JavaScript wykonuje się natychmiastowo
Wpływ (Impact)
Choć podatność wymaga uprawnień administracyjnych do utworzenia użytkownika z payloadem (stąd CVSS na poziomie MEDIUM), jej rzeczywisty wpływ jest istotny w kontekście środowisk wieloadministratorskich i scenariuszy insider threat:
Eskalacja uprawnień
Administrator o ograniczonych uprawnieniach mógłby wykorzystać podatność do przejęcia sesji super-admina podczas impersonacji, uzyskując dostęp do pełnej konfiguracji realm.
Kradzież sesji
Przechwycenie tokenów sesji administratora pozwoliłoby na nieautoryzowany dostęp do panelu zarządzania tożsamością wszystkich użytkowników organizacji.
Szerszy zasięg
Komunikat „You are already authenticated as different user" to nie jedyne miejsce renderujące username — każda strona wyświetlająca nazwę użytkownika bez sanityzacji może być wektorem ataku.
Skala oddziaływania
Keycloak/RH-SSO to centralny system uwierzytelniania — kompromitacja panelu administracyjnego oznacza potencjalny dostęp do wszystkich aplikacji w federacji.
Oś czasu (Disclosure Timeline)
| Data | Zdarzenie |
|---|---|
| 2021-12-04 | Zgłoszenie podatności do [email protected] z pełnym raportem, screenshotami i projektem Burp Suite |
| 2021-12-13 | Utworzenie wpisu w Red Hat Bugzilla (Bug #2031904) |
| 2022 | Przyznanie numeru CVE-2022-1438 przez Red Hat |
| 2023-03-01 | Wydanie poprawki w Red Hat Single Sign-On 7.6.2 (RHSA-2023:1043, 1044, 1045, 1047, 1049) |
| 2023-09-20 | Publikacja CVE-2022-1438 w bazie NVD (NIST) |
Uwaga dotycząca osi czasu: Od zgłoszenia do wydania patcha minęło ponad 14 miesięcy, a pełna publikacja w NVD nastąpiła niemal 2 lata po zgłoszeniu. Tak długie czasy reakcji nie są niestety wyjątkiem w dużych projektach open-source — to kolejny powód, dla którego responsible disclosure wymaga cierpliwości i profesjonalizmu.
Poprawka
Red Hat wydał poprawkę w ramach aktualizacji Red Hat Single Sign-On 7.6.2 (Keycloak 18.0.6), opublikowanej 1 marca 2023 roku. Aktualizacja objęła wiele platform:
- RHSA-2023:1043 — Red Hat Single Sign-On 7.6.2 na RHEL 7
- RHSA-2023:1044 — Red Hat Single Sign-On 7.6.2 na RHEL 8
- RHSA-2023:1045 — Red Hat Single Sign-On 7.6.2 na RHEL 9
- RHSA-2023:1047 — RHEL-8 Middleware Containers
- RHSA-2023:1049 — Red Hat Single Sign-On 7.6.2
Poprawka polegała na dodaniu sanityzacji encji HTML w procesie impersonacji, tak aby nazwy użytkowników były escapowane przed renderowaniem w widokach administracyjnych.
Wnioski i lekcje
CVE-2022-1438 było moim pierwszym oficjalnym CVE i nauczyło mnie kilku cennych lekcji, które do dziś stosuję w codziennej pracy pentestera:
1. Nie pomijaj walidacji server-side
Walidacja front-endowa jest wygodą dla UX, nie mechanizmem bezpieczeństwa. W przypadku Keycloak wystarczyło przechwycić jedno żądanie HTTP, żeby ominąć całą walidację pola username. Każdy formularz, każde pole, każdy endpoint API musi walidować dane po stronie serwera.
2. Testuj wszystkie pola, nie tylko oczywiste
Pole username wydaje się „bezpieczne" — w końcu to nazwa użytkownika, prawda? Ale w systemie, gdzie ta nazwa jest renderowana w wielu kontekstach (listy użytkowników, komunikaty, logi), brak sanityzacji w choćby jednym z nich tworzy wektor ataku.
3. Funkcje administracyjne też wymagają testowania
Istnieje pokusa, żeby pomijać panel administracyjny podczas pentestingu, zakładając że „i tak mają do niego dostęp tylko zaufani użytkownicy". To błąd. Scenariusze insider threat, kompromitacja konta admina czy multi-tenancy wymagają, żeby panele administracyjne były zabezpieczone równie dobrze jak publiczne endpointy.
4. Responsible disclosure wymaga cierpliwości
Od zgłoszenia do patcha minęło 14 miesięcy. Od zgłoszenia do pełnej publikacji w NVD — prawie 2 lata. To standard w dużych projektach. Nie zniechęcaj się brakiem natychmiastowej reakcji — każde zgłoszone CVE to realna poprawa bezpieczeństwa dla tysięcy organizacji.
Kluczowy takeaway: Nawet „proste" podatności XSS w panelach administracyjnych dojrzałych projektów open-source mogą otrzymać numer CVE i oficjalne advisory bezpieczeństwa. Systematyczne testowanie, uwaga do detali i cierpliwość w procesie disclosure to fundamenty pracy pentestera.
Referencje
- NVD: CVE-2022-1438
- Red Hat CVE: access.redhat.com/security/cve/CVE-2022-1438
- Red Hat Bugzilla: Bug #2031904
- Advisory: RHSA-2023:1043
Szukasz podatności w swojej aplikacji?
Profesjonalne testy penetracyjne aplikacji webowych, API i infrastruktury. Identyfikuję podatności zanim zrobią to atakujący — od prostych XSS po złożone chain attacks.
Umów bezpłatną konsultację