libssh CVE-2018-10933 Zafiyeti

libssh

SSH Nedir? Neden Gereksinim Duyuldu?

Bilgisayar ağlarının bir araya gelmesiyle oluşan İnternet, hayatımıza girdikten sonra birçok değişim ve gelişim meydana geldi. Eskiden sadece askeri amaç için kullanılan İnternet, artık günümüzde insanlar için gerek araştırma, gerekse iletişim, gerekse keyfi amaç için hizmet vermektedir.

Bununla beraber, internetin günümüzde evlere kadar girmesiyle birlikte, internet güvenliğinin nasıl sağlanacağı konusunu ortaya çıkarmıştır. Bir örnek vermek gerekirse, için eskiden yaygın olarak Telnet protokolü, bir cihazı uzaktaki başka bir cihaz ile haberleştirmek kullanılırdı. Telnet’in uzaktaki cihaz bağlantısı için şifreleme kullanmaması , beraberinde MITM(Ortadaki adam saldırılarını) beraberinde getirdi. Yani iki cihazın iletişimi sırasında araya giren saldırgan, bu iki cihazın iletişimini kendi üzerinden geçirerek tüm iletişimi düz metin(cleartext) olarak okuyabilmekteydi.

Telnet’in herhangi bir şifreleme kullanmaması nedeniyle, araya girecek saldırganlara karşı yeni bir protokolün ortaya çıkması gereksinimi doğurdu. Günümüzde yaygın olarak kullanılan SSH da tam olarak bu sebeple ortaya çıktı.

SSH (Secure Shell) bizlere bu anlamda, şifrelenmiş biçimde, veri bütünlüğü sağlanmış bir ortam oluşturan ve istemci-sunucu arasında kimlik doğrulamak için güçlü araçlar sağlayan, Telnet’e alternatif bir protokol olarak karşımıza çıkmaktadır. Bu prokotokolü barındıran iki cihazın arasına girmek isteyen bir saldırgan, cihazlar arasındaki iletişime girse bile artık iletişim üzerinden akan parola ve kullanıcı ismi gibi metinleri açık olarak göremeyecektir.

 

libssh Nedir?

Libssh, yukarıda bahsettiğimiz SSH protokolünü kullanarak programlar yazmamızı sağlayan, çoklu-platform tarafından kullanılan bir C kütüphanesidir. Bu kütüphaneyi kullanarak, programları uzaktan çalıştırabilir, dosyaları aktarabilir veya uzakta bulunan uygulamalarınız için güvenli ve şeffaf bir tünel kullanabileceğimiz bir ortam sağlayabiliriz.

 

libssh Nerelerde Kullanılır

Libssh genel olarak;

  • SFTP dosya aktarımı
  • GitHub’da Git SSH sunucusuna bağlanmak
  • Uzak masaüstü bağlantısı
  • İki yönlü dosya senkronizasyonu
  • Soket oluşturmak
  • Bir bilgisayar ağı üzerinden sesli ve görüntülü iletişim sağlayan bir dizi protokolü (H323 vb.) tanımlamak
  • Anahtar Değişim Yöntemleri, Açık Anahtarlı Algoritmalar ve Şifreleme Algoritmaları
  • MAC hashlerini oluşturmak ve benzeri işlemler

için kullanılır.

 

Temel libssh Fonksiyonları ve Kullanımı

Libssh’da, SSH bağlantısı oluşturmak için ssh_new() fonksiyonu kullanılır. Bu fonksiyon ssh_session nesnesine bir işaretçi, NULL veya hata dönderir. Bununla birlikte ssh_free() fonksiyonuyla nesneye ait hafıza alanı serbest bırakılır.

libssh

Bağlantının seçeneklerini ayarlamak için ssh_options_set () fonksiyonu kullanılır.

  • SSH_OPTIONS_HOST: Bağlanmak istediğiniz ana bilgisayarın adıdır.
  • SSH_OPTIONS_PORT: Kullanılan bağlantı noktasıdır. (varsayılan bağlantı noktası 22’dir).
  • SSH_OPTIONS_USER: Bağlanmak istediğiniz sistem kullanıcısıdır.
  • SSH_OPTIONS_LOG_VERBOSITY: Yazdırılan mesajların miktarını belirler.

Tüm bağlantı seçenekleri listesi için;

http://api.libssh.org/stable/group__libssh__session.html#ga7a801b85800baa3f4e16f5b47db0a73d

adresini kullanabilirsiniz. ssh_option_set() fonksiyonu için tek zorunlu doldurulacak alan SSH_OPTIONS_HOST alanıdır. SSH_OPTIONS_USER kullanmıyorsanız, hesabınızın yerel kullanıcı adı kullanılacaktır.

Tüm ayarlar yapıldıktan sonra ssh_connect () kullanarak bağlanabilirsiniz. Fonksiyon, bağlantı sorunsuz kurulduysa SSH_OK, aksi halde SSH_ERROR dönderir. Kullanıcıya neyin yanlış gittiğini göstermek için ssh_get_error () fonksiyonu ile hata dizesini alabilirsiniz. Bağlantı bağlantıyı sonlandırmak için ssh_disconnect() fonksiyonu kullanabilirsiniz.

Libssh’da bir sunucuyu doğrulamak için iki farklı yol vardır.

İlk yol, ssh_session_is_known_server () fonksiyonunu kullanmaktır. Bu fonksiyon bilinen ana bilgisayar dosyasına (UNIX’te ~/.ssh /known_hosts) bakacak, sunucu ana makine adının modelini arayacak ve bu ana bilgisayarın listede bulunup bulunmadığını belirleyecektir.

İkinci yol ise, Ortak anahtar karma değerinin ikili bir sürümünü almak için ssh_get_pubkey_hash () fonksiyonunu kullanmaktır. Bu ortak anahtarın bilinip ve güvenli olup olmadığını kontrol etmek için kendi veritabanınızı kullanabilirsiniz. Ortak anahtar karma değerinin ne olduğunu bilmesi durumunda, genel anahtar karma değerini kullanıcıya göstermek için yine bu fonksiyonu kullanabilirsiniz.

Kimlik doğrulama süreci, bir servis sağlayıcının bir kullanıcıyı tanımlayabilmesi ve kimliğini doğrulayabilmesidir. Yetkilendirme işlemi, kimliği doğrulanmış kullanıcının kaynaklara erişimini sağlamakla ilgilidir. Libssh’da bir kullanıcı kimliği doğrulamak için birden fazla yöntem mevcuttur.

  • None yönteminde, mevcut kimlik doğrulama yöntemlerini almayı sağlar. Ayrıca, sunucuya sadece giriş bilgilerini kullanarak kullanıcının kimliğini doğrulama şansı verir. Bazı eski donanımlar, kullanıcıyı “SSH üzerinden” telnet tarzı giriş yapma konusunda geri döndürmek için bu özelliği kullanır.
  • Şifre yönteminde, parola sunucuya gönderilir.Sunucu kabul edip etmeyeceğine karar verir.
  • Klavye Etkileşimli yöntemde sunucu, kullanıcıya doğru cevap vermesi gereken çeşitli parametreleri sorular gönderir. Doğru cevap veren kullanıcı, sunucuda kimlik doğrulamasını geçmiş olur.
  • Açık Anahtar yönteminde, host, kullanıcının genel anahtarını bilir ve kullanıcının ilişkili özel anahtarı bildiğini kanıtlaması gerekir. Bu işlemi manuel olarak yapılabilir veya SSH aracısına verilebilir.

Doğrulama için bu yöntemler ayrı ayrı kullanılabildiği gibi ,aynı anda birden fazla yöntem de içerebilir.

 

CVE-2018-10933 Zafiyeti Nasıl Oluştu?

Libssh kütüphanesinin bizler için oluşturduğu tüm bu kolaylıkların yanında, doğru kullanılmaması veya yanlış kodlanması sebebiyle kod üzerinde bir açıklık bulunması halinde, kurumların/bireylerin zarara uğramasına sebep olabilmektedir.

Bunun bir örneğini geçtiğimiz günlerde Libssh üzerinde yanlış bir kodlama nedeniyle oluşan CVE-2018-10933 adlı güvenlik açığı tespit edildi. Libssh 0.6 ve üzerinde bulunan bu güvenlik açığı ile, bu açıklığı barındıran sunucunun kimlik doğrulamasını atlatarak herhangi bir parola bilgisi dahi bilmeden sistem üzerinde yetkili bir kişi konumuna getirebilmektedir.

Bu güvenlik açığı, basit olarak şu şekilde gerçekleşmektedir.

Kullanıcı, kimlik doğrulamasını gerçekleştirmek için istemci önce SSH-AUTH‘yi, yukarıda belirten “None” yöntemini kullanan bir SSH2_MSG_USERAUTH_REQUEST iletisi göndererek çağırır. Buna karşılık sunucu, normalde parola, klavye etkileşimli, genel anahtar ve ana bilgisayar tabanlı olan desteklenen yöntemlerin listesiyle yanıt verir. Bu güvenlik açığında, sunucuya sunucunun kimlik doğrulamasını başlatmasını beklediği SSH2_MSG_USERAUTH_REQUEST iletisinin yerine bir SSH2_MSG_USERAUTH_SUCCESS iletisi göndererek kimlik doğrulamasını atlatıyor ve kullanıcı, sisteme parola istemeksizin giriş yapabiliyor.

Not: SSH-AUTH, kimlik bilgilerinin şifrelenmesini veya korunmasını kendisi yapmaz. SSH-AUTH sadece düz metinde çalışır; iletişim hattını daha önce güvenli hale getirmek için SSH-TRANS modülüne güvenir.

 

CVE-2018-10933 Zafiyetinden Kimler Etkilendi?

Bu güvenlik açıklığından, Shodan üzerinde resmi olarak 6216 sunucunun risk taşıdığı görülmektedir. Shodan’ın raporuna göre bu açıklıktan etkilenen sunucuların büyük bir çoğunluğu Güney Kore, ABD, İtalya’da bulunmaktadır. Türkiye’deki bazı sunucular da bu açıklıktan etkilenmiş gözüküyor.

libssh

Rapora baktığımızda libssh kullanan işletim sistemi versiyonları dağılımı aşağıdaki gibidir.

libssh

Görüldüğü üzere ,sunucuların kullandığı libssh versiyonu dağılımı aşağıdaki gibidir.

libssh

Bunun haricinde, Libssh kullanan Github ve OpenSSH’ın sunucularındaki yapılandırma sebebiyle bu açıklıktan etkilenmediğini bildirdi.

 

CVE-2018-10933 Zafiyetinden Etkilenmemek için Neler Yapmalı?

Libssh, bu güvenlik açıklığından sonra güvenli açığının düzeltildiğine ve kullanırken neleri kullanmaktan kaçınmamız gerektiğini gösteren bir bildirim yayınladı.
Libssh 0.8.4 versiyonunda ,

  • CVE-2018-10933 açıklığının kapatıldığını,
  • Bellek sızıntılarının (Memory leaks) düzeltildiğini,
  • Soket oluştururken SIGPIPE kullanılmaması gerektiğini bildirdi

Libssh 0.7.6 versiyonunda ,

  • CVE-2018-10933 açıklığının kapatıldığını
  • OpenSSL 1.1 desteği eklendiğini,
  • ssh_get_publickey_hash () için SHA256 desteği getirildiğini
  • Parsing(Ayrıştırma) için oluşturulan konfigürasyonun düzeltildiğini,
  • Pubkeyleri içe aktarırken oluşan rasgele bellek bozulmasının düzeltildiğini açıklandı.

Eğer siz de yukarıdaki Libssh versiyonlarını kullanmıyorsanız bir an önce vakit kaybetmeden bu versiyonlara geçmenizde fayda var.

Blog postu ile ilgili bir sorunuz varsa bizimle iletişime geçebilirsiniz.

Emre AKKAYA

Size nasıl yardımcı olalım?

İhtiyacınız olan her an Prisma danışmanları yanı başınızda. Bizimle 7/24 iletişime geçebilirsiniz.


    Sızma testi hizmetlerimizi incelediniz mi?