Merhabalar Arkadaşlar,
Bu makalede 2 faktörlü kimlik doğrulama ile ilgili dikkat edilmesi gereken hususlara değineceğim. Bir yazılım sistemine eklenen 2 faktörlü kimlik doğrulama mekanizmaları maalesef birçok projede yeterli düzeyde koruma sağlayamamaktadır. Sebebi ise tamamen yapılan hatalı tercihlerdir. Güvenlik dediğimiz faktör tamamen bir süreçtir ve devamlı güncelliğini koruması gerekmektedir. Zayıf algoritmalar kullanılmamalıdır.
Dikkat Edilmesi Gereken Hususlar
Gizli Anahtar Uzunluğu
Gizli anahtar oluşturma aşaması son derece önemlidir. Yeterli uzunlukta oluşturulmayan gizli anahtar yapılabilecek saldırılara (kaba kuvvet, sözlük vb.) karşı direnç gösteremez. Oluşturulan gizli anahtarların güvenlik zaafiyeti göstermemesi için minimum 16 karakter uzunluğunda olması (önerim: 24 karakter) son derece önemlidir. 2 Faktörlü kimlik doğrulama sistemleri (Google Authenticator, Microsoft Authenticator vb.) oluşturulan gizli anahtarın base32 kodlaması yapılarak ilgili Authenticator uygulamalarına eklenir.

Güvenli Hash Algoritmasının Tercihi
OTP süreçlerinde en sık kullanılan SHA1 hash algoritmasıdır. Bir hash algoritmasının en büyük sorunu farklı 2 veriden aynı hash değerinin üretilmesidir. SHA1 güvenirsizliği kanıtlanmış bir hash algoritmasıdır. Bu konuyla ilgili 2 kaynağı aşağıdaki bağlantılardan inceleyebilirsiniz.
https://www.nist.gov/news-events/news/20...-algorithm
https://shattered.io/
Güvenirsizliği kanıtlanmış SHA1 algoritmasına güvenmemiz ne kadar doğru olabilir ki? Bu sebeple OTP süreçlerinizde SHA256, SHA384, SHA512 hash algoritmalarından birini tercih etmemiz ve sistemlerimizi buna uygun tasarlamamız daha doğru olacaktır.
Standart koruma: SHA256
Yüksek koruma: SHA512
Kaba kuvvet/Sözlük Saldırıları Tedbirleri
Söz konusu kaba kuvvet (brute force) ve sözlük (wordlist) saldırıları olunca günümüz donanımların gücüne değinmeden olmaz. Çok fazla detaya girmeden bahsedecek olursam günümüz koşullarda kullanılan işlemci ve ekran kartı işlemcileri yüksek performans sağlamaktadır. Hash algoritmalarıyla ilgili daha önceden yapmış olduğum bir sözlük saldırısına ait istatistikler aşağıda bilginize sunulmuştur.

Yukarıdaki görsel donanımlarımızın artık ne kadar hızlı ve saldırılarda tehlikeli olduğunu gösteriyor. Konumuza dönecek olursak 2FA uygulamalarında brute force ve sözlük saldırıları varsayılan olarak (TOTP için) 30 saniye olan 2 faktörlü kimlik doğrulama aşamasında gerçekleşmektedir. 30 saniyelik süreçte kullanıcı 2 faktörlü kimlik doğrulama kodunu girmek durumundadır. Bu kod genel olarak 6 karakterli (8 ve 10'da tercih edilmektedir.) ve rakamlardan oluşur. Şimdi yukarıdaki istatistiklere baktığımızda rahatlıkla anlayabiliriz ki 6 veya 8 karakterli bir 2FA kodunu kırmak 1 saniye bile sürmeyecektir.

Bu yüzden uygulamalarımızda 2fa kodu doğrulaması içinde engelleyici, geciktirici bir çözüm oluşturmak gerekmektedir. Saldırganın çeşitli saldırılarla (mitm vb.) server tarafına yaptığımız isteği yakaladığını düşünün. Yukarıdaki olasılık miktarını göz önüne alırsak eğer ki 2fa doğrulaması için saldırı engelleyici bir çözüm yoksa saldırgan başarıyla saldırısını sonuçlandıracaktır.
Saldırılar aşamasında yapılan istek sayısına göre hesabı kilitlemek elbetteki bir çözümdür. Fakat bunun kötü niyetle kullanılmasıda mümkündür. Saldırgan ele geçirdiği hesapları bu şekilde kilitleyerek kullanıma engel bir durumda oluşturabilir.
Tavsiye;
Şahsi olarak uyguladığım algoritma: Yukarıda yapılabilecek saldırıya istinaden ben herhangi bir bloklama yapmıyorum. Bunun yerine geciktirme işlemi uyguluyorum. Yani kullanıcı 2fa kodunu yanlış girdiğinde veya olası saldırıda son yanlış girme zamanını bir yerde depoluyor ve sonraki istekte öncelikle son yanlış giriş zamanını sorgulayarak aralarında 10 saniye gecikme eklettiriyorum. Yani kullanıcı 2fa kodunu yanlış girerse 2. giriş için 10 saniye beklemek zorundadır. Aksi halde sunucu uygulaması hata döndürür ve erişime izin vermez. Saldırı göz önüne alındığında 30 saniye geçerli olan bir kod için 10 saniye gecikme işlemi maksimum 3 giriş hakkı sunar. Böylelikle olası saldırının başarıya ulaşma ihtimali son derece zayıflamış olur.
Replay Saldırısı ve Korunma Tedbirleri
Replay saldırısının görsel olarak anlaşılabilmesi kolaydır. Bu sebeple lütfen aşağıdaki aşamaları dikkatlice inceleyiniz.

Yukarıdaki görselde 2FA süreçlerinin güvenli bir şekilde gerçekleşmesi için doğrulama işlemi yapıldıktan sonrada güvenlik tedbirlerinin mutlaka alınması gerekmektedir. Kullanıcı başarılı bir şekilde 2FA'dan geçebilir ve servisten token alabilir. Peki 30 saniyelik 2FA sürecinde ya bir saldırgan mitm uygulayarak yapılan isteği aynı kod ile tekrarlarsa? Eğer ki server tarafta 2fa doğrulama işlemi başarıyla gerçekleştirdikten sonra aynı kod ile yapılan 2. ve sonraki isteklere izin verirsek saldırgan sistemden başarılı bir şekilde yeni bir token almayı gerçekleştirebilir.
Öneri;
Sunucu tarafta 2fa kodu doğrulaması 1.kez gerçekleştikten sonra aynı kod ile 2. ve sonraki doğrulama işlemlerine izin vermemek ve engellemek gerekir.
Öncelikle sabırla okuduğunuz için teşekkür ederim. Sorularınız varsa, bilgim dahilinde yanıtlamaya çalışırım.
Faydalı olması ümidiyle.
Bu makalede 2 faktörlü kimlik doğrulama ile ilgili dikkat edilmesi gereken hususlara değineceğim. Bir yazılım sistemine eklenen 2 faktörlü kimlik doğrulama mekanizmaları maalesef birçok projede yeterli düzeyde koruma sağlayamamaktadır. Sebebi ise tamamen yapılan hatalı tercihlerdir. Güvenlik dediğimiz faktör tamamen bir süreçtir ve devamlı güncelliğini koruması gerekmektedir. Zayıf algoritmalar kullanılmamalıdır.
Dikkat Edilmesi Gereken Hususlar
- Gizli anahtar uzunluğu
- Güvenli Hash algoritma tercihi
- Kaba kuvvet/Sözlük saldırıları tedbirleri
- Replay saldırısı ve korunma tedbirleri
Gizli Anahtar Uzunluğu
Gizli anahtar oluşturma aşaması son derece önemlidir. Yeterli uzunlukta oluşturulmayan gizli anahtar yapılabilecek saldırılara (kaba kuvvet, sözlük vb.) karşı direnç gösteremez. Oluşturulan gizli anahtarların güvenlik zaafiyeti göstermemesi için minimum 16 karakter uzunluğunda olması (önerim: 24 karakter) son derece önemlidir. 2 Faktörlü kimlik doğrulama sistemleri (Google Authenticator, Microsoft Authenticator vb.) oluşturulan gizli anahtarın base32 kodlaması yapılarak ilgili Authenticator uygulamalarına eklenir.

Güvenli Hash Algoritmasının Tercihi
OTP süreçlerinde en sık kullanılan SHA1 hash algoritmasıdır. Bir hash algoritmasının en büyük sorunu farklı 2 veriden aynı hash değerinin üretilmesidir. SHA1 güvenirsizliği kanıtlanmış bir hash algoritmasıdır. Bu konuyla ilgili 2 kaynağı aşağıdaki bağlantılardan inceleyebilirsiniz.
https://www.nist.gov/news-events/news/20...-algorithm
https://shattered.io/
Güvenirsizliği kanıtlanmış SHA1 algoritmasına güvenmemiz ne kadar doğru olabilir ki? Bu sebeple OTP süreçlerinizde SHA256, SHA384, SHA512 hash algoritmalarından birini tercih etmemiz ve sistemlerimizi buna uygun tasarlamamız daha doğru olacaktır.
Standart koruma: SHA256
Yüksek koruma: SHA512
Kaba kuvvet/Sözlük Saldırıları Tedbirleri
Söz konusu kaba kuvvet (brute force) ve sözlük (wordlist) saldırıları olunca günümüz donanımların gücüne değinmeden olmaz. Çok fazla detaya girmeden bahsedecek olursam günümüz koşullarda kullanılan işlemci ve ekran kartı işlemcileri yüksek performans sağlamaktadır. Hash algoritmalarıyla ilgili daha önceden yapmış olduğum bir sözlük saldırısına ait istatistikler aşağıda bilginize sunulmuştur.

Yukarıdaki görsel donanımlarımızın artık ne kadar hızlı ve saldırılarda tehlikeli olduğunu gösteriyor. Konumuza dönecek olursak 2FA uygulamalarında brute force ve sözlük saldırıları varsayılan olarak (TOTP için) 30 saniye olan 2 faktörlü kimlik doğrulama aşamasında gerçekleşmektedir. 30 saniyelik süreçte kullanıcı 2 faktörlü kimlik doğrulama kodunu girmek durumundadır. Bu kod genel olarak 6 karakterli (8 ve 10'da tercih edilmektedir.) ve rakamlardan oluşur. Şimdi yukarıdaki istatistiklere baktığımızda rahatlıkla anlayabiliriz ki 6 veya 8 karakterli bir 2FA kodunu kırmak 1 saniye bile sürmeyecektir.

Bu yüzden uygulamalarımızda 2fa kodu doğrulaması içinde engelleyici, geciktirici bir çözüm oluşturmak gerekmektedir. Saldırganın çeşitli saldırılarla (mitm vb.) server tarafına yaptığımız isteği yakaladığını düşünün. Yukarıdaki olasılık miktarını göz önüne alırsak eğer ki 2fa doğrulaması için saldırı engelleyici bir çözüm yoksa saldırgan başarıyla saldırısını sonuçlandıracaktır.
Saldırılar aşamasında yapılan istek sayısına göre hesabı kilitlemek elbetteki bir çözümdür. Fakat bunun kötü niyetle kullanılmasıda mümkündür. Saldırgan ele geçirdiği hesapları bu şekilde kilitleyerek kullanıma engel bir durumda oluşturabilir.
Tavsiye;
Şahsi olarak uyguladığım algoritma: Yukarıda yapılabilecek saldırıya istinaden ben herhangi bir bloklama yapmıyorum. Bunun yerine geciktirme işlemi uyguluyorum. Yani kullanıcı 2fa kodunu yanlış girdiğinde veya olası saldırıda son yanlış girme zamanını bir yerde depoluyor ve sonraki istekte öncelikle son yanlış giriş zamanını sorgulayarak aralarında 10 saniye gecikme eklettiriyorum. Yani kullanıcı 2fa kodunu yanlış girerse 2. giriş için 10 saniye beklemek zorundadır. Aksi halde sunucu uygulaması hata döndürür ve erişime izin vermez. Saldırı göz önüne alındığında 30 saniye geçerli olan bir kod için 10 saniye gecikme işlemi maksimum 3 giriş hakkı sunar. Böylelikle olası saldırının başarıya ulaşma ihtimali son derece zayıflamış olur.
Replay Saldırısı ve Korunma Tedbirleri
Replay saldırısının görsel olarak anlaşılabilmesi kolaydır. Bu sebeple lütfen aşağıdaki aşamaları dikkatlice inceleyiniz.

Yukarıdaki görselde 2FA süreçlerinin güvenli bir şekilde gerçekleşmesi için doğrulama işlemi yapıldıktan sonrada güvenlik tedbirlerinin mutlaka alınması gerekmektedir. Kullanıcı başarılı bir şekilde 2FA'dan geçebilir ve servisten token alabilir. Peki 30 saniyelik 2FA sürecinde ya bir saldırgan mitm uygulayarak yapılan isteği aynı kod ile tekrarlarsa? Eğer ki server tarafta 2fa doğrulama işlemi başarıyla gerçekleştirdikten sonra aynı kod ile yapılan 2. ve sonraki isteklere izin verirsek saldırgan sistemden başarılı bir şekilde yeni bir token almayı gerçekleştirebilir.
Öneri;
Sunucu tarafta 2fa kodu doğrulaması 1.kez gerçekleştikten sonra aynı kod ile 2. ve sonraki doğrulama işlemlerine izin vermemek ve engellemek gerekir.
Öncelikle sabırla okuduğunuz için teşekkür ederim. Sorularınız varsa, bilgim dahilinde yanıtlamaya çalışırım.
Faydalı olması ümidiyle.

