SOAP / XML servislerimi koruyabilir miyim; XXE saldırılarına karşı koruma var mı?
Kısa cevap
Evet. Content-Type'ı …/xml ya da …+xml türündeki istekler (application/xml, text/xml, application/soap+xml) XML olarak ayrıştırılır; eleman ve attribute değerleri imzalarla taranır. Sayfa tipinin Xml sekmesinde izin verilen eleman yolları (Allowed XML Keys; SOAP'ta soap:Envelope.soap:Body gibi önekle, attribute'lar _attr ile), iç içe derinlik, anahtar sayısı ve değer uzunluğu ile deseni sınırlanır. Çözümlenemeyen XML Block Invalid XML Contents ile engellenir; bu ayar Any Paths kuralında varsayılan olarak açıktır. XML kabul etmemesi gereken endpoint'lerde Block All XML Contents kullanılır. XXE için imza kütüphanesinde XML External Entity kategorisi (69 kural) bulunur; DOCTYPE bildiriminde köşeli parantezli iç tanım bölümü taşıyan gövdeler (ör. <!ENTITY …> tanımı) TR7'nin XML ayrıştırıcısında çözümlenemez, Block Invalid XML Contents ihlali alır ve ham gövde olarak bu imzalarla taranır. TR7'nin ayrıştırıcısı harici varlıkları çözmez. Ayrıştırılabilen bir belgede DOCTYPE bildirimi XML içeriği olarak değerlendirilmediği için DOCTYPE taşıyan bütün istekleri reddetmek gereken servislerde Load Balancer'daki HTTP Request Body koşulu Block action'ına bağlanır. XXE'ye karşı kalıcı önlem, Kurum Servisindeki XML ayrıştırıcısında DTD ve harici varlık işlemenin kapatılmasıdır (OWASP XXE Prevention).
Sorun: XML Gövdeli Servisler Ek Saldırı Yüzeyi Taşır
SOAP ve XML API'leri gövdede yapılandırılmış veri taşır; beklenmeyen elemanlar, aşırı derin belgeler ve değerlere gömülü enjeksiyonlar uygulamaya ulaşabilir. XXE (XML External Entity) saldırısında ise istemci, belgenin başındaki DOCTYPE bildiriminde harici bir varlık tanımlar; arka uçtaki ayrıştırıcı bu varlığı çözerse sunucudaki bir dosya okunabilir ya da iç ağa istek yaptırılabilir (OWASP XXE). Saldırının sonucu arka uç ayrıştırıcısının ayarına bağlıdır; WAF ve Load Balancer katmanları bu ayarın önünde ek katman olarak çalışır.
TR7'de XML isteğinin yolu:
| Gövde | Ne olur |
|---|---|
Ayrıştırılabilen XML (DOCTYPE'sız ya da iç tanım bölümü olmayan DOCTYPE ile, ör. <!DOCTYPE r SYSTEM "…">) | Elemanlar ve attribute'lar Xml sekmesinin denetimlerinden ve XML kapsamlı imzalardan geçer. DOCTYPE bildirimi bu denetimlere girmez. |
DOCTYPE'ı köşeli parantezli iç tanım bölümü taşıyan gövde (<!DOCTYPE r [<!ENTITY …>]>; <!ELEMENT …> gibi başka tanımlar da aynı sonucu verir) | TR7'nin ayrıştırıcısı çözümleyemez; Block Invalid XML Contents açıksa 24 puanlık ihlal yazılır ve gövde ham hâliyle imza taramasından geçer (ör. XXE Entity SYSTEM URI Schemes, XXE External DTD Declaration). |
| Biçimi bozuk XML | Aynı biçimde Block Invalid XML Contents ve ham gövde taraması. |
HTTP Request Body koşulunda aranan metin (ör. <!DOCTYPE) | Ayrıştırmadan bağımsız olarak gövdenin ilk baytlarında aranır; koşula bağlı Block action'ı isteği reddeder. |
Çözüm: 3 Yöntem
Yöntemler birlikte kullanılır: Yöntem 1 SOAP ya da XML endpoint'inin beklenen yapısını tanımlar, Yöntem 2 DOCTYPE taşıyan istekleri katmandan bağımsız olarak reddeder, Yöntem 3 ikisini WEB-CLI'dan yazar. Xml kuralı için vService'te WAF açık olmalıdır (Bir vService'te WAF korumasını nasıl etkinleştiririm?); HTTP Request Body koşulu ve Block action'ı WAF gerektirmez.
| Durumunuz | Uygun yöntem |
|---|---|
| SOAP ya da XML endpoint'inin kabul ettiği eleman yollarını ve sınırlarını tanımlamak istiyorum | Yöntem 1: Xml sekmesi |
| Servisim DOCTYPE kullanmıyor; DOCTYPE taşıyan her isteği reddetmek istiyorum | Yöntem 2: HTTP Request Body koşulu + Block |
| Komut satırından yapılandırmak istiyorum | Yöntem 3: WEB-CLI |
Yöntem 1: Xml Sekmesi Önerilen
- Nasıl çalışır Endpoint'in Xml ortak kuralı, gövdedeki her eleman ve attribute yolunu izin listesiyle karşılaştırır; derinlik, anahtar sayısı ve değer uzunluğu sınırlarını uygular. Listede olmayan her yol 24 puanlık ihlaldir.
- Nerede açılır Left Monitor Panel → WAF-Protected vServices → vService → WAF Management → N page types → kural → detay panelinde Xml sekmesi
- Gereksinim Checks'te Structure Checks ve Argument Checks açık; host grubu Monitor ya da Blocking modunda; WAF alanında değiştirme yetkisi
- vService tipi HTTP
Adım adım yapılandırma
WAF Management sekmesinde Checks kartının kalem ikonu tıklanır; Structure Checks ve Argument Checks işaretli olmalıdır. SOAP zarflarında yol sayısı Max. Allowed Arguments değerini (varsayılan 25) kolayca aşar; değer listedeki yol sayısından büyük yapılıp Edit tıklanır.
WAF Management sekmesinde host grubunun mod kartı altındaki N page types satırına tıklanır.
Servisin path'i (ör. /ws/OrderService) için kural yoksa araç çubuğundaki Add tıklanır, Path girilir, Allowed Methods = Multiple Methods ile POST seçilir ve formdaki Add tıklanır (Yeni bir page type'ı elle nasıl eklerim?).
Listede kurala tıklanır; sağdaki detay panelinde Xml sekmesi seçilip Add Common Rule for Xml tıklanır. Form Any Paths kuralının değerleriyle dolu açılır.
Allowed XML Keys kısıtı açılıp yollar eklenir. Eleman adları ad alanı önekiyle birlikte, noktayla birleştirilerek yazılır; attribute'lar _attr altında yer alır (XML'de element ve attribute yolları nasıl tanımlanır?). Örnek SOAP gövdesi için gereken yollar:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body><GetOrder id="7"><No>12</No></GetOrder></soap:Body>
</soap:Envelope>soap:Envelope, soap:Envelope._attr, soap:Envelope._attr.xmlns:soap, soap:Envelope.soap:Body, soap:Envelope.soap:Body.GetOrder, soap:Envelope.soap:Body.GetOrder._attr, soap:Envelope.soap:Body.GetOrder._attr.id, soap:Envelope.soap:Body.GetOrder.No.
XML Depth, XML Key Count ve XML Value Length zarfın beklenen boyutuna göre daraltılır; Block Invalid XML Contents işaretli bırakılır.
Formdaki Add tıklanır; ayrı bir dağıtım adımı yoktur.
JSON ile çalışan endpoint'lerin kuralında aynı sekmede ortak kural açılıp Block All XML Contents işaretlenir ve Add tıklanır (Bir sayfada JSON veya XML gövdesini tamamen yasaklayabilir miyim (Block All JSON Contents / Block All XML Contents)?). Cluster'da değişiklikler varsayılan auto-sync ile eş cihaza gönderilir; Manual Sync Mode açıksa Synchronize ile gönderilir.
Doğrulama
Zarfa listede olmayan bir eleman eklenerek istek gönderilir ve Event Logs kaydının Attacks sekmesine bakılır.
Allowed XML keys · eklenen elemanın yolu (24)DOCTYPE içinde ENTITY tanımlayan bir gövde gönderilir.
Komut: curl -s -o /dev/null -w "%{http_code}\n" -H "Content-Type: application/xml" -d '<!DOCTYPE r [<!ENTITY a SYSTEM "file:///etc/passwd">]><r>&a;</r>' https://www.example.com/ws/OrderService
Block invalid XML contents ve XXE imza kayıtlarıYöntem 2: HTTP Request Body Koşulu + Block
- Nasıl çalışırHTTP Request Body koşulu gövdenin ilk Body Size to Parse(Bytes) baytında
<!DOCTYPEmetnini ham olarak arar; koşula bağlı Block action'ı isteği WAF engelleme sayfasından önce reddeder. Ayrıştırmaya bağlı değildir. - Nerede açılırLoad Balancer → Conditions · Load Balancer → Actions · vService → Details → Actions
- Gereksinim Load Balancer alanında değiştirme yetkisi; servisin DOCTYPE kullanmaması; WAF gerekmez
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Conditions ekranında Add tıklanır (nasıl eklenir).
Condition Name = xml-doctype girilir, Criteria = HTTP Request Body seçilir; eşleştirme listesinde Includes seçilip Query alanına <!DOCTYPE yazılır ve Case Insensitive işaretlenir. Body Size to Parse(Bytes) varsayılan 1024'tür; DOCTYPE belgenin başında yer aldığı için bu değer yeterlidir.
Add tıklanır.
Load Balancer → Actions ekranında Add tıklanır.
Action Name girilir, Action Type = Block, Execution Level = On Request seçilir; Status Code varsayılan 403'tür. Conditions alanında 3. adımdaki koşul seçilir. Koşul yalnızca XML servislerine uygulanacaksa path koşuluyla and ile birleştirilir (İstek gövdesinde (JSON / XML / form) belirli içerikleri arayıp engelleyebilir miyim?).
Add tıklanır.
Load Balancer → Load Balancer vService List ekranında vService seçilip Edit tıklanır.
Details altındaki Actions alanında action seçilir.
Save tıklanır; ayrı bir dağıtım adımı yoktur. Cluster'da değişiklik varsayılan auto-sync ile eş cihaza gönderilir; Manual Sync Mode açıksa Synchronize ile gönderilir.
Doğrulama
Harici DTD'ye başvuran ama ayrıştırılabilen bir gövde gönderilir.
Komut: curl -s -o /dev/null -w "%{http_code}\n" -H "Content-Type: application/xml" -d '<!DOCTYPE r SYSTEM "http://198.51.100.5/x.dtd"><r>x</r>' https://www.example.com/ws/OrderService
403Yöntem 3: WEB-CLI
- Nasıl çalışır Xml ortak kuralı
waf rule-parts add … loc xml, DOCTYPE koşulu ve Block action'ılb condition,lb actionvelb servicekomutlarıyla yazılır. - Nerede açılır WEB-CLI →
waf rule-parts·lb condition - Gereksinim WEB-CLI erişimi ve WAF alanında değiştirme yetkisi; vService, host grubu ve kural kimlikleri (
waf host-groups list,waf fw-rules list) - vService tipi HTTP
Adım adım yapılandırma
WEB-CLI'da XML parçasının Block All XML Contents (--xmlBlockAll) ve Block Invalid XML Contents değerleri varsayılan olarak true gelir; XML kabul eden endpoint için --xmlBlockAll false yazılır. Yazılmayan diğer alanlar da şema varsayılanlarıyla kaydedilir: anahtar uzunluğu 1–64, anahtar sayısı en fazla 1024, derinlik en fazla 32, her metin değerin uzunluğu 0–1024:
waf rule-parts add poolId <vService> hostGroupId <grup> ruleId <kural> loc xml --xmlBlockAll false --xmlAllowedArgs.0 soap:Envelope --xmlAllowedArgs.1 soap:Envelope.soap:BodyListedeki diğer yollar --xmlAllowedArgs.2, --xmlAllowedArgs.3 … ile aynı komuta eklenir. Komut başarılı olduğunda çıktı vermez.
Aranan metin !DOCTYPE olarak yazılır; <!DOCTYPE taşıyan her gövde bu metni de içerir. --bodySize yazılmadığında gövdenin ilk 4096 baytı incelenir. Komut başarılı olduğunda çıktı vermez:
lb condition add criteria req_body query '!DOCTYPE' --content_placement sub --caseInsensitive true --name xml-doctype--cond alanı koşulun adını değil kimliğini alır; kimlik listenin id sütunundan okunur:
lb condition listlb action add type deny name xml-doctype-block --cond <koşul-kimliği>Önce lb service show <vService> ile mevcut rules.N satırları görülür; --rules.N o sıradaki action'ın yerine geçtiği için ilk boş sıra kullanılır (hiç action yoksa 0):
lb service update id <vService> --rules.0 xml-doctype-blockDoğrulama
vService kaydı görüntülenir.
Komut: lb service show <vService>
rules satırlarında xml-doctype-blockSık Yapılan Hatalar
Arka uçta DTD işlemeyi açık bırakmak
WAF ve Load Balancer katmanları XXE'yi istek üzerinde yakalamaya çalışır; ancak saldırının etkisi Kurum Servisindeki XML ayrıştırıcısının harici varlıkları çözmesine bağlıdır. Ayrıştırıcıda DTD ve harici varlık işleme kapatılır (OWASP XXE Prevention).
- SOAP yollarını öneksiz yazmak. Eleman adları belgede nasıl yazılıyorsa öyle eşleşir:
soap:EnvelopeyerineEnvelopeyazılırsa yol listede bulunmaz ve ihlal olur. Kapsayıcılar ve_attryolları da listeye girer. - Max. Allowed Arguments değerini artırmamak. SOAP zarflarının yol listesi bu sınırı aştığında liste o kural için uyarı vermeden devre dışı kalır.
- XML'in yalnızca application/xml ile geldiğini sanmak.
text/xml,application/soap+xmlve diğer…+xmltürleri de XML olarak ayrıştırılır; Content-Type XML değilse gövde ham olarak taranır. - Block Invalid XML Contents'i kapatmak. İç tanım bölümlü (ör. varlık tanımlayan) DOCTYPE'lı gövdeler bu ihlalle işaretlenir; kapatılırsa bu gövdeler yalnızca ham gövde imza taramasıyla değerlendirilir.
- DOCTYPE koşulunu DOCTYPE kullanan bir servise uygulamak. DTD'ye ihtiyaç duyan servislerde koşul meşru istekleri de engeller; bu servislerde koşul path ile daraltılır ya da kullanılmaz.
- WEB-CLI'da
--xmlBlockAll falseyazmamak. Varsayılantrueolduğu için endpoint'e gelen bütün XML gövdeleri ihlal olur.
Dokümantasyonda nasıl yapılır
