CRITICAL🇬🇧 English

CVE-2026-12048

Stored XSS w pgAdmin 4 — wstrzyknięcie HTML przez komunikaty PostgreSQL

CVSS 9.3v4.0pub. 2026-06-19upd. 2026-06-29

Podatność typu stored cross-site scripting (XSS) w pgAdmin 4 umożliwia wstrzyknięcie dowolnego kodu HTML (w tym elementów iframe) do interfejsu pgAdmin poprzez spreparowane komunikaty zwracane przez serwer PostgreSQL. Zagrożenie jest krytyczne, ponieważ atakujący może przejąć sesję ofiary, wykonać przekierowanie do złośliwej strony lub wyświetlić nieodróżnialną od prawdziwej stronę phishingową wewnątrz okna pgAdmin.

Pokaż oryginał (EN)

Stored cross-site scripting in pgAdmin 4's error-rendering and plan-node-rendering paths. Text returned by a PostgreSQL server (ErrorResponse messages, including object names quoted back inside relation-does-not-exist errors and inside EXPLAIN Recheck Cond / Exact Heap Blocks fields) was passed verbatim through html-react-parser at every user-facing sink — the notifier toasts, FormFooterMessage / FormInput help and error areas, FormNote, ModalProvider AlertContent and confirmDelete, ToolErrorView, the Explain visualiser's NodeText panel, the SQL editor confirm dialogs, ConfirmSaveContent, PreferencesHelper modal alerts, and SelectThemes helper text. A PostgreSQL server an attacker controls — or any server returning attacker-influenced text such as a table or column name a low-privilege database user can create — could inject arbitrary HTML (including <iframe>) into the pgAdmin DOM the moment the victim's pgAdmin connected to that server or viewed an Explain plan that referenced the crafted object. The injected iframe's srcdoc could fetch attacker-served JavaScript and, by writing to parent.location, redirect the victim's top-level pgAdmin browser tab to an attacker-controlled URL. Because the injection originates from inside pgAdmin's own interface, standard anti-clickjacking controls (X-Frame-Options, Content-Security-Policy: frame-ancestors) do not mitigate it. A phishing page rendered inside the legitimate pgAdmin window is indistinguishable from a genuine pgAdmin dialog. Fix combines three complementary layers. (1) DOMPurify sanitisation is wrapped around every html-react-parser call site reachable from notifier, alert, form-error, Explain, and SQL-editor flows. (2) A new plain-text rendering contract — SafeMessage / SafeHtmlMessage components plus Notifier.errorText / alertText / warningText / infoText / successText helpers — is introduced; around fifty callers across browser, tools, dashboard, debugger, misc, llm, preferences, schema diff, and the SQL editor that previously interpolated backend-derived strings are migrated to the plain-text variants. (3) Backend HTML-escape is applied at the post-connection-SQL handler (execute_post_connection_sql) via a new sanitize_external_text helper, so third-party JSON consumers (audit logs, API clients) never receive raw markup either; the Explain plan-info renderer is also patched to _.escape Recheck Cond and Exact Heap Blocks at construction (matching every sibling field), giving defence in depth even before DOMPurify runs. This issue affects pgAdmin 4: from 6.0 before 9.16.

🤖 Analiza AI
Jak działa

Tekst zwracany przez serwer PostgreSQL — w tym nazwy obiektów cytowane w komunikatach błędów (np. 'relation does not exist') oraz pola Recheck Cond i Exact Heap Blocks w planach EXPLAIN — był przekazywany bez sanityzacji bezpośrednio do parsera html-react-parser we wszystkich miejscach interfejsu wyświetlających komunikaty (toasty powiadomień, obszary błędów formularzy, modale, widok Explain, okna dialogowe edytora SQL). Atakujący kontrolujący serwer PostgreSQL lub mogący tworzyć tabele i kolumny jako użytkownik o niskich uprawnieniach może umieścić złośliwy HTML w nazwie obiektu. W momencie podłączenia ofiary do takiego serwera lub wyświetlenia planu EXPLAIN odwołującego się do spreparowanego obiektu, wstrzyknięty kod — np. iframe z atrybutem srcdoc ładującym zewnętrzny JavaScript — zostaje wykonany w kontekście DOM pgAdmin i może zmodyfikować lokalizację zakładki przeglądarki na adres kontrolowany przez atakującego. Standardowe mechanizmy ochrony przed clickjackingiem (X-Frame-Options, CSP frame-ancestors) nie niwelują tego zagrożenia, gdyż wstrzyknięcie pochodzi z wnętrza własnego interfejsu pgAdmin.

Skutki

Atakujący może wykonać dowolny JavaScript w kontekście sesji ofiary w pgAdmin, przekierować jej przeglądarkę na złośliwą stronę lub wyświetlić stronę phishingową nieodróżnialną od prawdziwego interfejsu pgAdmin, co może prowadzić do kradzieży poświadczeń i przejęcia konta.

Mitygacja

Należy zaktualizować pgAdmin 4 do wersji 9.16 lub nowszej. Poprawka obejmuje trzy warstwy obrony: (1) sanityzację DOMPurify we wszystkich wywołaniach html-react-parser narażonych na dane zewnętrzne, (2) wprowadzenie komponentów SafeMessage/SafeHtmlMessage oraz pomocników tekstowych wymuszających renderowanie jako czysty tekst, (3) HTML-escape po stronie backendu w handlerze execute_post_connection_sql za pomocą nowej funkcji sanitize_external_text oraz escapowanie pól Recheck Cond i Exact Heap Blocks w rendererze planów EXPLAIN.

Kogo dotyczy

pgAdmin 4 w wersjach od 6.0 do 9.15 (podatność dotyczy wersji od 6.0, poprawka wprowadzona w wersji 9.16)

Uwagi

Szczegóły techniczne poprawki dostępne są w commicie 9e370d3cb67b83b3945f82969c959fad3f926517 w repozytorium pgadmin-org/pgadmin4 na GitHub. Podatność zgłoszona jako issue #10068 w tym samym repozytorium.

CVSS Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
  • Pgadmin 4

    APP
    Pgadmin
    6.0 – 9.16 (bez)
🔵
ZWERYFIKUJ U PRODUCENTA
Brak jednoznacznych danych o patchu. Sprawdź referencje od producenta.
Tagi
XSS
CWE
Referencje

Powiązane podatności

CVE-2026-17566CRITICAL9.4PL ✓ten sam produkt

pgAdmin 4: RCE przez command injection w narzędziu Import/Export Data

CVE-2026-17351CRITICAL9.4PL ✓ten sam produkt

SQL injection bypass w pgAdmin 4 AI Assistant via sqlparse — obejście transakcji READ ONLY

CVE-2026-17349CRITICAL9.3PL ✓ten sam produkt

pgAdmin 4: kradzież poświadczeń przez nieuprawniony klon serwera (adhoc connect)

CVE-2026-12046CRITICAL9.5PL ✓ten sam produkt

pgAdmin 4: brak uwierzytelnienia na endpointach SQL Editor z deserialization RCE

CVE-2026-12045CRITICAL9.4PL ✓ten sam produkt

pgAdmin 4 AI Assistant: ominięcie transakcji read-only i RCE via prompt injection