SSL Pinning

iOS #25Yazılım #35Güvenlik #1

Suat Karakuşoğlu yazdı.

İçerik

Figure 1: SSL Pinleme

Merhabalar, bu yazımızda güvenliğe dokunan bir konudan bahsedeceğiz. Verinin güvenliği akış halinde, işlenirken veya saklanırken farklı yöntemler ile sağlanmakta.

SSL Pinning verinin iki parti arasında iletim esnasındaki güvenliğini korumak için ortaya çıkmıştır. SSL Pinning dediğimizde iki kavram var birisi SSL diğeri ise Pinning işlemi. O nedenle ilk önce SSL hakkında ufak bir bilgi ile başlayalım.

SSL’in Kısa tarihçesi

Güvenli Geçiş Katmanları diye türkçeleştirebileceğimiz bir tabir olan SSL websitelerinin doğması ile beraber 1990’ların ortasında bağlanılan sitelerin güvenliğini teyit etmek için kullandığı bir güvenlik yöntemidir.

Burada istemci (client) ssl sayesinde sunucu (server) ile arasında olan iletişimi geçerli bir sertifikaya güvenerek yapmaktadır.

Sertifika otoritelerinin (CA Authorities) verdiği sertifikalar ile (chain of certificate) üzerinden bu sağlanmaktadır. Ancak herhangi kötü niyetli birileride geçerli sertifikalara sahip olabilir; o nedenle bu riski düşürebilmek adına ilgili sertifikalar her iki partide (istemci/sunucu) önceden bulunarak, bağlantının gerçekten doğru istemci ve doğru sunucu ile olduğunu garantiler.

MİTM (Man in the Middle) Atağı

SSL’in eksik kaldığı noktada kötü niyetli birinin de sertifika sahibi olduğunda istemci ve sunucu arasında zaafiyet meydana gelebilir. İletişim’in ortasına kendisini yerleştirip ortamı dinleyerek bilgi elde etmeye çalışan atak türüdür.

Pinning (Pinlemek) nedir?

Pinlemenin ne olduğunu öğrenmeden önce neyi pinleyeceğimizden biraz bahsedelim. Pinlenecek olan dosyaya Sertifika (Certificate) diyoruz.

Asimetrik şifrelemedeki Public/Private anahtar çiftleri, sertifika için önemli kavramlar. Public Key sunucuya gönderilecek olan bilgiyi başkaları okumasın diye şifrelemede kullanılıyor. Bu public key sertifikanın içinde bulunuyor ve istemci tarafında kullanılıyor. Private anahtar ise gönderilen veriyi sunucuda çözümleyebilmek için kullanılıyor.

Zaten https üzerinden bu bilgiler güvenli şekilde iletiliyorken neden pinlemeye ihtiyaç duyuluyor sorusunun cevaplayalım.

Normalde sertifikalar “Certificate of Chain” denilen bir zincir üzerinden iletişimi güvenli hale getiriyor. O nedenle tüm zincir root sertifikaya kadar onaylandıktan sonra iki parti arasında iletişim başlayabiliyor. Ama, uygulama sunucunun verdiği sertifikaya güvenirken bu sertifikanın kendi sunucusu mu yoksa bir başkasının sunucusu mu olduğuna dair bilgiye sahip değildir.

Pinleme yaptığınız vakit ise direkt olarak bu iletişim garantisini istemci/sunucu arasında karşılıklı güvenli hale getirebiliyorsunuz; herhangi bir başka otoriteye gerek duymuyorsunuz.

Önceden istemciye gömülen sunucunun public anahtarı olursa, istemci sunucuyla iletişim kurmadan önce kendisinde olan anahtar ile sunucudaki anahtarı karşılaştırıp, eşleş*meme*si durumunda direkt iletişimi kesiyor.

Özellikle güvenliğin daha temelde olduğu uygulamalarda bankacılık ve finansal enstrüman olarak görev yapan uygulamalarda bu güvenlik önlemi tercih edilmektedir. Mobil uygulamalarda da yoğunluklu olarak kullanılan bir güvenlik tedbiridir.

Mobil Uygulama Entegrasyonları

  1. İlk adım olarak sunucunun public anahtarini veya SSL sertifikasını çıkarmanız gerekiyor.
  2. Bu anahtara sahip sertifikayı veya public anahtarı istemci uygulamaya pinlemek/gömmek gerekiyor. İstemci tarafındaki network katmanında sunucuya isteklerinde bu anahtarların eşleşme kontrolünü yapacak kontrolü eklemek gerekiyor.
  3. Dikkat edilmesi gereken en önemli noktalardan bir tanesi sertifikanın süresi bittiğinde yenileme ihtiyacını takip edebilmek.
    Certificate Pinning
    Tüm sertifikanın client’a gömüldüğü ve sorguya cevap veren server’in sertifikası ile karşılaştırıldığı pinleme yöntemi. Bu durumda client’ların eski kalanlarının force update ile zorunlu güncellemeye gitmesi gerekiyor.
    Public Key Pinning

    Sertifika’da yer alan public key’in veya public key hash’inin istemciye konulması ve karşılaştırma için kullanılması durumunu ifade eder. Normalde sertifikaların belli periyotlarda yenilenmesi gerekmektedir. Bu yenileme herhangi bir private key sızıntısı durumlarının önüne geçmeyi amaçlar.

    Public anahtarı pinlediğimiz takdirde istersek eski public/private anahtar çifti ile yeni sertifika oluşturabiliriz. Public Key pinleme ise bu durumda sunucu tarafında sertifika değişimlerinde yeni sertifika eski public/private key pair ile üretildiği durumda force update gerekmeden devam edilebilir. Ancak böyle devam etmesi sertifikanın yenilenme amacına aykırı olmaktadır.

Özet olarak, SSL Pinning dediğimiz olay istemci ile sunucu arasındaki iletişimi önceden belirlenen anahtar çifti ile dışarıya sızmasını engelleyen yöntemdir.

Sistem güvenliği konusunda araştırmalar yapan bağımsız kuruluş OWASP, MITM türü ataklar için önlem olarak bu yöntemi tavsiye etmektedir.

iOS tarafında NSURLSession veya Alamofire bağımlılıkları üzerinde bu pratikler rahatlıkla uygulanabiliyor.

Android tarafında ise OKHttpClient ve Retrofit gibi popüler kütüphanelerde bu pratiklerin nasıl yapıldığına dair birçok örnek bulabilirsiniz.

Kaynakça