AI Hacking - Hackerlar Siber Saldırılarda Yapay Zekayı Nasıl Kullanıyor?

Şimdi Oku
Site çevirileri için yapay zeka kullanıyoruz ve doğruluk için çaba göstersek de her zaman %100 kesin olmayabilir. Anlayışınız için teşekkür ederiz.

Apache Kafka için Spring'de Deserialization Saldırılarına Karşı Koruma

tarafından OPSWAT
Bu Gönderiyi Paylaş
Nguyen Phu Hung ve Tran Anh Huy'un HUTECH ve HCMC Bilim Üniversitesi ile bağlantılarını temsil eden profesyonel bir görüntüsü.

Kötü amaçlı kod çalıştırmak için serileştirilmiş verilerin yetkisiz manipülasyonu olan serileştirme saldırıları, kuruluşlara ciddi zararlar verebilir. Geliştiriciler ve güvenlik ekipleri, saldırının nasıl, ne zaman ve nerede gerçekleştiğini ortaya çıkaran temel güvenlik açıklarını proaktif olarak belirlemelidir.  

Bu tehdidin yakın tarihli bir örneği, Apache Kafka için Spring'de RCE'ye (uzaktan kod yürütme) yol açabilen bir deserialization saldırı vektörü olan CVE-2023-34040'tır. Aslında, serileştirme güvenlik açıklarının yaygınlığı, en kritik 10 web uygulaması güvenlik riskinden biri olarak "Güvenilmeyen Verilerin Serileştirilmesi" ni içeren OWASP Top 10 listesinde vurgulanmaktadır.  

SBOMSoftware Bill of Materials) motoruna sahip OPSWAT MetaDefender Core™ gibi araçlar, deserialization saldırılarını tespit etmek ve önlemek için çok önemlidir. Bunlar, geliştiricilerin kodlarını verimli bir şekilde tarayıp analiz etmelerine olanak tanıyarak hiçbir güvenlik açığının gözden kaçmamasını sağlar.  

Bu blogda, Yüksek Lisans Bursiyerlerimiz CVE-2023-34040 ve istismarının ayrıntılarını ve açık kaynaklı bileşenlerin benzer tehditlere karşı nasıl güvence altına alınacağını tartışacaklar. 

CVE-2023-34040 Hakkında

CVE-2023-34040, Spring for Apache Kafka'da olağandışı bir yapılandırma uygulandığında yararlanılabilecek bir serileştirme saldırı vektörünü ortaya çıkarır. Bu güvenlik açığı, bir saldırganın serileştirme istisnası kayıt başlıklarından birinde kötü amaçlı serileştirilmiş bir nesne oluşturmasına olanak tanır ve bu da RCE ile sonuçlanabilir. Güvenlik açığı Spring for Apache Kafka'nın 2.8.1 ila 2.9.10 ve 3.0.0 ila 3.0.9 sürümlerini etkilemektedir.

NIST ve VMware'den yüksek ve orta risk seviyeleri ile güvenlik açıkları için CVSS 3.x önem puanlarını gösteren bir ekran görüntüsü.

Özellikle, bir uygulama/tüketici aşağıdaki belirli yapılandırmalar ve koşullar altında savunmasızdır: 

  • ErrorHandlingDeserializer sınıfı kaydın anahtarı ve/veya değeri için yapılandırılmamıştır. 
  • Tüketicinin checkDeserExWhenKeyNull ve/veya checkDeserExWhenValueNull özellikleri true olarak ayarlanır. 
  • Güvenilmeyen kaynakların bir Kafka konusuna yayın yapmasına izin verilir.

Apache Kafka

Apache Software Foundation tarafından geliştirilen Apache Kafka, veritabanları, sensörler ve mobile cihazlar dahil olmak üzere çeşitli kaynaklardan gelen gerçek zamanlı veri akışlarını yakalamak, işlemek, yanıtlamak ve yönlendirmek için tasarlanmış dağıtılmış bir olay akışı platformudur. 

Örneğin, bir ürün ödemesini tamamlamak veya ödeme yapmak gibi müşteri faaliyetlerine tepki veren hizmetlere bildirim akışı sağlayabilir.

Ürün mikro hizmetlerini SMS, anlık bildirim ve e-posta mikro hizmetlerine bağlayan Apache Kafka tabanlı bir veri işleme ardışık düzenini gösteren bir diyagram.

Apache Kafka'da, kayıt veya mesaj olarak da adlandırılan bir olay, veri okunduğunda veya yazıldığında uygulamadaki bir olayı temsil eden bir veri birimi olarak hizmet eder. Her olay bir anahtar, değer, zaman damgası ve isteğe bağlı meta veri başlıkları içerir.

Anahtar-ikili
(null olabilir)
Değer-ikili
(null olabilir)
Sıkıştırma Tipi
[none, gzip, snappy, lz4, zstd]
Üstbilgiler (isteğe bağlı)
AnahtarDeğer
AnahtarDeğer
Bölme + Ofset
Zaman damgası (sistem veya kullanıcı ayarı)

Olaylar dayanıklı bir şekilde depolanır ve konular halinde düzenlenir. Kafka konularına olay gönderen (yazan) istemci uygulamaları üretici olarak adlandırılırken, olaylara abone olan (okuyan ve işleyen) uygulamalar tüketici olarak bilinir. 

Kullanıcı girdisinin bir üretici aracılığıyla nasıl işlendiğini, kaydedildiğini, tüketildiğini ve bir uç noktaya nasıl iletildiğini gösteren bir akış şeması.

Apache Kafka için Spring

Apache Kafka'yı Spring ekosistemine bağlamak için geliştiriciler, Java uygulamalarında entegrasyonu kolaylaştıran Spring for Apache Kafka'yı kullanabilirler.  

Spring for Apache Kafka, Kafka ile olay gönderme ve alma sürecini basitleştiren sağlam araçlar ve API'ler sunarak geliştiricilerin bu görevleri kapsamlı ve karmaşık kodlama yapmadan gerçekleştirmelerini sağlar.

Spring Boot ve Apache Kafka logolarını gösteren ve olay odaklı uygulamalar için entegrasyonu ifade eden bir grafik.

Serileştirme ve Serileştirmeyi Kaldırma

Serileştirme, bir nesnenin durumunu bir dizeye veya bayt akışına dönüştürme mekanizmasıdır. Buna karşılık, serileştirme tersine bir işlemdir ve serileştirilmiş veri tekrar orijinal nesnesine veya veri yapısına dönüştürülür. Serileştirme, karmaşık verilerin bir dosyaya kaydedilebilmesi, bir ağ üzerinden gönderilebilmesi veya bir veritabanında saklanabilmesi için dönüştürülmesini sağlar. Serileştirme ve seriden çıkarma, dağıtılmış sistemlerde veri alışverişi için gereklidir ve bir yazılım uygulamasının çeşitli bileşenleri arasındaki iletişimi teşvik eder. Java'da serileştirme için writeObject(), serileştirmeden çıkarma için ise readObject() kullanılır.

Veri nesnelerinin belleğe, dosyalara veya veritabanlarına nasıl serileştirildiğini ve daha sonra nesnelere nasıl yeniden serileştirildiğini gösteren teknik bir diyagram.

Derileştirme, bir bayt akışının veya dizenin bir nesneye dönüştürülmesine izin verdiğinden, girdi verilerinin yanlış işlenmesi veya uygun şekilde doğrulanmaması, potansiyel olarak bir RCE saldırısına yol açan önemli bir güvenlik açığına neden olabilir.

Güvenlik Açığı Analizi

CVE açıklamasına göre, OPSWAT Bursiyerleri güvenlik açığını tetiklemek için checkDeserExWhenKeyNull ve checkDeserExWhenValueNull öğelerini true olarak yapılandırmıştır. Boş bir anahtar/değer içeren bir kayıt göndererek ve üreticiden bir Kafka kaydı alırken tüketicide hata ayıklama yaparak ayrıntılı bir analiz gerçekleştiren mezun arkadaşlarımız, kayıt işleme sırasında aşağıdaki iş akışını ortaya çıkardılar: 

Adım 1: Kayıtların (Mesajların) Alınması

Tüketici, kayıtları aldıktan sonra invokeIfHaveRecords() yöntemini çağırır ve bu yöntem daha sonra kayıtların fiilen işlenmesi için kayıtlı bir kayıt dinleyicisini ( @KafkaListener ek açıklamasıyla açıklanmış bir sınıf) tetiklemek üzere invokeListener() yöntemini çağırır. 

Olay güdümlü bir sistemde kayıtları işlemek için bir Kafka mesaj dinleyici kapsayıcısını tanımlayan Java kodunun ekran görüntüsü.

invokeListener() daha sonra invokeOnMessage() yöntemini çağırır.

Adım 2: Kayıtların Kontrol Edilmesi

invokeOnMessage() yöntemi içinde, kayıt değeri ve yapılandırma özelliklerine karşı çeşitli koşullar değerlendirilir ve ardından yürütülecek bir sonraki adım belirlenir.

Bir Kafka tüketicisinde mesaj serileştirme için istisna işlemeyi gösteren vurgulanmış bir Java kod parçacığı.

Bir kayıt null anahtar veya değere sahipse ve checkDeserExWhenKeyNull ve/veya checkDeserExWhenValueNull özellikleri açıkça true olarak ayarlanmışsa, kaydı incelemek için checkDeser() yöntemi çağrılacaktır.

Adım 3: Üstbilgilerden İstisnayı Kontrol Etme

checkDesr() işlevinde tüketici, varsa kaydın meta verilerindeki istisnaları almak için sürekli olarak getExceptionFromHeader() işlevini çağırır ve sonucu exception adlı bir değişkende saklar.

Java yöntemi checkDeser, Kafka mesaj işlemede serileştirme istisnalarını ele almak için getExceptionFromHeader'ı çağırır.

Adım 4: Üstbilgilerden İstisna Çıkarma

getExceptionFromHeader() yöntemi, bir Kafka kaydının başlığından bir istisnayı ayıklamak ve döndürmek için tasarlanmıştır. Önce kaydın başlığını alır ve ardından bir bayt dizisinde depolanan başlığın değerini elde eder.

Java yöntemi getExceptionFromHeader, Kafka mesaj başlıklarından serileştirme istisnalarını çıkarır

Daha sonra, başlık değerinin bayt dizisini daha fazla işlem için byteArrayToDeserializationException() yöntemine iletir. 

Adım 5: Verilerin Serileştirilmesi

byteArrayToDeserializationException() işlevinde, resolveClass() işlevi yalnızca izin verilen sınıflarla sınırlandırmak için geçersiz kılınmıştır. Bu yaklaşım, açıkça izin verilmeyen herhangi bir sınıfın serileştirilmesini önler. Başlığın bayt dizisi değeri, byteArrayToDeserializationException() içinde yalnızca DeserializationException sınıfı için serileştirmeye izin veren resolveClass() işlevinde belirlenen koşulu karşılıyorsa serileştirilebilir.

Java yöntemi byteArrayToDeserializationException bir bayt dizisini bir deserialization istisnasına dönüştürür

Ancak, DeserializationException sınıfı standart Exception sınıfını genişletir ve dört parametreli bir kurucu içerir. Son parametre olan cause, IOException veya ClassNotFoundException gibi DeserializationException'ı tetikleyen orijinal istisnayı temsil eder.

DeserializationException için mesaj, veri, anahtar bayrağı ve fırlatılabilir neden parametrelerine sahip Java yapıcısı

Throwable sınıfı, Java'da istisna veya hata olarak atılabilen tüm nesneler için üst sınıf görevi görür. Java programlama dilinde, Throwable, Exception ve Error gibi istisna işleme sınıfları güvenli bir şekilde serileştirilebilir. Bir istisna serileştirildiğinde, Java, Throwable sınıflarının üst sınıflarının normal sınıflara uygulananlardan daha az zorlu kontrollerle yüklenmesine ve örneklenmesine izin verir. 

İş akışına ve kapsamlı analize dayanarak, serileştirilen veriler Throwable üst sınıfından miras alan kötü amaçlı bir sınıfa karşılık geliyorsa, koşul kontrollerini atlayabilir. Bu, zararlı kod çalıştırabilen ve potansiyel olarak bir RCE saldırısıyla sonuçlanabilecek kötü amaçlı bir nesnenin serileştirilmesine izin verir.

İstismar

Bir saldırganın zararlı veri enjekte etmesinden uzaktan kod yürütmeye kadar bir siber saldırı istismar sürecini gösteren diyagram

Analizde belirtildiği gibi, bu güvenlik açığından yararlanmak, Kafka başlık kaydı aracılığıyla tüketiciye gönderilen kötü amaçlı verilerin oluşturulmasını gerektirir. Başlangıçta, saldırganın Throwable sınıfını genişleten kötü amaçlı bir sınıf oluşturması ve ardından uzaktan kod yürütme elde etmek için bir gadget zinciri kullanması gerekir. Gadget'lar uygulama içindeki istismar edilebilir kod parçacıklarıdır ve saldırgan bunları birbirine zincirleyerek zararlı eylemleri tetikleyen bir "sink gadget "a ulaşabilir. 

Aşağıda, Spring for Apache Kafka'daki bu güvenlik açığından yararlanmak için kullanılabilecek kötü amaçlı bir sınıf verilmiştir: 

Java sınıfı CustomExceptionClass, PowerShell komutlarını kullanarak bir yük çalıştırma güvenlik açığı gösteriyor

Ardından, kötü amaçlı sınıfın bir örneği oluşturulur ve DeserializationException sınıfının yapıcısındaki neden parametresine argüman olarak aktarılır. DeserializationException örneği daha sonra bir bayt akışına serileştirilir ve bu akış daha sonra kötü amaçlı Kafka kaydının başlığında değer olarak kullanılır.

Serileştirme istismarları için kötü amaçlı serileştirilmiş bir nesne oluşturmaya yönelik Java sınıfı
Java yöntemi sendMessage bir Kafka mesajı oluşturur ve gönderir, hem anahtar hem de veri null ise kötü amaçlı serileştirilmiş bir yük enjekte eder

Saldırgan, kurbanı kötü niyetli üreticisini kullanması için başarılı bir şekilde kandırırsa, tüketiciye gönderilen Kafka kayıtlarını kontrol edebilir ve sistemi tehlikeye atmak için bir fırsat yaratabilir. 

Kafka mesajları göndermek, bir mesaj formu ve iki üreticiden alınan mesajları göstermek için kullanıcı arayüzü

Savunmasız tüketici, kötü niyetli üreticiden null anahtarlar ve değerler içeren bir Kafka kaydı ve kayıt başlığında kötü niyetli serileştirilmiş bir örnek aldığında, tüketici, serileştirme işlemi de dahil olmak üzere kaydı işler. Bu sonuçta uzaktan kod yürütülmesine yol açarak saldırganın sistemi tehlikeye atmasına olanak tanır.

Terminal ve Kafka mesaj gönderici kullanıcı arayüzü, Windows ortamında bir komut yürütme ile mesaj enjeksiyonunun gösterilmesi

MetaDefender Core'da SBOM ile CVE-2023-34040'ın hafifletilmesi

CVE-2023-34040 ile ilişkili riskleri etkili bir şekilde azaltmak için kuruluşların açık kaynak bileşenleri üzerinde görünürlük ve kontrol sağlayan kapsamlı bir çözüme ihtiyacı vardır.  

MetaDefender Core içindeki temel bir teknoloji olan SBOM, güçlü bir yanıt sağlar. SBOM, kullanılan tüm yazılım bileşenlerinin, kütüphanelerin ve bağımlılıkların kapsamlı bir envanteri olarak hareket ederek, kuruluşların açık kaynaklı bileşenlerini proaktif ve verimli bir şekilde takip etmelerini, güvence altına almalarını ve güncellemelerini sağlar.

Kritik ve yüksek güvenlik açıkları içeren engellenmiş bir XML dosyasını gösteren bir gösterge tablosunun ekran görüntüsü

SBOM ile güvenlik ekipleri şunları yapabilir:

  • Savunmasız bileşenleri hızla bulun: Derileştirme saldırılarından etkilenen açık kaynaklı bileşenleri hemen belirleyin. Bu, savunmasız kütüphanelerin yamalanması veya değiştirilmesi konusunda hızlı hareket edilmesini sağlar. 
  • Proaktif yama ve güncellemeler sağlayın: Derileştirme güvenlik açıklarının önüne geçmek için SBOM aracılığıyla açık kaynaklı bileşenleri sürekli izleyin. SBOM eski veya güvensiz bileşenleri tespit ederek güncellemelerin zamanında yapılmasını sağlar ve saldırılara maruz kalma riskini azaltır. 
  • Uyumluluğu ve raporlamayı sürdürün: SBOM, düzenleyici çerçevelerin yazılım tedarik zincirlerinde şeffaflığı giderek daha fazla zorunlu kılması nedeniyle kuruluşların uyumluluk gereksinimlerini karşılamasına yardımcı olur.

Kapanış Düşünceleri

Deserialization güvenlik açıkları, çok çeşitli uygulamalardan yararlanmak için kullanılabilecek önemli bir güvenlik tehdididir. Bu güvenlik açıkları, bir uygulama kötü amaçlı verileri deserialize ettiğinde ortaya çıkar ve saldırganların keyfi kod çalıştırmasına veya hassas bilgilere erişmesine olanak tanır. Apache Kafka için Spring'deki CVE-2023-34040 güvenlik açığı, deserializasyon saldırılarının tehlikelerini çarpıcı bir şekilde hatırlatmaktadır. 

Deserialization saldırılarını önlemek için OPSWAT MetaDefender Core ve SBOM teknolojisi gibi gelişmiş araçları uygulamak çok önemlidir. Kuruluşlar yazılım tedarik zincirlerinde derin bir görünürlük elde edebilir, güvenlik açıklarının zamanında yamalanmasını sağlayabilir ve kendilerini sürekli gelişen tehdit ortamına karşı koruyabilirler. Açık kaynaklı bileşenleri proaktif olarak güvence altına almak sadece en iyi uygulama değil, modern sistemleri potansiyel istismara karşı korumak için bir gerekliliktir.


Etiketler:

OPSWAT ile Güncel Kalın!

En son şirket güncellemelerini almak için bugün kaydolun, hikayeler, etkinlik bilgileri ve daha fazlası.