İnternet Güvenliği 1: İllüzyondan Beter
Geçen gün bankam yine Internet şifremi değiştirmemi isteyince bir de baktım ki şifrem xxxxx9 olmuş, yani aynı şifrenin 9. versiyonunu kullanıyorum. Ama kağıt üstünde baksan örnek bir Internet vatandaşı olarak şifremi zamanında değiştirmiş, güvenliğimi korunmuşum. Bu şarlatanlık tepemi attırdı ve hırsımı birkaç tweetle alamayınca, ortaya üç parçalık bir yazı/çizi çıktı:
- Dünya'nın en kötü Internet şifreleri hangileri?
- Yaygın şifre politikaları bizi nasıl daha da güvensiz hale getiriyor?
- Şifreler nasıl kırılır, güvenlik nasıl sağlanır, "hash" ne demek?
- Bu yazıları bitirir bitirmez ne yapmalısınız?
***
Dünya'nın Tüm Kötü Şifreleri, Birleşin!
SplashData şirketine göre 2017'de en yaygın kullanılan şifre 123456 imiş. İşte utanç listesi:
1. 123456 (son 5 senenin şampiyonu)
2. Password ("sifreniz ne?" "sifre!" "onu soruyorum işte, şifreniz ne?"...)
3. 12345678 (dokuza kadar gitmeyerek herkesi yanıltmış)
4. qwerty (klasiklerden)
5. 12345 (tembel aptal)
6. 123456789 (çalışkan aptal)
7. letmein ("bir arkadaşa bakıp çıkacağım")
8. 1234567
9. football (tam bir "düz adam" şifresi)
10. iloveyou (#metoo)
11. admin (IT'ci yaratıcılığı)
12. welcome ("hoşgeldiniz hesabıma, aa çıkarmayın hiç, girin girin")
13. monkey
14. login (sanırım login ismi de "password", disleksik olabilir)
15. abc123
16. starwars (bari startrek olsa)
17. 123123
18. dragon (0-GoT yaş grubunda popüler)
19. passw0rd (arkadaşı Mr Robot senarist kadrosuna alalım)
20. master
21. hello (iki karaktere izin olsa "hi" yazacak demek ki)
22. freedom (...and democracy)
23. whatever (ergenlerin şifresi bile tripli)
24. qazwsx (dikey qwerty)
25. trustno1 (Mulder? Belli ki paranoyak ama şifresini kırmak 1 saniye sürer)
***
Şimdi bunlara bakıp, insanların ne kadar gerizekalı olduklarını düşünmek çekici olabilir. Ben hemen öyle yapmıştım mesela. Ama işin aslı, herkesin IT uzmanı olduğu bir dünyada bile bu şifreler yaygın olacaklardı. Neden?
Bir kere, sadece ufak bir azınlığın aynı şifreyi kullanması bile onu bir numaraya taşımaya yeter. Mühendişçesi: Geniş data setlerininin "mode"una bakmak anlamsızdır.
Ama daha önemlisi, dandik sitelere kaydolurken yukardaki şifreleri kullanmak, asıl şifrelerinizi veya varyasyonlarını kullanmaktan çok daha iyi. O sitelerden şifreleriniz nasıl olsa çalınacak. Hatta çoktan çalınmış, kırılmış ve alınıp satılmış olduklarını varsayın. Hackerların şifre listelerini genişletmek için bedavaya çalışacağınıza, zaten herkesin bildiği bu dandik şifreleri kullanmak daha akıllıca.
Dolayısıyla bu listenin asıl yararı, felaket tellallığı veya ego tatmini değil, "o zaman iyi bir şifre nasıl olmalı?" sorusunu sordurması.
***
"D3p3ch3M0d3!" İyi Bir Şifre Mi?
"İnsanların okuyamadığı şifre güçlü şifredir" gibi acayip bir kalıp yerleşmiş vaziyette. Her sitede, her örnekte böyle. İşin komik yanı, herkes de bunun bir saçmalık olduğunu biliyor. Zira şifre kırmakta kullanılan teknikler açısından "#D3p3ch3M0d3!" ile "DepecheMode1" arasında fazla fark yok. Tek fark, ilk şifreyi hatırlamanın çok daha zor oluşu. Yani makinelerin işini değil, kendi işimizi zorlaştırıyoruz.
Halbuki fantastik karakter içermeyen "DepecheModeuçokseviyorumtamammıBerkecan" çok daha kuvvetli bir şifre. Nedeni ise entropi kavramı...
Yukardaki xkcd karikatürünü anlamak için, herhangi bir şifrenin entropisini, "olası ihtimal kümesi" olarak düşünün. Bu kümenin büyüklüğü iki şeye bağlı:
- Şifrenin uzunluğu (basamak sayısı)
- Karakter havuzu (basamak derinliği)
Diyelim ki bisikletinizin 4 basamaklı kilidinde sadece 0 ya da 1 rakamları var. Her basamak tek bitlik bilgi içeriyor. (Bilgisayarcıdan bisiklet kilidi alırsanız olacağı bu.) Burada 4 bitlik bir entropi ve 16 olası şifre var (2 ^ 4 = 16). Brute force ile -her ihtimali tek tek deneyerek- bisikletimin çalınması bir dakika bile sürmez. Demek ki 4 bitlik entropi yeterli değil.
Yıllar geçti, çalınan bisikletiniz yüzünden hırs yapıp fabrikatör oldunuz -fabrikatör diye bir kavram var mı hala?- şimdi iş seyahatine gidiyorsunuz. Bavulunuzun kilidi de 4 basamaklı ama bu sefer her basamak 2 değil, 10 rakamdan birini alabiliyor. Dolayısıyla toplam ihtimal sayısı 10 bin oldu, yani 0000 - 9999 arası tüm sayılar.
Şifre uzunluğu aynı kalmasına rağmen karakter havuzu genişlediği için, entropi arttı. 16 ihtimal nere, 10.000 ihtimal nere. Peki bavulumuz o bisiklete kıyasla, hakikaten yüzlerce kat daha mı güvende?
Her İhtimal Eşittir Ama Bazı İhtimaller Daha Eşittir
4 basamaklı bir bavul kilidi veya ATM şifresi gören biri, kusursuz biçimde rastgele bir sayı seçmez. Bir çoğumuz doğum tarihini seçer. Sistem ona izin vermiyorsa da bir varyasyonunu uydurur (tersten yazarak veya rakamları birer arttırarak).
Dolayısıyla o bavulu kırıp içindeki viskilere ulaşmak isteyen bir bagaj görevlisinin yapacağı şey, sıradan her sayıyı denemek değil. Önce 0000, 9999, 1234 gibi "utanç listesi" şifrelerini, sonra 1930-2010 arası tarihleri, sonra da bunların tersten yazılışlarını denemesi daha verimli olur. Yani işe bir listeyle başlayacak (dictionary attack) ve ancak o liste işe yaramazsa kalan sayıları sıradan deneyecek (brute force). Bu yüzden de pratikte, bir hackerın denediği arama kümesi (search space), entropinin belirttiği toplam ihtimal kümesinden daha ufaktır.
***
İnsan psikolojisinin bu sınırlayıcı etkisini iyice anlamak için, entropinin çok daha yüksek olduğu bir senaryoyu, mesela 4 yerine 10 tane rakam kabul eden bir sistemi düşünün: Bu sistemde 10 üzeri 10, yani tam 1 trilyon ihtimal var. Ama paradoksal biçimde bu sistem, 100 kat daha ufak bir olasılık kümesine sahip 8 basamaklı bir sisteme kıyasla daha güvensiz olabilir. Zira çoğu insanın aklına gelen ilk 10 basamaklı sayı, telefon numarası olacak. Birinin telefon numarasını bulmak da çok kolay. Bilmiyorsanız bile, telefon numaralarının belli bir formatı ve dağılımı var.
İnsan zaten genel olarak kötü bir random number generator. Biri size "1-20 arası bir sayı düşün" dediğinde, 7 ve 17 açık ara favori seçenekler oluyor. Daha bugün dört kişiye bunu sordum, cevabı telefonlarına yazdılar ve ikisinin telefonunda 17 rakamı vardı. En yakın zamanda 10 tane İsviçreli diş hekimi bulup yeni bir deney daha yapacağım.
Eğer 1-50 arasında bir aralık belirlersek, bu sefer 37 en yaygın cevap oluyor. Bir bilgisayara kıyasla, tek ve asal sayıları daha çok seçiyoruz. Yani telefon numarası, doğum tarihi, okul-sıra numarası gibi bizi yönlendiren sosyal şartlandırmalar olmadığında bile, doğal halimiz bazı seçeneklere daha yatkın.
***
Bu etki rakamlarla sınırlı değil ve sokak sihirbazları bunu iyi biliyorlar. Örneğin bir desteden rastgele bir kağıt seçmemiz istense, dörtte birimiz maça aşını seçecek. Toplam 52 kağıt var ama insanların yarısı sadece 4 kağıdı seçiyor. Eğer kağıdı hayal etmemiz istenirse, bu sefer kupa ası en favori cevap oluyor. (Tüm dağılım burada.)
Şifre uzunluğunda da belli bir yönelim var. Bir çok site şifre uzunluğunu sabitlemiyor, "6-20 karakter arası olsun" diyor mesela. Bu entropiyi oldukça arttırsa da arama kümesini aynı oranda arttırmıyor. Çünkü 16-20 karakterli şifre kullanan insanların sayısı, 6-12 karakter kullananlara göre çok az. O yüzden önce kısa şifreleri kırmaya çalışmak çok daha makul.
Hemen her şifre/tahmin sisteminde, insanların belli yatkınlıkları var ve bunlar yeterince biliniyor.
Derin Havuz: ASCII
Bugün birçok sitede, olası karakter kümesi harf veya rakamdan ibaret değil, ASCII standardı kullanılıyor. ASCII'de her karakter 94-95 ihtimal içerir (rakam + büyük harf + küçük harf + yaygın özel karakterler).
Her basamakta 6.5 bitlik bir bilgi demek bu, yani sadece iki tane ASCII karakterin entropisi (6.5 x 2 = 13), 4 basamaklı bir rakamınki kadar. Ortalama bir sitede, 6 ASCII karakteri içeren bir şifre kullansanız, entropi 39 bit oluyor ve bu da yarım trilyondan fazla ihtimal demek (2^39). Internette dolanan ortalama şifre entropisi de buna yakın. Epey yüksek değil mi?
Değil tabii ki. Zira pratikte kimse o ekstra karaterleri sonuna kadar kullanıp ^-_5!au@* gibi bir şifre seçmeyecek (bir password manager kullanmıyorlarsa tabii). İnsanlar kelimelerle düşündükleri için şifreler de kelime ağırlıklı oluyor. En sık kullanılan 10 bin kelimenin rakamlarla ve birbirleriyle olan kombinasyonunu denemek, tüm ASCII kümesini sırayla denemekten çok daha mantıklı.
Örneğin, baştaki xkcd karikatüründeki gibi, entropiyi arttırmak için 4 kelimelik uzun bir şifre seçerseniz, ama kelimelerinizin hepsi bu sık kullanılanlar listesinde olursa, durduk yere 10.000^4'lük bir arama kümesine hapsoluyorsunuz. Bu ilk bakışta yeterince büyük gelebilir, zira tam 10,000 katrilyon kombinasyon var. Ama aşağıdaki videoda görüldüğü gibi saniye 40 milyar şifre deneyebilen görece yaygın sistemler mevcut (Alt tarafı dört ekran kartını kullanan bir sistem bu, bir süperbilgisayar değil.) Demek ki 250 bin saniyede, yani 3 günden az bir sürede, o kümenin tümünü denemek mümkün.
Entropiyi arttırmak için garip karakter kullanmaktan ziyade şifreyi uzatmak daha mantıklı hakikaten de. Ama hackerların iş yükünü de entropiyle aynı oranda arttırmak için, kelimelerden en azından birinin size özel, gayet abuk bir şey olması gerekli.
***
Döner İstiyorum Ama Dönmesin İstiyorum
Tüm bunlar bizi bankaların kullandığı o garip şifre kurallarına getiriyor. Ziraat Bankası'nın şifre kuralları aşağıda. Çoğu yerde de aynı bunlar, National Institute of Standards and Technology gibi stardartları takip ediyorlar:
- Harf ya da rakam içerebilir. (Özel ASCII karakterleri bile yok)
- En az 1 rakam içermeli.
- İsminizi ve/veya soy isminizi içermemeli.
- 3 ya da daha fazla yan yana tekrar eden karakter içermemeli. (111,aaa vb.)
- Ardışık rakam ya da harflerden oluşmamalı. (123, abc vb.)
- Sıfır ile başlamamalı.
- Türkçe karakter içermemeli.
- 1900'den bulunduğumuz yıla kadar olan yılları içermemeli. (Örn:1980)
***
Görünüşte, insanların bilinen yatkınlıklarına karşı konulmuş ve hackerların iş yükünü arttıran kurallar bunlar. Fakat tam tersini yapıyorlar: "En az bir rakam olsun ama ardışık olmasın" dendiğinde, çoğumuz tek bir rakam kullanıyoruz ve onu da şifrenin ya başına, ya da sonuna koyuyoruz. "En az bir özel karakter olsun" denince, üstün bir yaratıcılık örneği olarak e yerine 3, a yerine @, i yerine 1 yazıyoruz. Veya ! işaretiyle bitiriyoruz.
Halbuki hackerların elinde hem sık kullanılanlar listeleri var, hem de daha ilginci, yukardaki varyasyonları yaratacak algoritmalar var. Yani sistem DepecheMode'u deneyip başarılı olamayınca, mal gibi sıradan gidip DepecheModf'i, DepecheModg'yi denemiyor. Onun yerine, algoritmasındaki "şimdi de e'leri 3 ile değiştirip bakalım" kuralını uyguluyor. O yemezse "harfleri alternatif biçimde büyük ve küçük yaparak bakalım" kuralını uyguluyor. Başına sonuna özel karakterler veya rakamlar ekleyip deniyor, vs.
Çok yaratıcı sandığımız her türlü varyasyonu alt tarafı 1-2 saniye içinde denemek mümkün. O yüzden başta demiştim, D3p3ch3M0d3 kötü bir şifre. Okuması ve hatırlaması zor ama bir sistem tarafından "tahmin edilmesi" görece kolay.
(O kadar lafını ettik, arkadaşların şu mük-kemmel videosunu koyalım.)
"Yeni Şifreniz Son 3 Şifrenizden Farklı Olmalı"
NIST ve benzerlerini takip eden hemen her kuruluşun kuralları insanları benzer tuzaklara düşürüyor. Ama Ziraat Bankası özellikle kötü çünkü kuralların arasında şu inciler de var:
- Şifreniz 6 karakterden oluşmalı.
- Son 3 şifrenizden farklı olmalı.
- 3 ayda bir değişmeli.
***
Bakın "en az 6" değil, illa 6 karakter. Hem zaten kısa bir şifre, hem de karakter sayısı tam olarak belli edilmiş. Bir hacker'a verilecek en büyük hediye bu olmalı.
Hani ATM'lerde veya kartların pin kodlarında "illa 4 karakter olsun" zorunluluğunu insan anlıyor, muhtemelen legacy sistemler yüzünden, yani eski sistemlere uyumluluk gerektiğinden. Ama web sitesi bu yahu. 5 bin tane bankanın ve onca başka sitenin hazır yapılmış örneği varken nedir bu saçmalık?
Bugün Ziraat bir şekilde hacklenmemişse, bu "güvenlik politikası" sayesinde değil, bu güvenlik politikasına rağmen hacklenmemiştir. Tahmin ediyorum ki milletin kıçını kurtaran asıl şey two factor authentication, yani telefonunuza gelen şifreler. (Bu konuda da Türk bankaları hakikaten ileri görüşlü davrandılar. Benim uğraştığım Amerikan bankalarının hiçbirinde 2FA yokken veya zorunlu değilken, Türkiye'de her yerde vardı.)
***
Bu yetmezmiş gibi, Ziraat şifreyi birkaç ayda bir değiştirtiyor ve son 3 şifremden farklı olmasını istiyor. Periyodik olarak şifre değiştirmenin amacı, şifresi çalınmış ama henüz kırılmamış olan insanları korumak (detaylarına ikinci bölümde değineceğim) ama bu politikanın doğal sonucu ne? Kimse her banka için 4 ayrı kuvvetli şifre ezberlemeyecektir. Hele ki karmaşık şifre kuralları varsa. Onun yerine sıkça yapılan 3 şey var:
- x1, x2, x3, tekrar x1, x2... gibi basit yöntemlerle şifre yenilemek
- Şifreleri bir kenara yazmak
- Hep aynı şifreleri kullanmak
Bunları üçü de ölümcül günah ve bazı insanlar üçünü de aynı anda yapıyorlar.
Benim Ziraat şifresi gibi, bir şifrenin x1, x2, x3 diye artarak giden varyasyonları hiçbir ekstra güvenlik sağlamadığı gibi (hackerların algoritmaları bunları deniyor zaten), insanları bu formata aktif biçimde yönlendiriyorlar. Bir hacker normalde 6 karakterli ASCII havuzunu deneyecekken, şimdi sadece 5 karakterli ASCII havuzunu deneyip (95 katlık bir iş yükü azalışı) sonuna 1,2,3 rakamlarını ekliyor mesela (3 katlık işyükü artışı).
Güvenliği arttırırmış gibi gözüken ama aslında azaltan uygulamalar, birer illüzyondan da kötüler. İllüzyon dediğimiz şey etkisiz elemandır. Oysa bunların negatif etkileri var. Zaten bu yüzden Google sizden 3 ayda bir şifre yenilemenizi istemiyor.
***
Pratik Tavsiyeler bölümünde, şifreleri not etme ve aynı şifreyi kullanma günahlarına değineceğim. Ama ondan önce, bu bahsettiğim şifre kırma işi gerçek hayatta nasıl yapılıyor, ona bakalım. Şifremi hepi topu 3 kez yanlış yazdığımda hesabım kilitleniyorsa, hackerlar nasıl oluyor da saniyede 40 milyar kombinasyon deniyorlar? LinkedIn şifrelerinin çalınması niye büyük olay olmuştu?
Bunlar ikinci bölümde...