Ders 08 / 17
Kimlik Doğrulama Gerçekleştirim Hataları
Gerçekleştirim hatasının sızdırılan bilgi cinsinden ölçülmesi: sekiz kimlik doğrulama noktasında ayrık hata mesajı, kayıt yokken atlanan iş ve ilk uyuşmazlıkta çıkan karşılaştırma üç kanal olarak sayılır ve beşi sızdırır, yanıt süresi farkı ham süre yazılmadan bant denetimiyle gösterilir, tek kanalı kapatan önlem beşten yalnız birini kapatır, üç kanalı birden kapatan merkezî doğrulayıcı dokuzuncu noktayı kendiliğinden örter ve dördüncü kanal sayıma katıldığında aynı kalıbın dışarıda bıraktığı nokta ikiye çıkar.
İçindekiler
Önceki konu dışarıdan gelen verinin sınırını çizdi ve aynı üç sütunu her nokta kümesinde yazdı: kaç nokta var, kalıp kaçını örtüyor, kaç nokta dışarıda kalıyor. Bütün o ölçümler tek bir varsayımın üstünde durdu — isteğin arkasındaki kişinin kim olduğu zaten bilinmektedir. Veri kurallara uygun olabilir ve yine de yanlış kişiden gelmiş olabilir.
Bu konu o varsayımı kaldırır. Kimlik doğrulamanın hangi akışla yapıldığı burada ele alınmıyor; akışların türleri ve kimlik bilgisinin nasıl saklandığı Kimlik ve Yetki kursunun konusudur. Burada ölçülen şey gerçekleştirimdir: doğru kimlik bilgisini hiç bilmeyen birine sunucunun verdiği yanıt, doğru bilgiyi bilmeden de bir şey söylüyor mu?
Sızdırılan Bilgi Sayılabilir
Bir kimlik doğrulama noktası iki şeyi ayrı ayrı bilir: aranan kayıt var mı, sunulan kimlik bilgisi doğru mu. Yanıt yalnız ikincisini söylemelidir. Birincisinin dışarıdan ayırt edilebilmesine kullanıcı numaralandırma (user enumeration) denir: saldırgan hiçbir parolayı bilmeden, hangi abone numaralarının kayıtlı olduğunu öğrenir. Bu bilgi tek başına erişim vermez; sonraki her denemenin hedef kümesini daraltır.
Numaralandırmayı bir servis üzerinde denemek yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır. Aşağıdaki envanter ve ölçüm, kurgu bölgesel ölçüm ağının kendi kodu üzerinde koşar; gerçek bir servis, gerçek bir hesap ve gerçek bir parola yoktur.
// kimlik/nokta.mjs — abone portalinin kimlik dogrulama noktalari (model): gercek bir servis, // gercek bir hesap ve gercek bir parola yok. Rastgelelik yok, is miktari sabittir. import { createHash } from "node:crypto"; // KH1: bir nokta kullanici varligini uc ayri kanaldan sizdirabilir — hata mesaji ayrik mi, // kayit yokken yapilan is farkli mi, karsilastirma ilk uyusmazlikta cikiyor mu. Dorduncu alan // `kilit` envanterde sayilmayan bir kanaldir; dersin son bolumunde sayima katilir. export const NOKTA = [ { ad: "portal-giris", mesaj: "tek", is: "sabit", kars: "sabit", kilit: "ayrik" }, { ad: "portal-sifirlama", mesaj: "ayrik", is: "erken-donus", kars: "sabit", kilit: "tek" }, { ad: "portal-eposta-degistir", mesaj: "ayrik", is: "sabit", kars: "sabit", kilit: "tek" }, { ad: "saha-uygulamasi-giris", mesaj: "tek", is: "sabit", kars: "sabit", kilit: "tek" }, { ad: "sayac-alim-anahtari", mesaj: "tek", is: "erken-donus", kars: "erken-cikis", kilit: "tek" }, { ad: "fatura-sorgu", mesaj: "ayrik", is: "erken-donus", kars: "erken-cikis", kilit: "tek" }, { ad: "ikinci-etmen-kodu", mesaj: "tek", is: "sabit", kars: "sabit", kilit: "ayrik" }, { ad: "rapor-ucu-anahtari", mesaj: "tek", is: "sabit", kars: "erken-cikis", kilit: "tek" }, ]; // KH2: is birimi sabit adimli bir karma dongusudur; ham sure degil, adim sayisi yazilir. export const ARAMA = 2000, DOGRULAMA = 20000; const dongu = (tohum, adim) => { let s = tohum; for (let i = 0; i < adim; i++) s = createHash("sha256").update(s).digest("hex"); return s; }; const KAYIT = new Set(["a-4471", "a-5120", "a-6033"]); // Kusurlu gerceklestirim: kayit yoksa dogrulama isi hic yapilmaz, mesaj da ayrilir. export function kusurlu(abone, sunulan) { dongu(abone, ARAMA); if (!KAYIT.has(abone)) return { mesaj: "abone bulunamadi", adim: ARAMA }; dongu(sunulan, DOGRULAMA); return { mesaj: "parola hatali", adim: ARAMA + DOGRULAMA }; } // Kalipli gerceklestirim: kayit yoksa da ayni is yapilir, mesaj tektir. export function kalipli(abone, sunulan) { dongu(abone, ARAMA); const bulundu = KAYIT.has(abone); dongu(bulundu ? sunulan : "yer-tutucu-karsilastirma-tohumu", DOGRULAMA); return { mesaj: "abone numarasi ya da parola hatali", adim: ARAMA + DOGRULAMA }; }
// kimlik/kapsama.mjs — kac nokta var, kalip kacini ortuyor, kac nokta disarida kaliyor. import { NOKTA, kusurlu, kalipli } from "./nokta.mjs"; const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); // KH3: bir nokta uc kanaldan en az biri aciksa kullanici varligini sizdiriyor sayilir. const UC = ["mesaj", "is", "kars"]; const kanal = (n, kapali = [], liste = UC) => liste.filter((k) => !kapali.includes(k) && n[k] !== "tek" && n[k] !== "sabit"); const A = [-24, 7, 14, 15, 8, 12]; console.log(`1. ${NOKTA.length} kimlik dogrulama noktasi ve acik kanallari`); yaz(A, "nokta", "mesaj", "kayit yokken", "karsilastirma", "kanal", "sizdiriyor"); for (const n of NOKTA) yaz(A, n.ad, n.mesaj, n.is, n.kars, kanal(n).length, kanal(n).length ? "EVET" : "hayir"); const sizan = (kume, kapali, liste) => kume.filter((n) => kanal(n, kapali, liste).length).length; console.log(`sizdiran nokta: ${sizan(NOKTA, [])} / ${NOKTA.length}`); // KH4: sure ham olarak yazilmaz. Beklenen oran adim sayisindan turetilir; olculen deger // yalniz bant denetiminden gecer ve evet/hayir yazilir. const ortanca = (d) => d.slice().sort((a, b) => a - b)[d.length >> 1]; const olc = (f, abone) => { const d = []; for (let i = 0; i < 15; i++) { const t = process.hrtime.bigint(); f(abone, "sunulan-deger"); d.push(Number(process.hrtime.bigint() - t)); } return ortanca(d); }; const B = [-12, 11, 11, 15, 14, 9, 15]; console.log("\n2. yanit suresi farki (ham sure yazilmaz; beklenen oran adim sayisindan gelir)"); yaz(B, "gercekleme", "adim yok", "adim var", "beklenen oran", "bant", "bantta", "varlik siziyor"); for (const [ad, f] of [["kusurlu", kusurlu], ["kalipli", kalipli]]) { const yok = f("a-0000", "x").adim, evet = f("a-4471", "x").adim; const beklenen = evet / yok, alt = beklenen / 2, ust = beklenen * 2; const olculen = olc(f, "a-4471") / olc(f, "a-0000"); yaz(B, ad, yok, evet, beklenen.toFixed(2), `${alt.toFixed(2)}..${ust.toFixed(2)}`, olculen >= alt && olculen <= ust ? "evet" : "HAYIR", beklenen > 1.5 ? "EVET" : "hayir"); } // 3. kapsama: hangi onlem kac noktayi kendiliginden kapatiyor const YENI = { ad: "saha-cihaz-eslesme", mesaj: "ayrik", is: "erken-donus", kars: "erken-cikis" }; const genis = [...NOKTA, YENI]; const C = [-34, 7, 11, 11]; console.log("\n3. onlem kac noktayi kapatiyor"); yaz(C, "onlem", "nokta", "sizdiran", "disarida %"); for (const [ad, k, kapali] of [ ["bugunku dagitik durum", NOKTA, []], ["yalniz sabit sureli karsilastirma", NOKTA, ["kars"]], ["yalniz tek hata mesaji", NOKTA, ["mesaj"]], ["merkezi dogrulayici (uc kanal)", NOKTA, ["mesaj", "is", "kars"]], ["yeni nokta eklendi, dagitik", genis, []], ["yeni nokta eklendi, merkezi kalip", genis, ["mesaj", "is", "kars"]], ]) yaz(C, ad, k.length, sizan(k, kapali), ((sizan(k, kapali) / k.length) * 100).toFixed(1)); // 4. envanterin kendisi eksikse: kilit yaniti dorduncu kanal olarak sayima katilir const DORT = [...UC, "kilit"]; console.log("\n4. dorduncu kanal sayima katilinca"); yaz(C, "sayim", "nokta", "sizdiran", "disarida %"); for (const [ad, liste, kapali] of [ ["uc kanal, merkezi dogrulayici", UC, UC], ["dort kanal, merkezi dogrulayici", DORT, UC], ["dort kanal, kilit yaniti da tek", DORT, DORT], ]) yaz(C, ad, NOKTA.length, sizan(NOKTA, kapali, liste), ((sizan(NOKTA, kapali, liste) / NOKTA.length) * 100).toFixed(1));
1. 8 kimlik dogrulama noktasi ve acik kanallari nokta mesaj kayit yokken karsilastirma kanal sizdiriyor portal-giris tek sabit sabit 0 hayir portal-sifirlama ayrik erken-donus sabit 2 EVET portal-eposta-degistir ayrik sabit sabit 1 EVET saha-uygulamasi-giris tek sabit sabit 0 hayir sayac-alim-anahtari tek erken-donus erken-cikis 2 EVET fatura-sorgu ayrik erken-donus erken-cikis 3 EVET ikinci-etmen-kodu tek sabit sabit 0 hayir rapor-ucu-anahtari tek sabit erken-cikis 1 EVET sizdiran nokta: 5 / 8 2. yanit suresi farki (ham sure yazilmaz; beklenen oran adim sayisindan gelir) gercekleme adim yok adim var beklenen oran bant bantta varlik siziyor kusurlu 2000 22000 11.00 5.50..22.00 evet EVET kalipli 22000 22000 1.00 0.50..2.00 evet hayir 3. onlem kac noktayi kapatiyor onlem nokta sizdiran disarida % bugunku dagitik durum 8 5 62.5 yalniz sabit sureli karsilastirma 8 4 50.0 yalniz tek hata mesaji 8 4 50.0 merkezi dogrulayici (uc kanal) 8 0 0.0 yeni nokta eklendi, dagitik 9 6 66.7 yeni nokta eklendi, merkezi kalip 9 0 0.0 4. dorduncu kanal sayima katilinca sayim nokta sizdiran disarida % uc kanal, merkezi dogrulayici 8 0 0.0 dort kanal, merkezi dogrulayici 8 2 25.0 dort kanal, kilit yaniti da tek 8 0 0.0
Sayılar ölçüm sınıfındadır; girdileri KH1–KH4’tür.
Beş Nokta ve Üç Kanal
Birinci tablo envanteri açar. Sekiz noktanın beşi kullanıcı varlığını sızdırıyor ve sızıntının kaç kanaldan geldiği noktadan noktaya değişiyor.
portal-eposta-degistir yalnız mesajdan sızdırır: kayıt yokken farklı bir metin döner, iş
miktarı aynıdır. rapor-ucu-anahtari tam tersidir; mesajı tektir ve kayıt yokken de aynı
işi yapar, ama anahtar karşılaştırması ilk uyuşmayan bayta gelince çıkar. fatura-sorgu üç
kanalı birden açık tutar.
Bu dağılım, envanterin niçin nokta nokta çıkarıldığını gösterir. “Hata mesajları tektir”
cümlesi bir kapsama iddiasıdır ve tabloda karşılığı vardır: mesaj sütununda tek yazan beş
nokta. Ama o beş noktanın ikisi başka bir kanaldan sızdırmayı sürdürüyor. Kanal sayısı bir
noktanın ne kadar açık olduğunu değil, kaç ayrı yerde düzeltme gerektiğini söyler.
Envanterde noktaların hepsinin bir giriş ekranı olmadığına dikkat etmek gerekir.
sayac-alim-anahtari ve rapor-ucu-anahtari insan görmeyen uçlardır; kimlik bilgisi bir
anahtardır, kimlik doğrulama yine de yapılır ve aynı üç kanal yine açıktır. Kimlik doğrulama
noktası sayılırken “kullanıcı girişi” aranırsa envanter eksik çıkar. Ölçüt tek cümledir: bir
noktada sunulan bir değer bilinen bir kayıtla karşılaştırılıyorsa, o nokta envantere girer.
Süre Yazılmaz, Bant Denetlenir
İkinci tablo bu dersin ölçüm kalıbıdır. Yanıt süresi farkı gerçek bir sızıntı kanalıdır ama ham milisaniye bir ölçüm değildir: makineye, yüke ve o anki iş yüküne bağlıdır, aynı kodda iki koşumda iki farklı sayı verir ve iki sayının karşılaştırılabilir olup olmadığı bilinmez.
Ölçüm şöyle kurulur. Beklenen değer girdiden türetilir: kusurlu gerçekleştirim kayıt
yokken 2.000 adım, kayıt varken 22.000 adım yapar; beklenen oran 11,00’dir. Bant bu değerin
yarısı ile iki katı arasındadır. Ölçülen süre oranı yalnız bu banda düşüp düşmediğiyle
raporlanır — sayı çıktıya yazılmaz, evet yazılır. Kalıplı gerçekleştirimde iki yol da
22.000 adımdır, beklenen oran 1,00’dir ve ölçülen değer 0,50–2,00 bandındadır.
Son sütun kararı verir. Beklenen oran 1’e yakınsa süre farkından çıkarılabilecek bir bilgi yoktur; 11 ise vardır. Bu ayrım koşumdan koşuma değişmez, çünkü ham süreye değil adım sayısına dayanır. Ölçülen değerin işi yalnız modelin gerçekten böyle davrandığını doğrulamaktır.
Sabit süreli karşılaştırma (constant-time comparison) bu kanalın yalnız bir parçasını kapatır: karşılaştırmanın kendi içindeki erken çıkışı. Kayıt bulunamadığında doğrulama işinin hiç yapılmaması ondan önce gelir ve sabit süreli karşılaştırma oraya dokunmaz. İkinci tablodaki 11,00 oranı sabit süreli karşılaştırmayla 11,00 kalır.
Tek Kanalı Kapatan Önlem Ne Kapatıyor
Üçüncü tablo kapsamayı sayar. Bugünkü dağıtık durumda sekiz noktanın beşi sızdırıyor; dışarıda kalan oran %62,5.
Yalnız sabit süreli karşılaştırma uygulanırsa sızdıran nokta sayısı 5’ten 4’e iner. Tek
kapanan nokta rapor-ucu-anahtari‘dır, çünkü onun tek açık kanalı karşılaştırmaydı. Yalnız
tek hata mesajı uygulandığında da sonuç aynıdır: 5’ten 4’e. İki önlem farklı noktaları
kapatır ama her ikisinin kapsaması birdir. Bir sızıntı sınıfını üç kanaldan yalnız biriyle
ölçen bir denetim, işin beşte dördünü açık bırakır.
Üç kanalı birlikte kapatan merkezî doğrulayıcı sızdıran nokta sayısını sıfıra indirir. Kalıbın içeriği tek cümledir: kayıt bulunsa da bulunmasa da aynı iş yapılır, aynı mesaj döner, karşılaştırma sabit sürelidir. Bu kalıp bir kural listesi değil, tek bir işlevdir; noktalar onu çağırır.
Aradaki fark, kuralın nerede yazıldığıdır. Dağıtık savunmada “hata mesajları ayrılmasın” kuralı sekiz ayrı yerde uygulanmak zorundadır ve doğru uygulandığı ancak sekiz yer tek tek okunarak bilinir. Merkezî kalıpta aynı kural bir yerde uygulanır; okunacak yer birdir, sınanacak yer birdir. Kapsama sayısının anlamı da budur: 8’de 8 kapsama, sekiz doğru gerçekleştirim değil, bir doğru gerçekleştirim ve sekiz çağrıdır.
Son iki satır bu kursun üçüncü sorusunu yanıtlar. Envantere dokuzuncu bir nokta —
saha-cihaz-eslesme — eklendiğinde dağıtık durumda sızdıran nokta 5’ten 6’ya çıkar ve
dışarıda kalan oran %66,7’ye yükselir. Merkezî kalıpta aynı nokta hiçbir ek iş yapılmadan
kapsanır ve sızdıran nokta sayısı 0 kalır. Fark kalıbın gücünde değil, yeni noktanın
savunmayı çağırmak zorunda olmasındadır: dağıtık savunmada her yeni nokta bir açık adayı,
merkezî kalıpta yalnız bir çağrıdır.
Envanterin Kendisi Eksik Olabilir
Üçüncü tablonun son satırı sıfır yazıyor ve bu sayı yanıltıcıdır. Sıfır, “hiçbir nokta sızdırmıyor” demez; sayılan üç kanalda hiçbir nokta sızdırmıyor der. Kapsama ölçüsü sayılan kanal kümesine bağlıdır.
Dördüncü tablo envantere dördüncü bir kanal katar: art arda başarısız denemeden sonra hesabın kilitlendiğini bildiren yanıt. Bu yanıt, kilitlenebilen bir hesabın var olduğunu söyler; kayıtlı olmayan bir abone numarası hiçbir zaman kilitlenmez. Üç kanallı sayımda merkezî doğrulayıcı sıfır veriyordu; dört kanallı sayımda aynı doğrulayıcı 2 noktada sızdırıyor — dışarıda kalan oran %25. Kilit kararı doğrulayıcının kendisinde değil, ondan sonra gelen sayaç katmanında verilir; kalıp o katmanı çağırmadığı için oraya dokunmaz.
Son satır kalıbın nasıl genişletildiğini gösterir: kilit yanıtı da tek biçime çekildiğinde sayı yeniden sıfırlanır. Buradaki ders kalıbın yetersizliği değil, ölçünün sınırıdır. Kapsama yüzdesi bir savunmanın gücünü değil, envanterde sayılan kanal sayısına göre konumunu verir. Yeni bir kanal keşfedildiğinde bütün geçmiş kapsama sayıları yeniden hesaplanır; kalıbın değeri, bu hesabın tek bir yerde yapılabilmesidir.
Özet
- Kimlik doğrulama gerçekleştirimi, doğru kimlik bilgisi hiç bilinmeden de bilgi sızdırabilir; sızan bilgi kullanıcı varlığıdır ve nokta sayısıyla ölçülür.
- Sekiz noktalık envanterde üç kanal sayıldı — ayrık hata mesajı, kayıt yokken atlanan iş, ilk uyuşmazlıkta çıkan karşılaştırma — ve beş nokta en az bir kanaldan sızdırdı.
- Yanıt süresi farkı ham süreyle değil bant denetimiyle yazılır: beklenen oran adım sayısından türetilir, ölçülen değer yalnız bandın içinde olup olmadığıyla raporlanır.
- Sabit süreli karşılaştırma üç kanaldan yalnız birini kapatır; beş sızdıran noktanın dördü açık kalır. Tek hata mesajı da tek başına dördü açık bırakır.
- Üç kanalı birden kapatan merkezî doğrulayıcı sıfır sızdıran nokta verir ve dokuzuncu nokta eklendiğinde onu ek iş olmadan kapsar; dağıtık durumda aynı nokta dışarıda kalanı 6’ya çıkarır.
- Kapsama sayısı sayılan kanal kümesine bağlıdır: kilit yanıtı dördüncü kanal olarak eklendiğinde aynı merkezî doğrulayıcının dışarıda bıraktığı nokta 0’dan 2’ye çıkar.
Sonraki Adım
Bu ders kimliğin belirlendiği anı ölçtü. Doğrulama başarılı olduğunda ise ortaya yeni bir nesne çıkar: sonraki isteklerde kimliği yeniden sormamak için üretilen oturum kimliği. O kimliğin ne zaman üretildiği, doğrulama başarılı olduğunda değişip değişmediği ve kullanıcı çıkış yaptığında sunucu tarafında gerçekten geçersiz kılınıp kılınmadığı ayrı kararlardır — ve bu kararların her biri bir akışta ayrı ayrı verilir. Sonraki ders akış kümesini çıkarır: kaç akış oturum kimliği üretiyor, kaçı üretirken eskisini yenilemiyor ve sunucu tarafında geçersiz kılma olmadığında çıkıştan sonra kaç oturum yaşamaya devam ediyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.