İçeriğe geç
academia.sh

Ders 20 / 22

Parola Saldırıları

Üç parola saldırısı biçiminin maliyet ve eşik ekseninde ayrılması: dört yüz kurgu hesapta kaba kuvvetin yüz doksan, sözlüğün yüz seksen, püskürtmenin on sekiz hesabı düşürmesi, hesap kilitlemenin üç biçimin ikisini durdurup düşen hesabı yüzde seksen yedi azaltması, püskürtmenin hesap başına üç deneme ile kilitleme eşiğini hiç tetiklememesi ve üç biçimi de gören iki eşiğin toplam meşru bedelinin dört olması.

İçindekiler

Önceki dersin zincirinde bir alanın sınırı yoktu ve savunma o sınırı koymakla ilgiliydi. Bu dersin sınıfında sınır zaten vardır: bir kimlik denemesi kabul edilir ya da edilmez, deneme sayısı sayılır ve bir eşiğe bağlanır. Saldıran sınırı aşmaya değil, altında kalmaya çalışır.

Üç biçim ayrılır. Kaba kuvvet tek bir hesaba çok sayıda aday dener. Sözlük aynı şeyi daha kısa ve daha olası bir aday dizisiyle yapar. Püskürtme ise tersine döner: çok sayıda hesaba, her birine yalnız birkaç aday dener. Üçü de aynı zinciri kullanır, ama eşik karşısındaki davranışları farklıdır ve bu ders o farkı sayar. Hiçbir parola, aday listesi ya da deneme betiği yazılmaz; her hesabın parolası yalnız sıralı bir aday dizisinde kaçıncı sırada olduğu sayısıyla temsil edilir.

Zincirin Altı Adımı

  1. Geçerli kullanıcı adı kümesi. Önkoşul: hesap adları biliniyor ya da öğrenilebiliyor.
  2. Deneme kanalı açık. Önkoşul: uç kimlik denemesi kabul ediyor.
  3. Deneme bütçesi eşiğin altında kalıyor. Önkoşul: kullanılan ölçekte sayan bir eşik bu hızı görmüyor.
  4. Doğru eşleşme bulunuyor. Önkoşul: parola, bütçenin kapsadığı aday aralığında.
  5. İkinci etmen istenmiyor. Önkoşul: hesapta ikinci bir doğrulama etmeni tanımlı değil.
  6. Oturum kuruluyor ve kullanılıyor. Önkoşul: oturum davranışı üzerinde bir denetim yok.

Üçüncü adım bu dersin ölçtüğü adımdır ve tek bir eşiğe değil, eşiğin ölçeğine bağlıdır. Aynı eşik değeri, hesap başına sayıldığında bir biçimi durdurur, kaynak başına sayıldığında başkasını.

Beşinci ve altıncı adımlar ölçümün dışında tutulur ama zincirin parçasıdır. İkinci bir doğrulama etmeni tanımlıysa dördüncü adım tamamlansa bile zincir beşinci adımda kırılır: doğru parola bulunmuştur ve hiçbir işe yaramaz. Oturum davranışı üzerindeki bir denetim ise altıncı adımı kırar; orada zincir tamamlanmıştır ve ölçü tespite kaymıştır. Bu iki adım, üçüncü adımın hiç kırılamadığı durumlarda geriye kalan tek savunmadır — ve bu dersin bütün sayıları onlar yokmuş gibi hesaplanır, çünkü ölçülen şey eşiğin kendisidir.

TS26: hesap kümesi kurgudur; sira, parolanın sıralı aday dizisindeki yeridir. TS27: üç eşik üç ayrı ölçekte sayar. TS28: üç biçim yalnızca iki sayıyla ayrılır — kaç hesaba dokunduğu ve hesap başına kaç deneme yaptığı. TS29: süre, hız sınırının izin verdiği azami hızda hesaplanır.

// ps/model.mjs — parola saldirisi maliyet modeli. Hicbir parola, sozluk ya da deneme
// betigi yok; her hesabin parolasi yalnizca "sirali bir aday dizisinde kacinci sirada
// oldugu" sayisiyla temsil edilir.
export const HESAP_SAYISI = 400;

// Kendi yazilan uretec; tohum gorunur, kosumdan kosuma ayni sonucu verir.
function uretec(tohum) {
  let s = tohum >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296;
}

export const KOVA = [[24, 1, 5], [60, 6, 500], [96, 501, 50000], [40, 50001, 5000000]];

export function hesaplar(tohum = 20260802) {
  const r = uretec(tohum);
  const h = [];
  for (const [adet, alt, ust] of KOVA)
    for (let i = 0; i < adet; i++) h.push({ sira: alt + Math.floor(r() * (ust - alt + 1)) });
  while (h.length < HESAP_SAYISI) h.push({ sira: Infinity });
  return h;
}

// mesru = kurgu gunluk yanlis kalma (dogru kullanicinin engellenmesi).
export const ESIK = [
  { ad: "hesap-kilitleme", olcek: "hesap", limit: 5, mesru: 30 },
  { ad: "kaynak-hiz-siniri", olcek: "kaynak", limit: 60, mesru: 4 },
  { ad: "genel-oran-esigi", olcek: "sistem", limit: 200, mesru: 0 },
];

export const BICIM = [
  { ad: "kaba-kuvvet", hesap: 1, butce: 1000000 },
  { ad: "sozluk", hesap: 1, butce: 50000 },
  { ad: "puskurtme", hesap: HESAP_SAYISI, butce: 3 },
];

export const sure = (deneme) => {
  const dk = deneme / ESIK[1].limit;
  return dk < 1 ? `${(dk * 60).toFixed(0)} sn` : dk < 60 ? `${dk.toFixed(0)} dk`
    : dk < 1440 ? `${(dk / 60).toFixed(1)} sa`
    : `${(dk / 1440).toFixed(1)} gun`;
};

export const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
// ps/olcum.mjs — uc bicim uc esik altinda kosturulur: hesap basina kac deneme, hangi esik
// kacinci denemede devreye giriyor, kac hesap dusuyor ve ne kadar surede. Rastgelelik
// uretecten gelir, tohum gorunurdur; kosumdan kosuma ayni sonuc cikar.
import { HESAP_SAYISI, hesaplar, ESIK, BICIM, sure, yaz } from "./model.mjs";

const H = hesaplar();
const kova = (h) => h.sira <= 5 ? "ilk 5" : h.sira <= 500 ? "ilk 500"
  : h.sira <= 50000 ? "ilk 50.000" : h.sira <= 5000000 ? "ilk 5.000.000" : "butce disi";
const KOVALAR = ["ilk 5", "ilk 500", "ilk 50.000", "ilk 5.000.000", "butce disi"];

console.log(`${HESAP_SAYISI} kurgu hesap, ${BICIM.length} bicim, ${ESIK.length} esik\n`);

const A = [-16, 9, 9];
console.log("1. hesaplarin aday dizisindeki dagilimi");
yaz(A, "kova", "hesap", "pay");
for (const k of KOVALAR) {
  const n = H.filter((h) => kova(h) === k).length;
  yaz(A, k, n, `%${((n / HESAP_SAYISI) * 100).toFixed(1)}`);
}

// Bir esik bicimi gorur mu: hesap olcegi hesap basina, kaynak ve sistem olcegi toplam
// deneme uzerinden sayar.
const gorur = (b, e) => (e.olcek === "hesap" ? b.butce : b.hesap * b.butce) > e.limit;

const B = [-13, 8, 15, 16, 16, 20];
console.log("\n2. bicim basina esik davranisi");
yaz(B, "bicim", "hesap", "hesap basina", "toplam deneme", "kilitleme", "ilk goren esik");
for (const b of BICIM) {
  const goren = ESIK.filter((e) => gorur(b, e));
  yaz(B, b.ad, b.hesap, b.butce, b.hesap * b.butce,
    gorur(b, ESIK[0]) ? `${ESIK[0].limit}. denemede` : "tetiklenmiyor",
    goren.length ? goren[0].ad : "yok");
}

// Her bicim her hesabi sirayla hedef alsaydi kac hesap duserdi.
const dusen = (b, kilitVar) => {
  const butce = kilitVar ? Math.min(b.butce, ESIK[0].limit) : b.butce;
  return H.filter((h) => h.sira <= butce).length;
};

const C = [-13, 14, 15, 20, 8, 20];
console.log("\n3. hedef alinan hesaplardan kaci duser");
yaz(C, "bicim", "kilitleme yok", "kilitleme var", "kilitlemenin farki", "fark", "hesap basina sure");
for (const b of BICIM) {
  const y = dusen(b, false), v = dusen(b, true);
  yaz(C, b.ad, `${y}/${HESAP_SAYISI}`, `${v}/${HESAP_SAYISI}`, y - v,
    `%${(((y - v) / Math.max(y, 1)) * 100).toFixed(0)}`, sure(b.butce));
}
console.log(`kilitlemenin dusen hesap sayisini azalttigi bicim: ` +
  `${BICIM.filter((b) => dusen(b, false) > dusen(b, true)).length}/${BICIM.length}`);

const p = BICIM[2];
const D = [-18, 10, 10, 18];
console.log("\n4. puskurtmeyi hangi esik gorur");
yaz(D, "esik", "olcek", "limit", "gorur mu");
for (const e of ESIK)
  yaz(D, e.ad, e.olcek, e.limit, gorur(p, e) ? `${e.limit}. denemede` : "gormuyor");
console.log(`puskurtme hesap basina ${p.butce} deneme yapar; kilitleme esigi ${ESIK[0].limit} ` +
  `oldugu icin hicbir hesapta tetiklenmez. Toplam ${p.hesap * p.butce} deneme oran esigini ` +
  `${(p.hesap * p.butce / ESIK[2].limit).toFixed(1)} kat asar, suresi ${sure(p.hesap * p.butce)}`);

const E = [-18, 9, 12, 34];
console.log("\n5. esiklerin mesru bedeli");
yaz(E, "esik", "mesru", "goren bicim", "gordugu bicimler");
for (const e of ESIK) {
  const g = BICIM.filter((b) => gorur(b, e));
  yaz(E, e.ad, e.mesru, `${g.length}/${BICIM.length}`, g.map((b) => b.ad).join(",") || "-");
}
console.log(`toplam mesru bedel ${ESIK.reduce((t, e) => t + e.mesru, 0)} kurgu kalem/gun; ` +
  `uc bicimi de goren iki esigin toplam bedeli ${ESIK[1].mesru + ESIK[2].mesru}`);
400 kurgu hesap, 3 bicim, 3 esik

1. hesaplarin aday dizisindeki dagilimi
kova                hesap      pay
ilk 5                  24     %6.0
ilk 500                60    %15.0
ilk 50.000             96    %24.0
ilk 5.000.000          40    %10.0
butce disi            180    %45.0

2. bicim basina esik davranisi
bicim           hesap   hesap basina   toplam deneme       kilitleme      ilk goren esik
kaba-kuvvet         1        1000000         1000000     5. denemede     hesap-kilitleme
sozluk              1          50000           50000     5. denemede     hesap-kilitleme
puskurtme         400              3            1200   tetiklenmiyor   kaynak-hiz-siniri

3. hedef alinan hesaplardan kaci duser
bicim         kilitleme yok  kilitleme var  kilitlemenin farki    fark   hesap basina sure
kaba-kuvvet         190/400         24/400                 166     %87            11.6 gun
sozluk              180/400         24/400                 156     %87             13.9 sa
puskurtme            18/400         18/400                   0      %0                3 sn
kilitlemenin dusen hesap sayisini azalttigi bicim: 2/3

4. puskurtmeyi hangi esik gorur
esik                   olcek     limit          gorur mu
hesap-kilitleme        hesap         5          gormuyor
kaynak-hiz-siniri     kaynak        60      60. denemede
genel-oran-esigi      sistem       200     200. denemede
puskurtme hesap basina 3 deneme yapar; kilitleme esigi 5 oldugu icin hicbir hesapta tetiklenmez. Toplam 1200 deneme oran esigini 6.0 kat asar, suresi 20 dk

5. esiklerin mesru bedeli
esik                  mesru goren bicim                  gordugu bicimler
hesap-kilitleme          30         2/3                kaba-kuvvet,sozluk
kaynak-hiz-siniri         4         3/3      kaba-kuvvet,sozluk,puskurtme
genel-oran-esigi          0         3/3      kaba-kuvvet,sozluk,puskurtme
toplam mesru bedel 34 kurgu kalem/gun; uc bicimi de goren iki esigin toplam bedeli 4

İki Sayı, Üç Biçim

İkinci çıktı üç biçimi yalnız iki sayıyla ayırır: kaç hesaba dokunuyor, hesap başına kaç deneme yapıyor. Kaba kuvvet 1 hesap ve 1.000.000 deneme; sözlük 1 hesap ve 50.000; püskürtme 400 hesap ve 3 deneme.

Toplam deneme sayısı sıralamayı tersine çevirmez ama yanıltıcıdır: püskürtmenin toplamı 1.200’dür ve kaba kuvvetin binde birinden azdır. Buna karşılık kaba kuvvet tek bir hesabı hedefler, püskürtme dört yüzünü. Bir saldırı biçimini toplam deneme sayısıyla anmak, hangi eşiğin onu göreceğini söylemez.

Kilitleme sütunu farkı doğrudan verir. Kaba kuvvet ve sözlük beşinci denemede kilitlemeye takılır; püskürtme hiç takılmaz. Nedeni tek bir karşılaştırmadır: kilitleme hesap başına sayar ve püskürtmenin hesap başına deneme sayısı eşiğin altındadır. Eşiği 5’ten 3’e indirmek de yetmez; püskürtme bütçesini 2’ye indirir ve yine altta kalır. Hesap ölçeğinde sayan bir eşik, hesap ölçeğinde küçük kalan bir biçimi tanım gereği görmez.

Kaç Hesap Düşüyor

Üçüncü çıktı her biçimin bütün hesapları sırayla hedef alması durumunu ölçer. Kilitleme yokken kaba kuvvet 400 hesabın 190’ını, sözlük 180’ini, püskürtme 18’ini düşürür. Kilitleme varken üç biçimin de hesap başına bütçesi 5’e iner: kaba kuvvet ve sözlük 24 hesaba düşer, püskürtme 18’de kalır.

Kilitlemenin farkı ilk iki biçimde 166 ve 156 hesaptır — düşen hesap sayısının %87’si. Püskürtmede fark sıfırdır. Bu iki sayının yan yana durması bu dersin sonucudur: aynı eşik, iki biçimde savunmanın en güçlü kalemi, üçüncüde hiçbir şeydir.

Kilitleme altında üç biçimin de aynı sayıya yaklaşması ayrıca dikkat çekicidir: 24, 24 ve 18. Hesap başına bütçe beşe indiğinde biçimler arasındaki bütün fark silinir, çünkü fark bütçenin kendisinden geliyordu. Kilitleme bir saldırı biçimini değil, bütçeyi hedefler; bu yüzden bütçesi zaten küçük olan biçim üzerinde hiçbir etkisi olmaz.

Süre sütunu maliyetin öteki yüzünü verir. Hız sınırının izin verdiği azami hızda kaba kuvvet tek bir hesap için 11,6 gün, sözlük 13,9 saat, püskürtme 3 saniye sürer. Püskürtme yalnız kilitlemeden kaçmakla kalmaz; on sekiz hesabı, kaba kuvvetin bir hesap için harcadığı sürenin milyonda birinde düşürür.

Sürenin kendisi de bir savunma değildir, bir bütçe kısıtıdır. On bir günlük bir koşum boyunca hiçbir eşik devreye girmese bile, o süre boyunca denemenin sürdürülebilir olması gerekir: bağlantının açık kalması, kaynağın engellenmemesi, hesabın silinmemesi. Hız sınırının asıl işlevi bu bütçeyi büyütmektir; düşen hesap sayısını doğrudan azaltmaz, düşme için gereken süreyi uzatır ve bu süre boyunca tespitin çalışması için yer açar.

Birinci çıktı bu farkın nereden geldiğini söyler. Hesapların %6’sı ilk beş adayın içindedir, %45’i hiçbir bütçede bulunamaz. Bütçeyi 50.000’den 1.000.000’a çıkarmak düşen hesabı 180’den yalnız 190’a taşır — yirmi kat bütçe, on hesap. Aday dizisinin başındaki birkaç kalem, geri kalan her şeyden fazlasını verir; püskürtmenin dayandığı gözlem budur.

Eşiğin Ölçeği ve Bedeli

Dördüncü çıktı püskürtmeyi üç eşiğe ayrı ayrı sorar. Hesap ölçeğinde sayan eşik görmez. Kaynak ölçeğinde sayan eşik 60. denemede, sistem ölçeğinde sayan eşik 200. denemede görür. Toplam 1.200 deneme oran eşiğini altı kat aşar ve azami hızda 20 dakika sürer.

Bu, ölçünün nereye taşındığını gösterir: püskürtme karşısında zincir üçüncü adımda kırılmayabilir, ama görülür. Kırılamayan halkada ölçü tespite kayar ve tespitin birimi denemedir: eşiğin altında kaç deneme geçtiği, alarm çalana kadar kaç hesabın denendiği.

Beşinci çıktı bedeli yazar. Hesap kilitlemenin meşru işe bedeli günde 30 kurgu kalemdir ve üç biçimin ikisini görür. Kaynak hız sınırının bedeli 4’tür ve üçünü de görür. Oran eşiğinin bedeli 0’dır ve üçünü de görür — çünkü hiçbir isteği reddetmez, yalnız sayar ve bildirir.

Üç eşiğin toplam bedeli 34, üç biçimi de gören iki eşiğin toplam bedeli 4’tür. Kapsamı en geniş iki kalem, bedelin sekizde birini taşır. Bu, kilitlemenin gereksiz olduğu anlamına gelmez: kilitleme düşen hesabı 190’dan 24’e indiren tek kalemdir. Anlamı, kapsamın ve bedelin aynı kalemde toplanmadığıdır — ve bir savunma kümesi ikisini ayrı ayrı yazmadan değerlendirilemez.

Bedeli sıfır olan eşiğin ayrı bir yeri vardır ve bu kursun ölçüsünde adı konmalıdır: o eşik hiçbir halkayı kırmaz. Hiçbir isteği reddetmediği için üçüncü adımın önkoşulunu ortadan kaldırmaz; yalnız sayar. Bir savunma listesinde onu “üç biçimi de gören eşik” diye yazmak doğrudur, “üç biçimi de durduran eşik” diye yazmak değildir. İki cümle arasındaki fark, bu kursun kırılan halka ile tespit arasında koyduğu ayrımın tam kendisidir: sayan bir kalem zinciri kısaltmaz, yalnız zincirin görüldüğü noktayı öne çeker.

Özet

  • Üç biçim yalnız iki sayıyla ayrılır: kaç hesaba dokunduğu ve hesap başına kaç deneme yaptığı. Kaba kuvvet 1 hesap/1.000.000 deneme, sözlük 1/50.000, püskürtme 400/3.
  • Hesap kilitleme kaba kuvvet ve sözlüğü beşinci denemede durdurur; püskürtmeyi hiç görmez, çünkü hesap ölçeğinde sayar ve püskürtmenin hesap başına bütçesi eşiğin altındadır.
  • Kilitleme düşen hesabı 190’dan ve 180’den 24’e indirir (%87 azalma), püskürtmede farkı 0’dır.
  • Azami hızda kaba kuvvet tek hesap için 11,6 gün, sözlük 13,9 saat, püskürtme 18 hesap için 3 saniye sürer. Bütçeyi 50.000’den 1.000.000’a çıkarmak düşen hesabı yalnız 10 artırır.
  • Püskürtmeyi kaynak ölçeğinde sayan eşik 60., sistem ölçeğinde sayan eşik 200. denemede görür; toplam 1.200 deneme oran eşiğini 6 kat aşar. Kırılamayan halkada ölçü tespite kayar.
  • Üç eşiğin toplam meşru bedeli 34 kurgu kalem/gündür; üç biçimi de gören iki eşiğin toplamı 4’tür. Kapsam ile bedel aynı kalemde toplanmaz ve bedeli sıfır olan eşik hiçbir halkayı kırmaz, yalnız sayar.

Sonraki Adım

Buraya kadarki altı sınıfta zincir her zaman saldıranın bir isteğiyle başladı: bir alan dolduruldu, bir bağlantı gönderildi, bir deneme yapıldı. Bir sonraki sınıfta ilk adımı kurban atar ve yaptığı şey olağandır — bir sayfayı açar. Sonraki ders bu sınıfı önkoşul zinciri olarak sayar: kaç koşulun aynı anda tutması gerektiği, koşullardan biri düştüğünde geriye kaç bileşimin kaldığı ve hangi tarayıcı ile ağ denetiminin kaç koşulu birden kırdığı ölçülür.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat