Xlera8

Chrome sıfır gün: "Bu açıktan yararlanma çok yaygın", bu nedenle sürümünüzü şimdi kontrol edin

Google'ın en son Chrome güncellemesi çıktı ve bu sefer şirket sözünü kesmedi içerdiği iki güvenlik yamasından biri hakkında:

Google, bir istismarın farkındadır. CVE-2023-3079 vahşi doğada bulunur.

Daha önce Google'da sık sık gördüğümüz gibi, şirketin bir istismara ilişkin "raporların farkında olduğunu" söylemek için iki dereceli ayırma lafı yok.

Hata raporunun doğrudan Google'ın kendi Tehdit Araştırma Grubu'ndan geldiği düşünülürse, bu sefer "kendimiz farkındayız", bu daha da açık bir şekilde "biz konuşurken dolandırıcıların bunu kötüye kullandığını biliyoruz" anlamına gelir.

Her zaman olduğu gibi bu, Google'ın Chrome'un önceden bilinmeyen bir güvenlik açığı tarafından yönlendirildiği aktif bir saldırıyı (Google'ın kendisine mi yoksa harici bir kuruluşa mı olduğunu bilmiyoruz) araştırdığı anlamına gelir.

Hata basitçe şöyle tanımlanır: V8'de Karışıklık yazın. (Anlaşılır bir şekilde, Google bu aşamada bundan fazlasını söylemiyor.)

Daha önce açıkladığımız gibi bir tür karışıklığı hata, bir programa ayrıştırması, doğrulaması, işlemesi ve tek bir şekilde hareket etmesi gereken bir veri yığını sağladığınızda olur…

…ancak daha sonra, verileri farklı, yetkisiz, doğrulanmamış ve potansiyel olarak tehlikeli bir şekilde yorumlaması için programı kandırmayı başarırsınız.

Tip karışıklığı tehlikeleri açıklandı

C'de bir program yazdığınızı hayal edin. (C'yi bilip bilmemeniz önemli değil, yine de devam edebilirsiniz.)

C'de, genellikle değişkenleri ayrı ayrı bildirirsiniz, böylece yalnızca depolanabilecekleri belleği ayırmakla kalmaz, aynı zamanda programa bu değişkenlerin nasıl kullanılması gerektiğini de bildirirsiniz.

Örneğin:

 uzun uzun int JulianDayNumber; imzalı karakter* MüşteriAdı;

İlk değişken bildirimi, astronomik gün sayısını temsil eden düz eski bir tamsayı değerini depolamak için 64 bit ayırır. (Merak ettiyseniz, bu öğleden sonra JDN 23157 – Jülyen Günleri öğlen başlar, gece yarısı değil, çünkü gökbilimciler genellikle geceleri çalışırlar ve gece yarısı çalışma günlerinin ortasıdır.)

İkincisi, bir müşterinin adının metin dizisinin bulunabileceği bir bellek adresini depolamak için 64 bit ayırır.

Tahmin edebileceğiniz gibi, bu iki değeri karıştırmamanız daha iyi olur, çünkü 23157 gibi bir gün numarası olarak kullanmak için mantıklı ve güvenli bir sayı, bir bellek adresi olarak kullanmak neredeyse kesinlikle güvensiz olacaktır.

Çalışan bir Windows programının bu bellek dökümünden de görebileceğiniz gibi, kullanıma ayrılan en düşük bellek adresi şu adresten başlar: 0x00370000ondalık olarak 3,604,480 olan, herhangi bir mantıklı gün sayısından çok daha büyük.

Windows tarafından kullanılan gerçek bellek adresleri, dolandırıcıların bellek düzeninizi tahmin etmesini zorlaştırmak için zaman içinde rastgele değişir; bu nedenle, aynı programı çalıştırırsanız, değerler elde edersiniz, ancak yine de benzer olurlar:

Ve (yukarıdaki görüntünün altında olmasına rağmen) bu program çalıştırıldığında çalışma zamanı kullanıcı verileri bölümünün bellek adresleri 0x01130000 için 0x01134FFF22 Temmuz 44631 ile 16 Ağustos 44687 arasındaki beklenmedik tarih aralığını temsil eder.

Aslında, bu iki değişkeni karıştırmaya çalışırsanız, derleyici sizi uyarmaya çalışmalıdır, örneğin şöyle:

 JulianDayNumber = MüşteriAdı; MüşteriAdı = JulianDayNumber; uyarı: atama, atama olmadan işaretçiden tamsayı yapar uyarı: atama, atama olmadan tamsayıdan işaretçi yapar

Şimdi, daha önce C'de programlama yaptıysanız, kolaylık sağlamak için değişkenleri birden çok farklı yorumla bildirebileceğinizi bileceksiniz. union anahtar kelime, bunun gibi:

 birleşim { uzun uzun int JulianDayNumer; imzalı karakter* MüşteriAdı; } veri;

Artık bellekte tam olarak aynı değişkene iki farklı şekilde başvurabilirsiniz.

Eğer yazarsan data.JulianDayNumber, saklanan verileri sihirli bir şekilde bir tamsayı olarak yorumlarsınız, ancak yazarken data.CustomerName aynı saklanan verilere erişiyor olsanız bile derleyiciye bir bellek adresine başvurduğunuzu söyler.

Yaptığınız şey, aşağı yukarı, derleyiciye, sahip olduğunuz verileri bazen bir tarih olarak ve diğer zamanlarda bir hafıza adresi olarak ele alacağınızı ve bunun hangi yorumun hangi anda geçerli olduğunu hatırlama sorumluluğunu alıyorsunuz kodda.

olarak bilinen ikinci bir değişkene sahip olmaya karar verebilirsiniz. tag (tipik olarak bir tam sayı) union şu anda ne tür verilerle çalıştığınızı takip etmek için, örneğin:

 yapı { int etiketi; birleşim { uzun uzun int JulianDayNumer; imzalı karakter* MüşteriAdı; } veri; } değer;

Buna ne zaman karar verebilirsiniz value.tag ayarlandı 0, veriler henüz kullanım için başlatılmadı, 1 bir tarih sakladığınız anlamına gelir, 2 bunun bir bellek adresi olduğu anlamına gelir ve başka herhangi bir şey bir hata olduğunu gösterir.

Pekala, kimsenin bununla uğraşmasına izin vermesen iyi olur. value.tag aksi takdirde programınız önemli ölçüde yanlış davranabilir.

Daha endişe verici bir örnek şöyle bir şey olabilir:

 yapı { int etiketi; // 1 = hash, 2 = fonksiyon işaretçileri union { unsigned char hash[16]; // ya rasgele bir hash depolar struct { void* openfunc; // veya dikkatlice doğrulanmış iki void* closefunc; // daha sonra yürütülecek kod işaretçileri } valide; } } değer;

Şimdi, aynı bellek bloğunu aşırı yüklüyoruz, böylece bazen onu 16 baytlık bir hash depolamak için ve bazen de programımızın daha sonra çağıracağı işlevlere yönelik iki adet 8 baytlık işaretçiyi depolamak için kullanabiliriz.

Açıkçası, ne zaman value.tag == 1, yazılımımızın herhangi bir 16 baytlık dizeyi birleştirme için ayrılmış belleğe depolamasına izin vermekten memnuniyet duyarız, çünkü karmalar sözde rasgeledir, bu nedenle herhangi bir bayt koleksiyonu eşit derecede olasıdır.

Ama ne zaman value.tag == 2, kullanıcının daha sonra yürütmek üzere doğrulanmamış, güvenilmeyen, bilinmeyen işlev adresleri sağlamasına izin vermemek için kodumuzun çok dikkatli olması gerekir.

Şimdi, etiket 1'e ayarlıyken bu koda bir değer gönderebildiğinizi, bu nedenle kontrol edilmediğini ve doğrulanmadığını hayal edin…

…ancak daha sonra, program saklanan değeri fiilen kullanmadan hemen önce, kodu kandırarak etiketi 2'ye çevirmeyi başardınız.

Kod daha sonra, doğrulanmamış işlev adreslerinizi "bilinen ve zaten güvenli olduğu doğrulanmış" olarak kabul eder (güvenli olmasalar bile) ve program yürütmeyi bellekte önceden sinsice seçmiş olduğunuz hileli bir konuma güvenle gönderir.

Her ne kadar yapmacık ve basitleştirilmiş bir örnek kullanılsa da, bir tür karışıklığı hatasında olan şey budur.

Tek bir şekilde ele alınırsa tüketilmesi güvenli olacak olan bellek, alternatif, güvenli olmayan bir şekilde işlenmek üzere programa kötü niyetli bir şekilde teslim edilir.

Ne yapalım?

Chrome veya Chromium'un en son sürümüne sahip olduğunuzdan emin olun.

Chrome'u istiyorsun 114.0.5735.106 veya daha sonra Mac ve Linux'ta ve 114.0.5735.110 veya daha sonra Windows'ta.

Chromium tabanlı Microsoft Edge de bu hatadan etkileniyor.

Microsoft şu ana kadar [2023-06-06T16:25:00Z] dikkat

Microsoft, vahşi ortamda var olan son istismarların farkındadır. Bir güvenlik yaması yayınlamak için aktif olarak çalışıyoruz.

Edge şu anda 114.0.1823.37 sürümünde olduğundan, numaralandırılmış her şey ondan sonra Microsoft'un CVE-2023-3079 yamalarını içermelidir.

Sürümünüzü kontrol etmek ve henüz almadığınız bir güncelleme varsa zorlamak için:

  • Google Chrome. Üç noktalı menü (⋮) > Destek > Chrome hakkında.
  • Microsoft Edge. Ayarlar ve daha fazlası (…) > Yardım ve geri bildirim > Microsoft Edge hakkında.

Rica ederim.


Bizimle sohbet

Merhaba! Size nasıl yardım edebilirim?