CVE-2017-9805 · Bilgilendirme

Apache Struts Deserialization of Untrusted Data Vulnerability

CVE-2017-9805, Apache Struts zafiyeti ile XML yükleri üzerinden uzaktan kod yürütme riski taşır.

Üretici
Apache
Ürün
Struts
Seviye
yüksek
Yayın Tarihi
05 Nisan 2026
Okuma
8 dk okuma

CVE-2017-9805: Apache Struts Deserialization of Untrusted Data Vulnerability

Zorluk Seviyesi: İleri | Kaynak: CISA KEV

Zafiyet Analizi ve Giriş

CVE-2017-9805, Apache Struts’un REST Plugin'i ile ilişkili bir zafiyettir ve bu zafiyet, uzaktan kod yürütme (RCE - Remote Code Execution) potansiyeli taşıdığı için büyük bir tehdit oluşturmaktadır. Zafiyetin kökeni, Apache Struts'un XStreamHandler sınıfı ile XStream kütüphanesinin bir örneği aracılığıyla nesne serileştirme sürecinde hangi türlerin kontrol edilmediği üzerine dayanmaktadır. Buradaki temel sorun, istenmeyen (untrusted) verilerin doğrudan deseralize edilmesiyle ortaya çıkmaktadır. XStream, Java nesnelerini XML formatına çevirmek ve yine bu formatta gelen verileri nesneye dönüştürmek için kullanılan bir kütüphanedir. Ancak, uygun tür kontrolü yapılmadığında, saldırganlar kötü niyetli XML yükleri (payload) göndererek sunucuda istenmeyen komutlar çalıştırabilir.

Zafiyet 2017 yılında keşfedilmiştir ve o zamandan bu yana dünya genelinde pek çok kurumu etkilemiştir. Bu zafiyetin potansiyel etkisi, finansal hizmetlerden sağlık hizmetlerine, e-ticaretten kamu sektörüne kadar geniş bir yelpazeyi kapsamaktadır. Özellikle, büyük veri işlem merkezi olarak işlev gören kurumsal uygulamalar bu zafiyetten etkilenme riski taşımaktadır. Zira bu tür uygulamalar genellikle veri işleme süreçlerinde çok sayıda dış veri kaynağına bağlıdırlar ve bu verilerin güvenliği sağlanmadığında, sistemin tamamını tehlikeye atabilecek saldırılar gerçekleştirilebilir.

Gerçek dünya senaryolarına baktığımızda, bir saldırganın başta gelen bir hedef olarak büyük bir e-ticaret platformunu seçtiğini varsayalım. Saldırgan, platformun API'sine kötü amaçlı bir XML yükü göndererek, sunucunun bu yükü işleme almasını sağlar. XStreamHandler, yükü deseralize ederken denetim yapmadığı için, yük içindeki zararlı kod çalıştırılır. Bu durumda, saldırganın sunucu üzerinde tam yetkiye sahip olabileceği ve sistemde herhangi bir komutu çalıştırabileceği bir durum ortaya çıkar. Bu saldırı sonucunda müşteri verileri, kredi kartı bilgileri gibi hassas bilgiler tehlikeye atılabilir ve firma ciddi mali kayıplar yaşayabilir.

Apache Struts’un bu zafiyetinden korunmak için güncelleme yapmanın yanı sıra, geliştiricilerin XStream kullanımı sırasında dikkatli olmaları gereklidir. Özellikle, içeriği denetleme mekanizmalarının eklenmesi, sadece belirli türlerin deserialize edilmesine izin verilmesi, potansiyel riskleri azaltmanın etkili yollarındandır. Bunun yanı sıra, güvenlik testleri ve sızma testleri (penetration testing) düzenli olarak yapılmalı ve zafiyet taramaları gerçekleştirilmelidir.

Sonuç olarak, CVE-2017-9805 zafiyeti, Apache Struts'un popülerliğinden dolayı geniş bir etki alanına sahiptir. Kurumların bu zafiyeti göz ardı etmemesi, sürekli güncellemeler yapması ve güvenlik standartlarını yüksek tutması, hem operasyonel süreklilik hem de kullanıcı güvenliği için kritik öneme sahiptir. Bu tür zafiyetler, sadece teknik bir sorun olmanın ötesinde, bir organizasyonun itibarını ve müşteri ilişkilerini de derinden etkileyebilir.

Teknik Sömürü (Exploitation) ve PoC

Apache Struts, popüler bir açık kaynak web uygulama çerçevesidir ve REST Plugin bileşeni, bir dizi web uygulamasında API iletişimi yönetiminde yaygın şekilde kullanılmaktadır. Ancak, CVE-2017-9805 zafiyeti, bu çerçeve üzerinde ciddi bir güvenlik açığı oluşturarak uzaktan kod yürütme (RCE - Remote Code Execution) riski taşımaktadır. Bu zafiyet, Apache Struts REST Plugin'in XStream kütüphanesini kullanarak XML verilerini deserialize ederken herhangi bir tür filtreleme yapmaması nedeniyle ortaya çıkmaktadır. Bu durum, kötü niyetli kullanıcıların zararlı yükler göndermesi ile sunucuda istenmeyen komutlar çalıştırmalarına olanak tanır.

Güvenlik açığının teknik sömürü aşamalarına geçmeden önce, hedef sistemin doğru bir şekilde belirlenmesi önemlidir. Hedef uygulamanın Apache Struts REST Plugin'i içerdiğinden emin olun. Bunun için aşağıdaki basit HTTP isteği ile hedef uygulamanın yanıtı kontrol edilebilir:

GET /api/endpoint HTTP/1.1
Host: hedef_sunucu.com
Accept: application/json

Eğer hedef uygulama çalışıyorsa ve yukarıdaki endpoint'e yanıt veriyorsa, zafiyetin varlığı doğrulanabilir.

Sömürü aşamaları genellikle üç temel adımdan oluşur:

  1. Hazırlık Aşaması: Hedef sistemin değerlendirildiği ve zafiyetlerin belirlendiği bu aşamada, API'ye gönderilecek zarar verici yük (payload) oluşturulur. XStream kullanarak zararlı bir nesne oluşturmak için aşağıdaki gibi bir Python kodu kullanılabilir:
import base64
from com.thoughtworks.xstream import XStream
from com.thoughtworks.xstream.io.xml import DomDriver

# Üçüncü taraf bir sınıfın örneği (payload)
class MaliciousPayload:
    def __reduce__(self):
        return (os.system, ("touch /tmp/hacked.txt",))

# XStream nesnesini oluştur
xstream = XStream(DomDriver())
payload = xstream.toXML(MaliciousPayload())
encoded_payload = base64.b64encode(payload.encode()).decode()
print(encoded_payload)

Bu kod, hedef sisteme gönderilecek zararlı bir nesne oluşturmaktadır.

  1. Zararlı Yük Gönderimi: Hazırlanan zararlı yük, hedef sistemin API'sine XML olarak gönderilir. Bunun için aşağıdaki gibi bir POST isteği kullanılabilir:
POST /api/endpoint HTTP/1.1
Host: hedef_sunucu.com
Content-Type: application/xml
Content-Length: [gerekli_uzunluk]

<data>
    <payload>[BASE64_ENCODED_PAYLOAD]</payload>
</data>

Bu istekte, payload kısmı yukarıda oluşturulan zararlı yük ile doldurulmalıdır. Eğer untrusted data (güvensiz veri) deserialization (deseriyalizasyon) sırasında feldise edilecek olursa, sunucu zarar görerek uzaktan kod yürütme (RCE) tehdidi ortaya çıkacaktır.

  1. Sonuç Kontrolü: Zafiyeti başarılı bir şekilde sömürüp sömürmediğimizi anlamak için sunucunun yanıtına dikkatlice bakılmalıdır. Eğer hacked.txt dosyası /tmp dizinine oluşturulmuşsa, bu durumda RCE başarılı bir şekilde gerçekleştirilmiştir. Bunun kontrolü için basit bir HTTP GET isteği yapılabilir:
GET /tmp/hacked.txt HTTP/1.1
Host: hedef_sunucu.com

Sonuç olarak, CVE-2017-9805 zafiyeti, Apache Struts'in REST Plugin'inin bir güvenlik açığı olması nedeniyle, kötü niyetli kullanıcıların uzak sistemlerde tehlikeli eylemler gerçekleştirmesine olanak tanımaktadır. Bu tür zafiyetlerin önlenmesi için güncellemelerin yapılması ve gerekli güvenlik önlemlerinin alınması büyük önem taşır. Uygulama geliştiricileri, deserialization işlemlerinde güvenlik önlemleri almalı ve her türlü veriyi dikkatlice kontrol etmelidir.

Forensics (Adli Bilişim) ve Log Analizi

CVE-2017-9805 zafiyeti, Apache Struts platformunda bulunduğunu ve kötü niyetli kullanıcıların XML yüklerini deseralize ederken uzaktan kod yürütmesine (remote code execution - RCE) olanak tanıdığını belirtmektedir. Apache Struts REST Plugin’inde XStreamHandler'ın kullanımı, tip filtrelemesi (type filtering) yapılmadan deserialization (tersine mühendislik) sürecine girmesi, potansiyel olarak sistemin ele geçirilmesi için büyük bir fırsat sunmaktadır. Bu tür bir zafiyetin kötüye kullanılması durumunda, bir siber güvenlik uzmanı olarak öncelikle olayın izini sürmek ve imzalarını (signature) tespit etmek için log analizi yapmanız gerekmektedir.

Gerçek dünya senaryosunda, bir 공격 (saldırı) başlatıldığında genellikle uygulamanın erişim logları (access logs) ve hata logları (error logs) üzerinde belirli izler bırakır. Bir siber güvenlik uzmanı olarak, bu logları dikkatlice analiz etmelisiniz. Öncelikle bazı belirli kalıpları ve imzaları gözlemlemeniz gerekecek. Apache Struts'un deserialization sürecine müdahale etmek amacıyla yapılan saldırılarda, log dosyalarında genellikle şunları aramak faydalı olabilir:

  1. HTTP İstekleri: Özellikle POST isteklerinde, XML formatında gelen verilerin içeriği detaylı bir şekilde incelenmelidir. Şüpheli anlamlara gelebilecek ve XStream veya benzeri kütüphanelere ait terimler içeren aşırı karmaşık XML yapıları dikkat çekici olabilir. Örneğin, isteklerde aşağıdaki gibi kalıplar gözlemlenirse risk altında olduğunuzu gösterir:
   <map>
       <entry>
           <string>org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper</string>
           <object>
               ...
           </object>
       </entry>
   </map>
  1. Hata Logları: Apache hata logları genellikle uygulamanın yanlış yapılandırmalarını veya beklenmedik durumları kaydeder. Deserialization sırasında meydana gelen hatalar, bu loglarda belirginleşebilir. Örneğin, XStream kütüphanesi ile ilgili hatalar burada listelenebilir ve bunlar potansiyel bir saldırının izleri olabilir:
   ERROR org.apache.commons.beanutils.PropertyUtils - Error converting property
  1. Anormal Trafik Desenleri: Log analizi sırasında, normalin dışında bir trafik artışı gözlemlenebilir. Özellikle belirli IP adreslerinden gelen aşırı sayıda istek, potansiyel bir saldırı için işaret edici olabilir. Olası RCE girişimlerini önlemek için bu tür IP'ler üzerinde ek inceleme yapılmalıdır.

  2. İşletim Sistemi ve Uygulama İşlemleri: Eğer uzaktan kod yürütme başarılı olmuşsa, sistemde beklenmedik işlemlerin veya kullanıcı oturumlarının varlığı araştırılmalıdır. İşletim sistemi logları (örneğin, Windows Event Log veya Linux syslog) bu tür anormal davranışların izini sürmenizde yardımcı olabilir.

Bir saldırı tespit edildiğinde, öncelikle saldırganın giriş noktası belirlenmeli ve ardından sistemin zayıflıkları kapatılmalıdır. Potansiyel olarak zarar görmüş olan sistemlerin bir yedeği alınmalı ve kurban olan sistemler üzerinde forensic (adli bilişim) analiz gerçekleştirilmelidir. Bu tür durumlar, siber güvenlik uzmanlarının gerçek zamanlı saldırı tespit ve müdahale planlarını geliştirmelerine olanak tanır.

Sonuç olarak, CVE-2017-9805 gibi güvenlik açıklarına karşı önlem almak ve bu tür saldırıları zamanında tespit etmek kritik öneme sahiptir. Anlamak ve logları etkili bir şekilde analiz etmek, saldırganların izini sürmek ve tehlikeleri en aza indirmek için gereklidir.

Savunma ve Sıkılaştırma (Hardening)

Apache Struts, yaygın olarak kullanılan bir web uygulama çerçevesidir ve geliştirme süreçlerinde hız ve esneklik sağlamak için birçok sanal özelliğe sahiptir. Ancak, özellikle CVE-2017-9805 gibi güvenlik açıkları, bu platformların yanlış yapılandırılması durumunda ciddi güvenlik sorunlarına yol açabilir. Bu nedenle, hem geliştiricilerin hem de sistem yöneticilerinin bu tür zafiyetleri nasıl önleyeceğini anlaması kritik öneme sahiptir.

CVE-2017-9805, Apache Struts REST Plugin’in, XStream ile birlikte kullanılan bir XStreamHandler aracılığıyla güvenilmez verilerin (untrusted data) deseralizasyonunu gerçekleştirmesi sırasında ortaya çıkan bir açıklığı ifade eder. Bu durum, XML yüklerine (payloads) dayalı olarak uzaktan kod çalıştırma (Remote Code Execution - RCE) riski yaratabilmektedir. Gerçek dünyada bu tür durumlar, saldırganların sunucuda kötü niyetli kod çalıştırarak veri sızıntısı, veri değiştirme veya sistemin kontrolünü ele geçirme gibi kritik tehlikeler oluşturmasına neden olabilir.

Bu açıklığın kapatılması için öncelikle uygulamalarınızın güncel versiyonlarının kullanılmasına özen göstermelisiniz. Apache Struts ve diğer kütüphanelerin en son sürümlerine geçiş yapmak, bilinen güvenlik açıklarının kapatılmasını sağlayacaktır. Uygulamanızda XML deseralizasyonunu zaruri olmadığı sürece kullanmamaya çalışın. Eğer kullanmanız gerekiyorsa, deseralizasyon işlemi esnasında güvenlik önlemlerine dikkat edin; örneğin, yalnızca belirli sınıfların deserealize edilmesine izin veren bir filtreleme mekanizması uygulamak faydalı olabilir.

Alternatif olarak, bir Web Uygulama Güvenlik Duvarı (WAF) kullanmak, potansiyel saldırıları önlemek için etkili bir yöntem olabilir. WAF’lar, gelen istekleri analiz ederek kötü niyetli testlere karşı koruma sağlayabilir. Aşağıdaki örnek, Apache Struts uygulamanızı korumak için WAF üzerinde uygulanabilecek bir kuralı göstermektedir:

SecRule REQUEST_HEADERS:Content-Type "application/xml" \
    "phase:2, \
    id:1000001, \
    deny, \
    status:403, \
    msg:'XML payloads are not allowed.'"

Bu kural, uygulamanıza gelen XML içerikli istekleri engelleyerek potansiyel RCE saldırılarını önlemeye yardımcı olabilir.

Kalıcı sıkılaştırma (hardening) önerileri arasında, sunucu ve uygulama arasındaki gizli parametrelerin (API anahtarları, şifreler) ortam değişkenlerinde saklanması ve dosya izinlerinin titizlikle yönetilmesi yer alabilir. Örneğin:

chmod 600 /path/to/your_secret_file

Bu komut, yalnızca dosya sahibi tarafından okunması ve yazılması sağlanarak, gizli bilgilerin yetkisiz erişimine karşı önlem alır.

Ek olarak, güvenlik güncellemelerini takip etmek, düzenli sızma testleri yapmak ve uygulama günlüklerini izlemek, potansiyel zafiyetleri daha önceden tespit edebilmek adına oldukça önemli adımlardır.

Son olarak, kesinlikle unutmamanız gereken husus, tedarikçilerle iletişimde kalarak açık kaynak kütüphanelerin en güncel sürümlerinin takibini yapmaktır. Bu, sadece mevcut güvenlik açıklarını kapatmakla kalmaz, uygulamanızın güvenliğini artırmak için en önemli adımlardandır.