Ciddi Güvenlik: GnuTLS, OpenSSL'yi izler, zamanlama saldırısı hatasını düzeltir

Ciddi Güvenlik: GnuTLS, OpenSSL'yi izler, zamanlama saldırısı hatasını düzeltir

Kaynak Düğüm: 1956368

Geçen hafta, bir sürü hakkında yazdık bellek yönetimi hataları popüler OpenSSL şifreleme kitaplığının en son güvenlik güncellemesinde düzeltildi.

Bu bellek hatalarının yanı sıra, CVE-2022-4304: Oracle'ı RSA Şifre Çözmede Zamanlama.

Bu hatada, aynı şifreli mesajı bir sunucuda tekrar tekrar ateşlemek, ancak verilerin sonundaki dolguyu değiştirerek verileri geçersiz kılmak ve böylece bir tür öngörülemeyen davranışa neden olmak…

…işlemin veri aktarım kısmının ne kadar süreceğini güvenilir bir şekilde tahmin edebileceğiniz ağdaki hedefe yakın olduğunuzu varsayarsak, tutarlı bir süre almaz.

Tüm veriler eşit şekilde işlenmez

Bir isteği başlatırsanız, yanıtın ne kadar sürdüğünü ve ağ verilerinin düşük düzeyde gönderilip alınmasında harcanan süreyi çıkarırsanız, sunucunun isteği işlemek için dahili hesaplamasını yapmasının ne kadar sürdüğünü bilirsiniz. .

Ağda ne kadar zaman kullanıldığından emin olmasanız bile, çok sayıda istekte bulunarak ve çok sayıda örnek toplayarak gidiş-dönüş sürelerindeki farklılıkları arayabilirsiniz.

Ağ, ağ ek yükünün büyük ölçüde sabit olduğunu varsayacak kadar güvenilirse, hangi tür veri değişikliğinin ne tür ekstra işlem gecikmesine neden olduğunu anlamak için istatistiksel yöntemler kullanabilirsiniz.

Bundan, tekrarlanan her istekte gizli tutulması gereken orijinal şifrelenmemiş verilerin yapısı ve hatta içeriği hakkında bir şeyler çıkarabileceksiniz.

Yalnızca bir bayt düz metin çıkarabilseniz bile, bunun olmaması gerekiyor.

Sözde zamanlama saldırıları Milyonlarca sahte paket göndermeniz ve yalnızca bir baytlık düz metin verisini kurtarma şansına sahip olmak için hepsini zamanlamanız gerekse bile, bu türden dosyalar her zaman zahmetlidir...

…çünkü ağlar daha hızlı, daha öngörülebilir ve birkaç yıl öncesine göre çok daha fazla yükü kaldırabiliyor.

Diyelim ki sonraki bir saat içinde size spam gönderilen milyonlarca hain paketin bir başparmak gibi göze çarpacağını düşünebilirsiniz.

Ancak "normalden az ya da çok saatte bir milyon paket" artık özellikle büyük bir varyasyon değil.

GnuTLS'deki benzer "oracle" hatası

OpenSSL'deki en son hata zamanlaması hatasını bildiren aynı kişi, aynı zamanda bir GnuTLS'deki benzer hata aynı anda.

Bunun hata tanımlayıcısı var CVE-2023-0361.

GnuTLS, OpenSSL kadar popüler veya yaygın olarak kullanılmasa da, muhtemelen BT ortamınızda, hatta kendi bilgisayarınızda onu kullanan veya içeren, muhtemelen FFmpeg, GnuPG, Mplayer, QEMU dahil olmak üzere birkaç programınız vardır. , Rdesktop, Samba, Wget ve Wireshark.

İronik bir şekilde, GnuTLS'deki zamanlama kusuru, en başta zamanlama saldırısı hatalarını günlüğe kaydetmesi gereken kodda ortaya çıktı.

Kod farkından da görebileceğiniz gibi (fark) aşağıda, programcı herhangi bir koşullu (if ... then) bir şifre çözme hatasını kontrol etme ve çözmede kullanılan işlem, zamanlama varyasyonlarına neden olabilir, çünkü CPU'lar genellikle kodunuzun bir "dal" talimatından sonra hangi yöne gittiğine bağlı olarak farklı bir süre alır.

(Bu, özellikle genellikle bir yöne giden ve nadiren diğerine giden bir dal için geçerlidir, çünkü CPU'lar performansı artırmak için tekrar tekrar çalışan kodu hatırlama veya önbelleğe alma eğilimindedir, böylece nadiren alınan kodun algılanabilir şekilde daha yavaş çalışmasına neden olur.)

3.7.8'a karşı gnutls-3.7.9/lib/auth/rsa.c kod farkı

Ancak programcı yine de bir saldırının meydana gelebileceğini günlüğe kaydetmek istedi; if (ok) yukarıdaki test başarısız olur ve else { ... } Bölüm.

Bu noktada, kod şunu çağırır: _gnutls_debug_log() işini yapması epey zaman alabilecek bir işlev.

Bu nedenle kodlayıcı kasıtlı bir çağrı ekledi. _gnutls_no_log() içinde then { ... } Kodun her iki yönde de harcadığı zamanı eşitlemeye çalışmak için, bir "saldırı" yokken günlüğe kaydetmiş gibi görünen kodun bir parçası. if (ok) dal talimatı alabilir.

Bununla birlikte, görünüşe göre, iki kod yolu, kullanıldıkları süre içinde (veya belki de _gnutls_debug_log() işlevi kendi başına, farklı türden hatalarla baş etmede yeterince tutarlı değildi) ve bir saldırgan, bir milyon kadar denemeden sonra şifre çözme göstergelerini ayırt etmeye başlayabilirdi.

Ne yapalım?

Bir programcıysanız: buradaki hata düzeltmesi basitti ve "az çoktur" ilkesini izliyordu.

Zaten çok yararlı saldırı tespit verileri vermediği düşünülen yukarıdaki pembe kod, derleme ayarlarınız ne olursa olsun, orada olmayan kodun yanlışlıkla derlenemeyeceği gerekçesiyle basitçe silindi…

...ve içinde derlenmemiş kodlar, ister tesadüfen ister tasarımdan olsun, asla çalışamaz.

Bir GnuTLS kullanıcısıysanız: son çıkan sürüm 3.7.9 ve “yeni ürün aroması” 3.8.0 bu düzeltmeyi, çeşitli diğerleriyle birlikte dahil edin.

Bir Linux dağıtımı çalıştırıyorsanız, sahip olduğunuz GnuTLS'nin herhangi bir merkezi olarak yönetilen paylaşılan kitaplık sürümünün güncellemelerini ve kendi sürümlerini getiren uygulamaları kontrol edin.

Linux'ta, şu ada sahip dosyaları arayın: libgnutls*.so Ortalıkta bulunan paylaşılan kitaplıkları bulmak ve aramak için gnutls-cli genellikle kitaplığa dahil olan komut satırı yardımcı programının tüm kopyalarını bulmak için.

Koşabilirsin gnutls-cli -vv hangi sürümünü öğrenmek için libgnutls dinamik olarak şuna bağlıdır:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- Linux dağıtımım güncellemeyi geçen Cuma (2023-02-10) aldı

Zaman Damgası:

Den fazla Çıplak Güvenlik