Zephyrnet Logosu

OpenSSH, ağ üzerinden girilebilen çift boş bellek hatasını düzeltir

Tarih:

Açık kaynaklı işletim sistemi dağıtımı OpenBSD, sistem yöneticileri arasında, özellikle sunucuları yönetenler arasında hız, özellikler ve şık ön uçlar yerine güvenliğe odaklanmasıyla iyi bilinir.

Belki de uygun bir şekilde logosu bir kirpi balığıdır - şişirilmiş, sivri uçları ortaya çıkabilecek kurnaz bilgisayar korsanlarını püskürtmeye hazır.

Ancak OpenBSD ekibi muhtemelen en çok tüm dağıtımıyla değil, uzaktan erişim araç takımıyla tanınır. OpenSSH 1990'ların sonunda işletim sisteminin kendisine dahil edilmek üzere yazılmıştır.

SSH'nin kısaltması güvenli kabuk, aslen Fin bilgisayar bilimcisi tarafından oluşturuldu Tatu Ylönen 1990'ların ortalarında, sistem yöneticilerini Telnet protokolünü kullanmanın riskli alışkanlığından vazgeçirme umuduyla.

Telnet ile sorun

Telnet son derece basit ve etkiliydi: uzak sunuculara teletip bağlantısı kurmak için fiziksel kabloları bağlamak (veya telefon hattı üzerinden modem kullanmak) yerine, bir TELetype NETwork bağlantısı kullandınız.

Temel olarak, genellikle ayrılmış bir seri bağlantı veya çevirmeli telefon hattı üzerinden ileri geri akan veriler, devre anahtarlamalı bir noktadan noktaya bağlantı yerine paket anahtarlamalı bir TCP ağ bağlantısı kullanılarak internet üzerinden gönderilip alınıyordu. .

Aynı tanıdık oturum açma sistemi, daha ucuz bağlantılar, özel veri hatlarına gerek yok!

Elbette Telnet'teki en büyük kusur, tamamen şifreleme eksikliğiydi, bu nedenle tam terminal oturumunuzu algılamak önemsizdi ve korsanların yazdığınız her komutu görmesine izin veriyordu (hatta yaptığınız hatalar ve her zaman vurduğunuz zaman). [Backspace]) ve üretilen çıktının her baytı…

…ve tabii ki oturumun başındaki kullanıcı adınız ve şifreniz.

Ağ yolunuzdaki herhangi biri, sysadmin oturumlarınızı kendi ekranlarında kolayca gerçek zamanlı olarak yeniden oluşturmakla kalmaz, aynı zamanda muhtemelen uzak sunucuya gönderdiğiniz komutları değiştirerek ve yanıtların geri geldiğini taklit ederek siz farketmeyerek oturumunuzu kurcalayabilir. hile

Hatta bir sahtekarlık sunucusu kurabilir, sizi ona çekebilir ve aldatmacayı fark etmenizi şaşırtıcı derecede zorlaştırabilirler.

Güçlü şifreleme FTW

Ylönen'in SSH'si, Telnet benzeri bir oturumun her iki ucuna güçlü bir şifreleme ve kimlik doğrulama katmanı eklemeyi amaçlıyordu. güvenli kabuk (neredeyse herkes sadece onu çağırsa da, hiç merak ettiyseniz, adın anlamı budur. ess-ess-ayt bugünlerde).

Anında bir hit oldu ve protokol, her yerdeki sistem yöneticileri tarafından hızla benimsendi.

Bunu kısa bir süre sonra, yukarıda belirttiğimiz gibi, OpenSSH izledi ve ilk olarak 1999'un sonlarında Açık BSD 2.6 bırakın.

OpenBSD ekibi, protokolün ücretsiz, güvenilir, açık kaynaklı bir uygulamasını oluşturmak istedi ve başkası kullanabilir, Ylönen'in piyasaya sürülmesinden hemen sonraki yıllarda orijinal uygulamasını engelleyen herhangi bir lisanslama veya ticari zorluk olmadan.

Aslında, Windows SSH sunucusunu çalıştırıyorsanız ve şu anda bir Linux bilgisayardan sunucuya bağlanıyorsanız, neredeyse kesinlikle her iki uçta da OpenSSH uygulamasına güvenirsiniz.

SSH protokolü ayrıca SCP ve SFTP'nin kısaltması olan diğer popüler istemci-sunucu hizmetlerinde de kullanılır. güvenli kopya ve güvenli FTP sırasıyla. SSH kabaca "Güvenli bir şekilde bağlanın ve diğer uçta bir komut SHell çalıştırın" anlamına gelir, tipik olarak etkileşimli oturum açmalar için, çünkü bir komut kabuğu için Unix programı genellikle /bin/sh. SCP benzerdir, ancak CoPying dosyaları için, çünkü Unix file-copy komutu genellikle /bin/cpve SFTP hemen hemen aynı şekilde adlandırılır.

OpenSSH, şehirdeki tek SSH araç takımı değildir.

Diğer iyi bilinen uygulamalar şunları içerir: libssh2, kendi uygulamalarında SSH desteği oluşturmak isteyen geliştiriciler için; Ayı, Avustralyalı kodlayıcıdan sadeleştirilmiş bir SSH sunucusu mat johnston ev yönlendiricileri ve yazıcılar gibi sözde IoT (Nesnelerin İnterneti) cihazlarında yaygın olarak bulunan; ve PuTTYbağımsız açık kaynak geliştiriciden Windows için popüler, ücretsiz SSH ile ilgili araçlar koleksiyonu Simon Tatham İngiltere.

Ancak, normal bir SSH kullanıcısıysanız, bugün neredeyse kesinlikle en az bir OpenSSH sunucusuna bağlandınız, çünkü çoğu çağdaş Linux dağıtımı bunu standart uzaktan erişim aracı olarak içeriyor ve Microsoft hem bir OpenSSH istemcisi hem de bir OpenSSH sunuyor. sunucusu bugünlerde resmi Windows bileşenleri olarak.

Çift ücretsiz hata düzeltmesi

OpenSSH sürüm 9.2 yeni çıktı ve sürüm notları aşağıdaki gibi rapor edin:

Bu sürüm […] bir bellek güvenliği sorunu için düzeltmeler içerir. [Bu hatanın] istismar edilebilir olduğuna inanılmamaktadır, ancak ağ üzerinden erişilebilen bellek hatalarının çoğunu güvenlik hataları olarak rapor ediyoruz.

Hata etkiler sshd, OpenSSH sunucusu ( -d sonek şu anlama gelir: daemon, Windows'un çağırdığı arka plan işlemi türünün Unix adı hizmet):

sshd(8): OpenSSH 9.1'de tanıtılan ön kimlik doğrulama çift boş bellek hatasını düzeltin. Bunun istismar edilebilir olduğuna inanılmamaktadır ve chroot(2)'ye tabi olan ayrıcalıksız ön kimlik doğrulama sürecinde meydana gelir ve çoğu büyük platformda ayrıca korumalı alana alınır.

Çift serbest hata, programınızın diğer bölümlerinde yeniden kullanılmak üzere işletim sistemine zaten iade ettiğiniz bir bellek bloğu anlamına gelir…

...daha sonra programın, artık o hafızanın "sahibi" olmayan, ancak öyle olmadığını bilmeyen bir bölümü tarafından tekrar geri verilecektir.

(Veya bir hatayı açmak için kasıtlı olarak hatayı kışkırtmaya çalışan kodun isteminde kasıtlı olarak geri verilir. güvenlik açığı Içine sömürmek.)

Bu, özellikle sistem serbest bırakılan bloğu ilk blok açıldığında kullanılabilir olarak işaretlerse, ince ve çözülmesi zor hatalara yol açabilir. free() olursa, daha sonra bellek istediğinde kodunuzun başka bir bölümüne tahsis eder. malloc() ve ardından gereksiz çağrı yapıldığında bloğu bir kez daha serbest olarak işaretler. free() görüntülenir.

Bu sizi, bir otele giriş yaptığınızda, “Aa, iyi haber! Dolu olduğumuzu düşündük, ancak başka bir konuk erken ayrılmaya karar verdi, böylece odalarını alabilirsiniz.”

İçeri girdiğinizde oda özenle temizlenip yeni misafirler için hazırlanmış olsa ve bu nedenle oda sizin özel kullanımınız için uygun şekilde tahsis edilmiş gibi görünse bile, önceki konuğun anahtar kartının gerçekten de doğru bir şekilde iptal edildiğinden ve "" erken ödeme”, aynı gün daha sonra gizlice geri dönüp dizüstü bilgisayarınızı çalmak için kurnaz bir numara değildi.

Hata düzeltme için hata düzeltme

İronik olarak, en son OpenSSH kod geçmişine bakarsanız, OpenSSH'nin adlı bir işlevde mütevazı bir hata olduğunu göreceksiniz. compat_kex_proposal(), bir bağlantı kurarken ne tür bir anahtar değişim algoritmasının kullanılacağını kontrol etmek için kullanılır.

Ancak bu mütevazı hatayı düzeltmek, bunun yerine daha ciddi bir güvenlik açığı ortaya çıkardı.

Bu arada, bir bağlantının kurulması sırasında kullanılan yazılımın bir bölümünde hatanın bulunması, bunu sözde yapan şeydir. ağa erişilebilen ön kimlik doğrulama güvenlik açığı (veya ön yetkilendirme hatası kısaca).

Çift serbestlik hatası, çalışması gereken kodda olur sonra bir müşteri bir uzak oturum başlattı, ancak önce herhangi bir anahtar anlaşması veya kimlik doğrulama gerçekleşti, bu nedenle güvenlik açığı, teoride, doğrulama için herhangi bir parola veya kriptografik anahtar sunulmadan önce tetiklenebilir.

OpenSSH 9.0'da, compat_kex_proposal şöyle bir şeye benziyordu (burada büyük ölçüde basitleştirilmiş):

char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }

Buradaki fikir, arayanın, bir anahtar değiştirme ayarını öneren bir metin dizesi içeren kendi bellek bloğundan geçmesi ve gönderdikleri öneriyi kullanma onayını veya güncellenmiş bir öneriyle yeni tahsis edilmiş bir metin dizisini geri almasıdır. .

Hata şu ki, 1. koşul yanlış ancak 2. ve 3. koşulların her ikisi de doğruysa, kod iki yeni metin dizeleri, ancak yalnızca döndürür bir.

Tarafından ayrılan bellek bloğu allocatenewstring1() asla serbest kalmaz ve işlev geri döndüğünde, bellek adresi sonsuza kadar kaybolur, bu nedenle herhangi bir kodun free() gelecekte.

Bu blok esasen terk edildi ve bilinen şeye neden oldu. bellek sızıntısı.

Bu, zamanla sorunlara neden olabilir, hatta belki de aşırı bellek yüklemesinden kurtulmak için sunucuyu kapanmaya zorlayabilir.

OpenSSH 9.1'de, iki diziyi ayırmayı ve birini terk etmeyi önlemek amacıyla kod güncellendi:

/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }

Bunda çift serbestlik hatası vardır, çünkü koşul 1 ve koşul 2'nin her ikisi de yanlışsa ancak koşul 3 doğruysa, o zaman kod, yanıt olarak geri göndermek üzere yeni bir dizi tahsis eder...

…ancak arayanın orijinal olarak ilettiği dizeyi yanlış bir şekilde serbest bırakır, çünkü işlev allocatenewstring1() değişkeni güncellemek için asla çağrılmaz suggestion.

Aktarılan öneri dizesi arayana ait hafızadırve bu nedenle arayan kişi daha sonra kendilerini serbest bırakarak çifte serbest tehlikeye yol açacaktır.

OpenSSH 9.2'de kod, kullanılan üç olası bellek bloğunun tümünü takip ederek daha temkinli hale geldi: orijinal suggestion (başkasına ait bellek) ve yolda tahsis edilebilecek iki olası yeni dizi:

/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }

1. koşul doğruysa, iletilen dizenin yeni bir kopyası kullanılır, böylece arayan kişi daha sonra free() geçtikleri dizenin hafızasını istedikleri zaman.

Koşul 1'i geçersek ve koşul 2 doğru, ancak koşul 3 yanlışsa, o zaman tarafından oluşturulan alternatif öneri allocatenewstring1() iade edilir ve iletilen suggestion dize yalnız bırakılır.

2. koşul yanlış ve 3. koşul doğruysa, yeni bir dize oluşturulur ve döndürülür ve iletilen suggestion dize yalnız bırakılır.

Hem koşul 2 hem de koşul 3 doğruysa, yol boyunca iki yeni dizi tahsis edilir; ilki ihtiyaç olmadığı için serbest kalır; ikincisi iade edilir; ve geçen suggestion dize yalnız bırakılır.

Yapabilirsin RTxM teyit etmek için ararsanız free(newone) ne zaman newone is NULL, ardından "hiçbir işlem gerçekleştirilmez", çünkü free(NULL). Bununla birlikte, birçok programcı hala aşağıdaki gibi kodlarla buna karşı sağlam bir şekilde koruma sağlar: if (ptr != NULL) { free(ptr); }.

Ne yapalım?

OpenSSH ekibinin önerdiği gibi, bu hatadan yararlanmak zor olacak, en azından sınırlı ayrıcalıklar nedeniyle sshd program, kullanım için bağlantıyı kurarken sahiptir.

Yine de, bunu bir güvenlik açığı olarak bildirdiler çünkü öyleydi, bu yüzden güncelleme yaptığınızdan emin olun. OpenSSH 9.2.

Ve C'de kod yazıyorsanız, ne kadar deneyimli olursanız olun, bellek yönetiminde yanılmanın çok kolay olduğunu unutmayın...

…bu yüzden dikkatli olun.

(Evet, Rust ve modern arkadaşları doğru kodu yazmanıza yardımcı olur, ancak bazen yine de C'yi kullanmanız gerekir ve Rust bile bunu garanti edemez. yanlış kod yazmayı bırak eğer tedbirsizce program yaparsanız!)


spot_img

En Son İstihbarat

spot_img