logo

Murat Demirten

header-nav
text

{ ubi dubium ibi libertas }

mobile-nav-trigger

Eski Linkedin parolanızı kullanmaktan vazgeçin!

16 Haziran 2016, Perşembe

Konunun teknik ayrıntılarına girmeden önce, daha çok kişinin faydalanabilmesi için yazımıza kısa bir özet ve önemli bir tavsiye ile başlayalım.

2012 yılında Linkedin kullanıcı veritabanı, parolaların şifrelenmiş hallerini de içerecek şekilde ele geçirilmiş, firma durumu kabul etmiş ve kullanıcılarından parolalarını güncellemelerini istemişti. O dönemde bu veri sızıntısının boyutları hakkında detaylı bilgiye sahip değildik. Aradan 4 yıl gibi bir zaman geçtikten sonra, geçtiğimiz hafta -tam da Linkedin Microsoft tarafından satın alınma arefesindeyken- aynı veritabanı torrent üzerinden tekrar yayınlandı.

Sızdırılan veritabanını incelediğimizde, Linkedin tarafından kullanıcı parolalarının güvenliği için oldukça acemice olarak nitelendirebileceğimiz, unsalted SHA1 yönteminin kullanıldığını görmekteyiz. Bu özetle şu anlama geliyor, 2012 yılında Linkedin hesabınız varsa, parolanız 12 haneden küçükse ve aynı parolayı başka hesaplarınızda da kullanıyorsanız hemen o parolayı değiştirin ve bir daha hiç bir sistemde tekrar kullanmayın! 

Kullanıcı parolaları sistemlerde nasıl saklanır?

Kullanıcı parolaları sistemlerde genellikle tek-yönlü hash algoritmalarından biri kullanılarak saklanır. Örnek olarak, parolamız 123456 şeklinde ise ve MD5 Hash algoritması kullanılıyorsa, ilgili sistemde parolamız yerine parolamızın MD5 Hash değeri olan e10adc3949ba59abbe56e057f20f883e değeri saklanacaktır

Bir sonraki oturum açma denemenizde parolanız olan 123456 değerini tekrar girdiğinizde, girilen parola üzerinden aynı hash algoritması tekrar çalıştırılır, sonucunda e10adc3949ba59abbe56e057f20f883e hash değerine ulaşılır ve sistemde saklanan parolanızın şifrelenmiş haliyle karşılaştırılır.

Böylelikle parolanız açık bir şekilde sistemde saklanmamış olduğundan, 2012 Linkedin veri sızıntısı örneğinde olduğu gibi izinsiz olarak tüm parola veritabanına erişim sağlansa bile, kullanmakta olduğunuz 123456 parolasına ulaşılamayacak; saldırganlar onun yerine yukarıda örneğini verdiğimiz, parolanın hash algoritmasından geçirildikten sonraki haline erişebileceklerdir. Hash algoritmaları tek yönlü çalıştığından, karmaşık hash değerinden yola çıkarak algoritmayı tersine doğru çalıştırıp asıl parolaya erişmek mümkün değildir.

Peki o halde sorun nerede?

Hash algoritmalarını tersine işletemediğimiz doğru. Ancak kullanılan hash algoritmasına göre, parolanın olabileceği tüm kombinasyonlar için tek tek hash değeri hesaplamak ve sonuçlarını veritabanı ile karşılaştırmak gayet mümkündür. 123456 parolasını örnek aldığımızda, 6 haneli rakamları tek tek denerken doğru parolaya yaklaştığımızdaki MD5 hash değerleri şu şekilde olacaktır:

...
123454 => 268e27056a3e52cf3755d193cbeb0594
123455 => 00c66aaf5f2c3f49946f15c1ad2ea0d3
123456 => e10adc3949ba59abbe56e057f20f883e (bingo)

Görüleceği üzere aynı hash değerini elde etmeyi başardık, demek ki aradığımız parola 123456 imiş. Hash değerinden geriye doğru gitmek yerine, işlemci gücünü kullanarak bilgisayara sürekli hash hesaplatıp karşılaştırma yaptırmak suretiyle parolanın ne olduğunu bulmayı başardık.

6 haneli tüm parola kombinasyonları için (büyük / küçük harf, rakam ve özel karakterlerden oluşacak şekilde) hash değerini hesaplarsak, 6 haneli tüm parolaları da bulmuş oluruz. Parola uzunluğu 7, 8, 9, 10... hane olacak şekilde artmaya başladığında denenmesi gereken olası parola kombinasyonları sayısı (eşittir hesaplanması gereken hash değeri sayısı) geometrik bir şekilde artarak devasa büyüklüklere ulaşmaktadır.

İşlemci hızlarının artması, binlerce bilgisayar üzerinde koşturulabilecek hash üretme yazılımlarının geliştirilmesi gibi teknolojik gelişmeler sonrasında dahi bu kadar çok sayıda hash üretimi onlarca yıl alabilmektedir. Dolayısıyla parolanın hash değerinden deneme-yanılma yoluyla parola aslına ulaşılması onlarca (bazen yüzlerce) yıl alacağından -elbette minimum 12 hane uzunluğunda ve güçlü bir parola seçmiş olduğunuzu varsayıyoruz- parolanızın güvende olduğunu düşünebilrsiniz.

Ancak Parolamın güvenli olduğunu düşünüyorum! başlıklı yazıda detaylı bir şekilde değindiğim gibi son yıllarda bu denklemi değiştirecek düzeyde, modern grafik kartları üzerinde GPU ile çok yüksek hızda parola denemesi yapılabilir hale gelinmiştir. Örnek vermek gerekirse, üst seviye bir Nvidia GPU üzerinde Windows sistemlerde yoğun biçimde kullanılan NTLM hash algoritmasıyla saniyede 250 milyar, MD5 hash algoritması ile 115 milyarSHA1 algoritması ile 37 milyar, SHA512 hash algoritmasıyla ise saniyede 5 milyar kadar hash üretilebilmektedir.

Örneklerden görülebileceği gibi hash algoritmasına bağlı olarak hesaplama için gerekli zaman değişkenlik göstermektedir. Ancak buna rağmen saniyede milyarlarla ifade edilen sayılarda deneme yapılabiliyor olması ürkütücüdür.

Gerçekte sistemlerde parola saklamada kullanılan hash hesaplaması biraz daha farklı yapılmaktadır. Girilen parolayı ilgili hash algoritmasını bir defa çalıştırarak hesaplanan değeri kullanmak yerine, aynı algoritmayı N defa tekrar ederek yeniden çalıştırdığımızda, daha güçlü bir hash değeri elde edebiliriz. Örnek olarak, kullanılan hash algoritması MD5, hesaplanan hash değeri MD5(password) ve tanımlı tekrar parametresi 100.000 olsun. Bu işlemi 1 defa yapmak yerine 100.000 defa yapacak olursak, çok daha farklı bir hash değerine ulaşabiliriz:

encrypted = MD5(password) 
for (i = 0; i < 100000; i++) 
   encrypted = MD5(encrypted)

Bu şekilde yapıldığında gereken hesaplama gücü çok artacağından, optimum bir değerin seçilmesi halinde parola kırma denemelerini bir anda milyonlarca kat zorlaştırabilir ve çok daha güvenli bir sisteme ulaşmış oluruz.

İdeal bir sistemde, hash hesaplamasının yaklaşık 1 saniye sürecek kadar karmaşık olması beklenir. Karmaşıklık aynı algoritmanın belirli sayıda tekrar çalıştırılması şeklinde olabileceği gibi farklı bir takım unsurlar da kullanılabilir. Sisteme giriş işlemleri sırasında kullanıcı tarafındaki 1 saniyelik kayıp çok önemli olmayacaktır; buna karşılık parola kırma denemeleri GPU çözümleriyle bile neredeyse imkansız hale gelecektir.

Yukarıdaki açıklamamıza ek olarak, günümüzde hash hesaplama sürecini uzatacak yöntemlerin kullanılıyor olunmasıyla birlikte, hesaplama işleminin 1 saniyelere varacak kadar karmaşıklık içeren halinin pek tercih edilmediğini belirtmemiz gerekiyor.

SALT değeri kullanımı

Hash değeri hesaplamasını ne kadar güçleştirirsek güçleştirelim, eğer iki farklı kullanıcının parolası aynı ise, 1 milyon defa iterasyon kullanıyor olsak dahi kullanıcılardan birinin parolası bulunduğunda diğeri de bulunmuş olacaktır.

Bu senaryonun engellenmesi için SALT değeri kullanılır. Yöntem oldukça basittir: kullanıcı parolaları aynı olsa dahi, parola ataması yapılırken rastgele bir veri de üretilir ve kullanıcının girmiş olduğu parola ile birleştirilerek, hash algoritmasına girecek asıl değer elde edilir. İşlem bitiminde elde edilen hash değeri ile birlikte SALT değeri olarak kullanılan rastgele veri de sistemde saklanır. Bu sayede kullanıcı sonradan sisteme giriş yapmak istediğinde, parola atamasında kullanılan SALT değeri sistemden öğrenilir, kullanıcının girdiği parola ile birleştirilir ve hash değeri hesaplanır.

SALT kullanımı sayesinde parolalar aynı olsa dahi sistemde birbirinden farklı hash değerleri ile saklanır ve parola kırmaya çalışanlar için tekrarlayan parola kullanımı senaryosundaki avantaj ortadan kaldırılmış olur.

Linkedin'de acemice yapılan işlem neydi?

Yukarıdaki genel açıklamalarımızdan sonra tekrar Linkedin olayına dönecek olursak, 2012 yılında sızdırılan veritabanını incelediğimizde, herhangi bir SALT değeri kullanılmadığı gibi SHA1 gibi hash hesaplaması kolay bir algoritma seçildiğini ve daha da kötüsü, hash fonksiyonunun yüksek sayılarda tekrar edilerek parola kırma sürecini zorlaştıracak yöntemlerin izlenmemiş olduğunu görmekteyiz.

Özellikle günümüzdeki GPU'ların işlem kapasiteleri düşünüldüğünde, bu durum parolanızın neredeyse açık halde yazılmasıyla eşdeğer anlama gelmektedir.

Durumun vehametini test etmek amacıyla, sıradan bir Nvidia kartı olan Linux yüklü bir makinede Linkedin hesapları arasından Türkiye'deki email adreslerinden rastgele seçtiğim 10.000 adetlik örnek üzerinden bir test senaryosu oluşturdum. Ardından hashcat uygulaması ile SALT ve tekrar sayısı kullanılmayan SHA1 hash değerlerini hesaplamaya çalıştım. Sonuçta;

  • Kullandığım sistemde saniyede 120 milyon SHA1 hash değeri hesaplayabildim
  • 6 haneli parolaların tamamı bir kaç saniyede bulunmuştu
  • İlk yarım saatte tüm 7 haneli parolalara ulaştım
  • 12 saate yaklaştığında 8 haneli parolaların çoğu bulunmuş durumdaydı (büyük/küçük harf, rakam ve özel karakter kombinasyonları dahil) ve toplamda 10.000 kullanıcının yaklaşık %62'sinin parolası çözülmüştü! 

Elbette karakter sayısı arttıkça hesaplama ihtiyacı da yüksek oranda artacağından, sıradan bir Nvidia GPU ile masaüstü bilgisayarımızda 11 karakterli tüm kombinasyonların hesaplanması yüzyıllar alacaktır. Ancak işlem kapasitesi çok daha yüksek olan Nvidia kartlarının bulunduğunu hatta bu kartlardan 8-16 adedini tek başına içeren sistemlerden oluşturulan GPU veri işleme kümelerinin varlığını hesaba kattığımızda ortaya şu çıkmaktadır: eğer 2012 yılında Linkedin üyesi iseniz, parolanızı artık pek çok kişi tarafından bilinmektedir! Yapabileceğiniz yegâne şey, aynı parolayı kullandığınız başka sistemler var ise hemen ilgili sistemlerdeki parolalarınızı değiştirmek ve Linkedin parolanızı bir daha asla hiç bir sistemde kullanmamak olacaktır.

Peki Linkedin nasıl böyle bir tasarım hatası yapmış olabilir? Burada açıklamaya çalıştığımız problemler ve çözüm yaklaşımları bilişim dünyasında 40 yıldır bilinen ve pratik olarak sahada uygulanan yöntemler olmasına rağmen nasıl es geçilmiş olabilir? Linkedin 2011 yılında kurulmuş olsaydı bu hatayı firmanın startup dönemine ait bir acemilik olarak kabul edebilirdik ancak öyle değil, 2012 (Aralık) ayında şirket 165 milyona yaklaşan kullanıcı sayısı ile uzun yıllardır pazarda idi ve para kazanır duruma geçmişti. Bu durum ancak güvenlik konusunda farkındalığı olmayan yazılım geliştiricileri ve etkin yürütülmeyen code-review süreçleriyle açıklanabilir.

Yaşanan olaylardan sonra günümüzde Linkedin'in parolaların saklanma yöntemi açısından bakıldığında en güvenli sistemlerden biri olduğunu söylemek yanlış olmayacaktır.

Bitirirken...

Bu kadar büyük ve global ölçekteki firmalarda parola güvenliğinin vaziyeti ortada iken, küçük girişimlerden güvenlik adına fazla bir şey beklememek yerinde bir davranış olacaktır. Buradan hareketle, yeni bir web sitesinde veya sistemde kullanıcı hesabı açmanız gerektiğinde, yeni kullanıcı oluşturmak yerine ilgili sistem destekliyor ise Google, Facebook, Github, Linkedin vb. hesabıyla giriş yöntemlerinden birini tercih etmenizin daha güvenli olacağını söyleyebiliriz. Böylelikle parolanız hesabı oluşturduğunuz ve altyapısı muhtemelen zayıf olan sisteme hiç bir şekilde ulaşmamış olacaktır.

search
Sosyal Medya