Genel Bakış
XML Dış Varlık (XXE) enjeksiyonu, Document Type Definition (DTD) içinde tanımlanan dış varlık bildirimlerini işleyecek şekilde yapılandırılmış XML ayrıştırıcılarını hedef alan bir saldırı sınıfıdır. Bir saldırgan XML girdisini sağlayabildiğinde veya üzerinde etki edebildiğinde, yerel bir dosya yolu, dahili ağ uç noktası ya da uzak URL gibi harici bir kaynağa başvuran özel bir varlık tanımlayabilir ve ayrıştırıcının bu kaynağı getirerek ayrıştırılan belgeye gömmesine neden olabilir.
XXE güvenlik açıkları, XML 1.0 spesifikasyonunun modülerlik amacıyla dış varlıkları meşru olarak desteklemesinden kaynaklanmaktadır. Modern uygulamaların büyük çoğunluğunun bu özelliğe ihtiyacı yoktur; ancak pek çok XML kütüphanesi onu varsayılan olarak etkinleştirir ve kullanıcı tarafından kontrol edilen XML açık bir sertleştirme yapılmadan ayrıştırıldığında saldırı yüzeyi oluşturur.
Sensagraph, XML kabul eden uç noktalarda hazırlanmış DTD yükleri enjekte ederek ve bant dışı veri sızdırma kanalları dahil olmak üzere ayrıştırıcı davranışını gözlemleyerek XXE açıklarını otomatik olarak test eder.
Nasıl çalışır?
XML spesifikasyonu, belgelerin ayrıştırma sırasında ayrıştırıcının içerikle değiştirdiği adlandırılmış referanslar olan varlıkları bildirmesine olanak tanır. Dış varlıklar, ayrıştırıcıyı URI kullanarak harici bir kaynağa yönlendirerek bunu genişletir:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
Ayrıştırıcı dış varlığı çözümlerse, /etc/passwd içeriği belge gövdesine yerleştirilir ve potansiyel olarak saldırgana sunucu yanıtında yansıtılır.
Yaygın XXE saldırı varyantları
- Klasik (bant içi) XXE: Çözümlenen varlık değeri doğrudan uygulama yanıtında yansıtılır ve doğrudan dosya okumaya olanak tanır.
- Hata tabanlı XXE: Ayrıştırıcı, yanıt gövdesi yansıtılmasa bile hata mesajları aracılığıyla sızan hassas veriler içeren bir ayrıştırma hatası tetikler.
- Bant dışı (OOB) XXE / Kör XXE: Ayrıştırıcı, sızdırılan verileri saldırgan tarafından kontrol edilen bir sunucuya taşıyan giden HTTP veya DNS isteği yapar; yanıt saldırgana hiçbir zaman gösterilmediğinde kullanışlıdır.
- XXE aracılığıyla SSRF: Dış varlık URI'si dahili bir ağ kaynağını (örn. bulut örneklerinde
http://169.254.169.254/latest/meta-data/) hedef alır ve internet üzerinden erişilemeyen servislere ulaşmak için sunucu taraflı istek sahteciliği sağlar. - Billion Laughs (XML Varlık Genişletme / DoS): İç içe varlık referansları üstel olarak genişler ve ayrıştırıcı belleğini ile CPU'sunu tüketerek CWE-776 kapsamında ayrı olarak ele alınır.
- XInclude saldırıları: Tam DTD kontrolü mevcut olmadığında saldırganlar, ayrıştırıcı XInclude işlemeyi destekliyorsa dış dosyaları dahil etmek için XInclude direktiflerini kullanabilir.
- Dosya yükleme yoluyla XXE: XML tabanlı dosya formatları (SVG, DOCX, XLSX, ODT, RSS beslemeleri) kötü amaçlı DTD bildirimleri taşıyabilir; sunucu bunları dosya işleme sırasında ayrıştırır ve geliştirici XML'in dahil olduğunun farkında olmayabilir.
Ayrıştırıcıların neden savunmasız olduğu
- Pek çok XML kütüphanesi (Java'nın
DocumentBuilderFactory'si, Python'ınxml.etree/lxml'i, PHP'ninSimpleXML/DOMDocument'i, .NET'inXmlDocument'i) varsayılan olarak dış varlık çözümlemesini etkinleştirir ya da tarihsel olarak etkinleştirmiştir. - Bir bileşenin XML işlediğinden habersiz olan geliştiriciler (örn. SAML kütüphanesi, OpenDocument ayrıştırıcısı veya SOAP çerçevesi) bu bileşene sertleştirme uygulamayabilir.
- Şema doğrulaması XXE'yi engellemez — varlık şema doğrulaması gerçekleşmeden önce çözümlenir.
İş etkisi
Başarılı bir XXE saldırısı, sunucu ortamına ve ayrıştırıcı özelliklerine bağlı olarak ciddi sonuçlar doğurabilir:
- Hassas dosya ifşası:
/etc/passwdgibi sistem dosyalarının, uygulama yapılandırma dosyalarının, özel anahtarların ve sunucu dosya sisteminde depolanan kimlik bilgilerinin okunması. - Kimlik bilgisi ve sır hırsızlığı: Kaynak kodu, API anahtarları, veritabanı bağlantı dizeleri ve bulut sağlayıcı meta veri servisi belirteçlerinin tamamına yerel dosya URI'leri veya SSRF aracılığıyla ulaşılabilir.
- Dahili ağ keşfi: XXE aracılığıyla SSRF, saldırganların dahili ana bilgisayarları araştırmasına, açık portları listelemesine ve dahili yönetim panelleri, Kubernetes API'leri veya bulut meta veri uç noktaları gibi servislere erişmesine olanak tanır.
- Uzaktan kod yürütme: Belirli yapılandırmalarda (örn.
expect://URI desteği olan PHP veya belirli Java ayrıştırıcıları) XXE, RCE'ye yükselebilir. - Hizmet reddi: Billion Laughs ve benzeri yükler ayrıştırıcı sürecini çökertebilir veya ciddi ölçüde bozabilir.
- Uyumluluk ihlalleri: XXE aracılığıyla kişisel verilere yetkisiz erişim, GDPR, HIPAA, PCI-DSS veya benzeri düzenlemeler kapsamında bir ihlal teşkil edebilir ve bildirim yükümlülükleri ile olası para cezalarını tetikleyebilir.
Nasıl düzeltilir?
-
XML ayrıştırıcısında dış varlık işlemeyi devre dışı bırakın (birincil kontrol): Ayrıştırıcıyı dış varlıkları ve DTD işlemeyi tamamen reddedecek şekilde yapılandırın. Tam API dil ve kütüphaneye göre değişir:
- Java (DocumentBuilderFactory):
http://apache.org/xml/features/disallow-doctype-declözelliğinitrueolarak ayarlayın ya dahttp://xml.org/sax/features/external-general-entitiesvehttp://xml.org/sax/features/external-parameter-entitiesözelliklerini devre dışı bırakın. - Python (lxml):
etree.XMLParser(resolve_entities=False, no_network=True)kullanın; güvenilmez girdi için eski sürümlerde varlıkları temiz biçimde devre dışı bırakma desteği olmayanxml.etree.ElementTree'den kaçının. - PHP:
libxml_disable_entity_loader(true)çağrısı yapın (PHP < 8.0) ya daLIBXML_NOENTbayraklarını dikkatli kullanın; ağ erişimini engellemek içinLIBXML_NONETtercih edin. - .NET:
XmlReaderSettings.DtdProcessing = DtdProcessing.ProhibitveXmlReaderSettings.XmlResolver = nullolarak ayarlayın. - Node.js: Varlık genişletmesi devre dışı bırakılmış
fast-xml-parsergibi kütüphaneleri tercih edin; dış varlık desteğiylelibxmljskullanmaktan kaçının.
- Java (DocumentBuilderFactory):
- Mümkün olan durumlarda daha az karmaşık veri formatları kullanın: Kullanım durumu karışık içerik veya ad alanları gibi XML özelliklerini gerektirmiyorsa XML'i, dış varlık kavramı bulunmayan JSON, Protocol Buffers veya MessagePack ile değiştirin.
- İzin listesi giriş doğrulaması uygulayın: Uygulamanızın buna özel ve kontrollü bir ihtiyacı olmadıkça
DOCTYPEbildirimi içeren XML belgelerini reddedin. Bu, girdi ayrıştırıcıya aktarılmadan önce uygulama katmanında uygulanabilir. - XML kütüphanelerini güncel tutun: Kütüphane satıcıları, varsayılan olarak güvensiz varlık işleme davranışına düzenli olarak yama uygular. Savunmasız sürümleri izlemek için bir yazılım bileşen analizi (SCA) süreci yürütün.
- XInclude işlemeyi devre dışı bırakın: Ayrıştırıcınız XInclude'u destekliyorsa ve kullanmıyorsanız varlık kısıtlamalarının XInclude tabanlı atlatılmasını önlemek için bunu açıkça devre dışı bırakın.
- Ağ düzeyinde kontroller uygulayın: XXE istismar edilse bile uygulama sunucusundan beklenmedik giden bağlantıları engelleyen çıkış filtrelemesi, bant dışı sızdırma ve SSRF pivot yapmanın kullanışlılığını sınırlandırır.
- Uygulama sürecine en az ayrıcalık ilkesi uygulayın: XML ayrıştırıcıyı çalıştıran süreç yalnızca ihtiyaç duyduğu dosyalara okuma erişimine sahip olmalıdır. Patlama yarıçapını sınırlamak için işletim sistemi düzeyinde korumalı alan oluşturma (seccomp, AppArmor, salt okunur bağlantı noktalı konteynerler) kullanın.
- XML kullanan bileşenleri denetleyin: SAML kimlik doğrulama kütüphaneleri, ofis belgesi dönüştürücüler, RSS ayrıştırıcılar ve üçüncü taraf entegrasyonlar gibi dolaylı yollar dahil olmak üzere XML'in işlendiği tüm yerleri envanterleyin ve her birinin sertleştirildiğini doğrulayın.
Referanslar
- OWASP – XML Dış Varlık (XXE) İşleme
- OWASP Hızlı Başvuru – XXE Önleme
- OWASP Top 10 2021 – A05: Güvenlik Yanlış Yapılandırması
- MITRE CWE-611 – XML Dış Varlık Referansının Hatalı Kısıtlanması
- MITRE CWE-776 – DTD'lerde Özyinelemeli Varlık Referanslarının Hatalı Kısıtlanması
- MITRE CWE-918 – Sunucu Taraflı İstek Sahteciliği (SSRF)
- W3C XML 1.0 Spesifikasyonu – Dış Varlıklar
- PortSwigger Web Security Academy – XXE Enjeksiyonu