Ders 04 / 15
İstismar ve Yük
Açıktan etkiye giden zincirin adımlanması: 5 istismar ile 4 yükün 12 geçerli zincir üretmesi, zincir uzunluğunun 2 ile 7 arasında değişip toplam 53 adım tutması, tek bir adımı kırmanın en çok 8 zinciri kesmesi, bir yükü engellemenin en çok 5 ve bir istismarı engellemenin en çok 4 zinciri kesmesi, aynı kırılmanın erişimde 0 ve etkide 41 tamamlanmış adım bırakması, altı orta adımın tamamı kırıldığında bile 12 zincirden birinin ayakta kalması ve o tek zincirin toplam olasılık kütlesinin %25,7'sini taşıması.
İçindekiler
Önceki ders her kalemi tek bir olay gibi saydı: olasılık verildi, etki verildi, çarpıldı. Oysa 600 kurgu birimlik bir etki tek bir anda doğmaz. Önce bir yere erişilir, sonra bir zayıflık tetiklenir, sonra bir şey çalıştırılır, yetki genişler ve etki ancak bunların hepsi tamamlandığında yazılır. Olasılık dediğimiz sayı, aslında bu zincirin baştan sona tamamlanma olasılığıdır.
İstismar (exploit), bir açığı fiilen kullanan adım dizisidir. Yük (payload), istismar tamamlandıktan sonra yazılan etkidir. İkisi ayrı şeylerdir ve bu ayrım bu dersin ölçtüğü şeyi belirler: aynı istismar birden çok yük taşıyabilir, aynı yük birden çok istismarla gelebilir. Bu ders zinciri model olarak kurar ve tek soruya bağlar — hangi adımı kırmak kaç zinciri kesiyor.
Zincir Bir Adım Dizisidir
Aşağıdaki yapı bir modeldir: çalışan bir istismar, bir araç ya da bir yük yoktur; yalnızca adım adlarından oluşan bir veri yapısı vardır. Açık adları önceki iki dersin listesinden gelir. Bu adımların gerçek bir sistem üzerinde denenmesi yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.
GK16: zincir sekiz adımlık kanonik sırayı izler ve her zincir bu sıranın bir alt dizisidir. GK17: istismar bir açığı kullanan adım dizisidir; yük, istismar tamamlandıktan sonra yazılan etkidir ve kendi ek adımlarını getirir. GK18: bir yük ancak gerektirdiği adım istismarda varsa o istismarla eşleşir. GK19: bir adım kırılırsa o adımı içeren her zincir kesilir; kesildiği anda zincirin kendinden önceki adımları tamamlanmıştır.
// guvenlik/zincir.mjs — actan etkiye giden zincirin adim modeli (model): burada calisan bir // istismar yoktur, yalnizca adim adlarindan olusan bir veri yapisi vardir. Rastgelelik yok. // GK16: zincir sekiz adimlik kanonik sirayi izler; her zincir bu siranin bir alt dizisidir. export const ADIM = ["erisim", "kesif", "tetikleme", "yurutme", "yetki-yukseltme", "yanal-gecis", "kalicilik", "etki"]; export const HARF = { erisim: "E", kesif: "K", tetikleme: "T", yurutme: "Y", "yetki-yukseltme": "P", "yanal-gecis": "G", kalicilik: "L", etki: "I" }; // GK17: istismar, bir acigi kullanan adim dizisidir; yuk, istismar tamamlandiktan sonra // yazilan etkidir ve kendi ek adimlarini getirir. export const ISTISMAR = [ { ad: "kimlik-yeniden-kullanimi", acik: "varsayilan-parola", adim: ["erisim", "kesif"] }, { ad: "girdi-tetikleme", acik: "dogrulanmayan-girdi", adim: ["erisim", "tetikleme", "yurutme"] }, { ad: "imzasiz-paket", acik: "imzasiz-guncelleme", adim: ["erisim", "kesif", "tetikleme", "yurutme"] }, { ad: "hesap-paylasimi", acik: "paylasilan-hesap", adim: ["erisim", "kesif"] }, { ad: "aktarim-dinleme", acik: "sifresiz-aktarim", adim: ["erisim"] }, ]; // GK18: bir yuk ancak gerektirdigi adim istismarda varsa o istismarla eslesir. export const YUK = [ { ad: "veri-cikarma", gerek: [], ek: ["etki"] }, { ad: "kayit-degistirme", gerek: ["kesif"], ek: ["yetki-yukseltme", "etki"] }, { ad: "hizmet-durdurma", gerek: ["yurutme"], ek: ["etki"] }, { ad: "kalici-erisim", gerek: ["yurutme"], ek: ["yanal-gecis", "kalicilik", "etki"] }, ]; export const ZINCIR = ISTISMAR.flatMap((i) => YUK .filter((y) => y.gerek.every((g) => i.adim.includes(g))) .map((y) => ({ istismar: i.ad, acik: i.acik, yuk: y.ad, adim: ADIM.filter((a) => i.adim.includes(a) || y.ek.includes(a)) }))); export const maske = (z) => ADIM.map((a) => (z.adim.includes(a) ? HARF[a] : ".")).join(""); export const gecen = (a) => ZINCIR.filter((z) => z.adim.includes(a)); // GK19: bir adim kirilirsa o adimi iceren her zincir kesilir; kesilene dek o zincirin // kendinden onceki adimlari tamamlanmistir. export const oncekiToplam = (a) => gecen(a).reduce((n, z) => n + z.adim.indexOf(a), 0); export const kapanan = (kume) => ZINCIR.filter((z) => z.adim.some((a) => kume.includes(a))).length; // GK20: her adimin tamamlanma olasiligi vardir ve adimlar bagimsiz sayilir (model); // zincirin tamamlanma olasiligi adim olasiliklarinin carpimidir. export const ADIM_P = { erisim: 0.5, kesif: 0.7, tetikleme: 0.4, yurutme: 0.6, "yetki-yukseltme": 0.35, "yanal-gecis": 0.5, kalicilik: 0.6, etki: 0.9 }; export const olasilik = (z) => z.adim.reduce((p, a) => p * ADIM_P[a], 1); export const KUTLE = ZINCIR.reduce((s, z) => s + olasilik(z), 0); export const kapananKutle = (kume) => ZINCIR .filter((z) => z.adim.some((a) => kume.includes(a))) .reduce((s, z) => s + olasilik(z), 0);
// guvenlik/kir.mjs — hangi adimi kirmak kac zinciri kesiyor, kesildiginde ne kadari olmustu. import { ADIM, HARF, ISTISMAR, YUK, ZINCIR, KUTLE, maske, gecen, oncekiToplam, kapanan, olasilik, kapananKutle } from "./zincir.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("")); const uzunluk = ZINCIR.map((z) => z.adim.length); console.log(`${ISTISMAR.length} istismar x ${YUK.length} yuk -> ${ZINCIR.length} gecerli zincir; ` + `adim sirasi ${ADIM.map((a) => HARF[a]).join("")} = ${ADIM.join(", ")}; ` + `zincir uzunlugu ${Math.min(...uzunluk)}..${Math.max(...uzunluk)}, ` + `toplam adim ${uzunluk.reduce((a, x) => a + x, 0)}`); const A = [-26, 18, 10, 7]; console.log("\n1. gecerli zincirler"); yaz(A, "istismar", "yuk", "maske", "adim"); for (const z of ZINCIR) yaz(A, z.istismar, z.yuk, maske(z), z.adim.length); const B = [-18, 10, 10, 8, 12]; console.log("\n2. bir adim kirilirsa"); yaz(B, "adim", "zincirde", "kapanan", "kalan", "olmus adim"); for (const a of ADIM) yaz(B, a, gecen(a).length, kapanan([a]), ZINCIR.length - kapanan([a]), oncekiToplam(a)); const C = [-20, 10, 10, 8]; console.log("\n3. yuk engellenirse (istismar yerinde kalir)"); yaz(C, "yuk", "zincirde", "kapanan", "kalan"); for (const y of YUK) { const n = ZINCIR.filter((z) => z.yuk === y.ad).length; yaz(C, y.ad, n, n, ZINCIR.length - n); } for (const i of ISTISMAR) { const n = ZINCIR.filter((z) => z.istismar === i.ad).length; yaz(C, "istismar " + i.ad.slice(0, 11), n, n, ZINCIR.length - n); } const ORTA = ADIM.slice(1, -1); // erisim ve etki mesru isin uclaridir, tumden kaldirilamaz const D = [-24, 10, 8]; console.log("\n4. orta adimlardan en iyi tekli ve ikili (erisim ve etki disarida)"); yaz(D, "kirilan adim kumesi", "kapanan", "kalan"); const tekli = ORTA.map((a) => [a]).sort((x, y) => kapanan(y) - kapanan(x))[0]; const ikili = ORTA.flatMap((a, i) => ORTA.slice(i + 1).map((b) => [a, b])) .sort((x, y) => kapanan(y) - kapanan(x))[0]; for (const k of [tekli, ikili, ORTA]) yaz(D, k.map((a) => HARF[a]).join("+"), kapanan(k), ZINCIR.length - kapanan(k)); const acik = ZINCIR.filter((z) => !z.adim.some((a) => ORTA.includes(a))); console.log(`butun orta adimlar kirildiginda ayakta kalan zincir: ` + acik.map((z) => `${z.istismar} + ${z.yuk} (${maske(z)})`).join(", ")); const E = [-18, 11, 11, 12, 15]; console.log("\n5. kapanan zincir sayisi ile kapanan olasilik kutlesi"); yaz(E, "adim", "kapanan", "zincir %", "kutle %", "kutle/zincir"); for (const a of ADIM) { const z = (kapanan([a]) / ZINCIR.length) * 100, k = (kapananKutle([a]) / KUTLE) * 100; yaz(E, a, kapanan([a]), z.toFixed(1), k.toFixed(1), (k / z).toFixed(2)); } const enOlasi = [...ZINCIR].sort((x, y) => olasilik(y) - olasilik(x)); console.log(`toplam kutle ${KUTLE.toFixed(4)}; en olasi zincir ${enOlasi[0].istismar} + ` + `${enOlasi[0].yuk} (${olasilik(enOlasi[0]).toFixed(4)}, kutlenin ` + `%${((olasilik(enOlasi[0]) / KUTLE) * 100).toFixed(1)}'i), en olasi olmayan ` + `${enOlasi.at(-1).istismar} + ${enOlasi.at(-1).yuk} (${olasilik(enOlasi.at(-1)).toFixed(4)})`);
5 istismar x 4 yuk -> 12 gecerli zincir; adim sirasi EKTYPGLI = erisim, kesif, tetikleme, yurutme, yetki-yukseltme, yanal-gecis, kalicilik, etki; zincir uzunlugu 2..7, toplam adim 53 1. gecerli zincirler istismar yuk maske adim kimlik-yeniden-kullanimi veri-cikarma EK.....I 3 kimlik-yeniden-kullanimi kayit-degistirme EK..P..I 4 girdi-tetikleme veri-cikarma E.TY...I 4 girdi-tetikleme hizmet-durdurma E.TY...I 4 girdi-tetikleme kalici-erisim E.TY.GLI 6 imzasiz-paket veri-cikarma EKTY...I 5 imzasiz-paket kayit-degistirme EKTYP..I 6 imzasiz-paket hizmet-durdurma EKTY...I 5 imzasiz-paket kalici-erisim EKTY.GLI 7 hesap-paylasimi veri-cikarma EK.....I 3 hesap-paylasimi kayit-degistirme EK..P..I 4 aktarim-dinleme veri-cikarma E......I 2 2. bir adim kirilirsa adim zincirde kapanan kalan olmus adim erisim 12 12 0 0 kesif 8 8 4 8 tetikleme 7 7 5 11 yurutme 7 7 5 18 yetki-yukseltme 3 3 9 8 yanal-gecis 2 2 10 7 kalicilik 2 2 10 9 etki 12 12 0 41 3. yuk engellenirse (istismar yerinde kalir) yuk zincirde kapanan kalan veri-cikarma 5 5 7 kayit-degistirme 3 3 9 hizmet-durdurma 2 2 10 kalici-erisim 2 2 10 istismar kimlik-yeni 2 2 10 istismar girdi-tetik 3 3 9 istismar imzasiz-pak 4 4 8 istismar hesap-payla 2 2 10 istismar aktarim-din 1 1 11 4. orta adimlardan en iyi tekli ve ikili (erisim ve etki disarida) kirilan adim kumesi kapanan kalan K 8 4 K+T 11 1 K+T+Y+P+G+L 11 1 butun orta adimlar kirildiginda ayakta kalan zincir: aktarim-dinleme + veri-cikarma (E......I) 5. kapanan zincir sayisi ile kapanan olasilik kutlesi adim kapanan zincir % kutle % kutle/zincir erisim 12 100.0 100.0 1.00 kesif 8 66.7 60.1 0.90 tetikleme 7 58.3 25.7 0.44 yurutme 7 58.3 25.7 0.44 yetki-yukseltme 3 25.0 14.1 0.56 yanal-gecis 2 16.7 3.1 0.19 kalicilik 2 16.7 3.1 0.19 etki 12 100.0 100.0 1.00 toplam kutle 1.7492; en olasi zincir aktarim-dinleme + veri-cikarma (0.4500, kutlenin %25.7'i), en olasi olmayan imzasiz-paket + kalici-erisim (0.0227)
Sayılar ölçüm sınıfındadır; girdileri GK16–GK19’dur.
Beş İstismar, On İki Zincir
Birinci tablo çarpımın nasıl daraldığını yeniden gösterir. Beş istismar ve dört yük yirmi
kombinasyon eder; geçerli olan on ikisidir, çünkü her yük her istismarla eşleşmez.
hizmet-durdurma ve kalici-erisim yürütme adımı gerektirir; aktarim-dinleme yalnız erişim
adımından oluştuğu için tek yük taşır ve iki adımlık en kısa zinciri üretir.
Zincir uzunlukları 2 ile 7 arasında değişir ve toplam 53 adım tutar. Uzunluk yükten gelir:
imzasiz-paket istismarı dört adımdır, üstüne kalici-erisim yükü üç adım ekler ve zincir yediye
çıkar. Aynı istismar veri-cikarma yüküyle beş adımda biter. İstismar sabittir, zincirin boyunu
yük belirler.
Bu, ayrımın neden önemli olduğunu yazar. girdi-tetikleme maskesi üç zincirde E.TY...I,
E.TY...I ve E.TY.GLI biçimindedir — ilk ikisi tamamen aynı adım dizisidir ve yalnız yük
adında ayrılır. Savunma tarafından bakıldığında bu iki zincir aynı yerlerden geçer, aynı kayıtları
üretir ve aynı denetimle kesilir; farkları yalnız gerçekleşince yazılan etkidedir.
Hangi Adımı Kırmak Kaç Zinciri Kesiyor
İkinci tablo bu dersin ana ölçümüdür. Sekiz adımın her biri için iki sayı vardır: kaç zinciri keser ve kesildiğinde kaç adım tamamlanmış olur.
Kesme gücü sırası erisim ve etki (12), kesif (8), tetikleme ve yurutme (7),
yetki-yukseltme (3), yanal-gecis ve kalicilik (2) biçimindedir. Sıra zincirin başından
sonuna doğru azalır, çünkü zincirler önce ortaktır sonra dallanır. Erken adım daha çok yol
kapatır.
Son sütun aynı sıralamayı tersine çevirir. erisim kırıldığında hiçbir adım tamamlanmamıştır;
etki kırıldığında 12 zincir boyunca 41 adım çoktan tamamlanmıştır. yurutme 7 zincir keser
ve arkasında 18 tamamlanmış adım bırakır; kesif 8 zincir keser ve arkasında yalnız 8 adım. Aynı
kesme gücüne yakın iki adım, çok farklı miktarda gerçekleşmiş iş bırakır.
İki uç adımın tablodaki 12 sayısı yanıltıcıdır. erisim her zincirdedir, ama onu tümden kırmak
servisin kendisini kapatmaktır — meşru istekler de aynı adımdan geçer. etki de her zincirdedir,
ama orada kırmak olay olduktan sonra zararı sınırlamaktır, yolu kapatmak değil. Sayılabilir
kaldıraç ortadaki altı adımdadır.
Yükü Engellemek Zinciri Kesmez
Üçüncü tablo üç kaldıracı yan yana koyar. Bir yükü engellemek en çok 5 zincir kapatır
(veri-cikarma); bir istismarı engellemek en çok 4 (imzasiz-paket); bir adımı kırmak
8. Üç sütun aynı on iki zincir üzerinde koşar ve aradaki fark yalnız kaldıracın nereye
konduğundan gelir.
Yük en zayıf kaldıraçtır ve bunun nedeni tabloda görülür: yük, zincirin sonunda oturur ve
değiştirilebilir. imzasiz-paket istismarı dört yük taşır; bunlardan birini engellemek kalan üç
zinciri yerinde bırakır. Aynı istismarı kesmek dördünü birden kapatır. Adım kırmak daha da
geniştir, çünkü bir adım birden çok istismarda ortaktır: kesif adımı üç ayrı istismarda geçer
ve sekiz zinciri birden keser.
Bu sıralamanın pratik karşılığı, savunmanın nereye yazılacağıdır. Belirli bir etkiyi tanıyıp durduran bir denetim tek bir sütunu kapatır; aynı emeği zincirin ortak adımına koymak dört kat fazlasını kapatır. Zincirin sonuna konan savunma, zincirin kaç kolu olduğu kadar kere tekrarlanmak zorundadır.
Orta Adımların Yetmediği Zincir
Dördüncü tablo kaldıracın sınırını gösterir. Ortadaki en iyi tek adım kesiftir ve 8 zincir
kapatır, 4 zincir kalır. En iyi ikili kesif ile tetiklemedir: 11 zincir kapanır, 1 kalır.
Altı orta adımın tamamı kırıldığında da sonuç değişmez — yine 11 kapanır, 1 kalır.
Ayakta kalan zincir aktarim-dinleme istismarı ile veri-cikarma yüküdür ve maskesi
E......Idır. Bu zincirin ortasında hiçbir adım yoktur: erişimden doğrudan etkiye gider. Ortadaki
altı adıma yazılan bütün savunmalar ona hiç dokunmaz, çünkü o adımların hiçbirinden geçmez.
Bu satır zincir modelinin kendi sınırını yazar. Zinciri adımlamak, savunmanın nereye konulacağını seçmeyi sağlar; ama adım kümesi boş olan bir zincir bu seçimin dışında kalır. Onu kapatmanın tek yolu ilk adıma, yani erişime dokunmaktır — ve erişim tam da tabloda “tümden kaldırılamaz” diye dışarıda bırakılan adımdır. Bir sonraki soru bu yüzden kaçınılmazdır: erişim tek bir adım gibi yazıldı, oysa bir varlığa erişmenin kaç ayrı biçimi var.
Zincir Sayısı ile Olasılık Kütlesi Aynı Şey Değil
Beşinci tablo her zincire bir tamamlanma olasılığı verir — adım olasılıklarının çarpımı — ve kırılan adımın kaç zinciri değil, ne kadar olasılık kütlesini kapattığını sayar. On iki zincirin toplam kütlesi 1,7492’dir.
İki sütun aynı yöne gitmez. kesif zincirlerin %66,7’sini ve kütlenin %60,1’ini kapatır; oran
0,90 ile dengelidir. tetikleme ve yurutme zincirlerin %58,3’ünü kapatır ama kütlenin yalnız
%25,7’sini — oran 0,44. Sayı olarak neredeyse aynı işi yapan iki denetim, gerçekleşme
olasılığı cinsinden iki buçuk kat farklıdır. Nedeni uzunluktur: yürütme geçen zincirler uzundur,
her ek adım olasılığı bir kez daha çarparak düşürür. yanal-gecis ve kalicilik en uçtaki
örnektir — zincirlerin %16,7’sini kapatır, kütlenin %3,1’ini.
Son satır önceki dersin sayısına bağlanır. En olası zincir aktarim-dinleme ile veri-cikarma
çiftidir: iki adımlık, 0,4500 olasılıklı ve tek başına toplam kütlenin %25,7’sini taşır. En
olası olmayanı yedi adımlık imzasiz-paket ile kalici-erisimtir: 0,0227. Üçüncü derste
imzasiz-guncelleme kaleminin olasılığı 0,03, sifresiz-aktarim kaleminin 0,25 yazılmıştı; o iki
sayının nereden geldiği burada görünür — zincir uzadıkça olasılık düşer, etki büyür.
Bu, dördüncü tablonun bulgusunu daha da keskinleştirir. Bütün orta adımlar kırıldığında ayakta kalan tek zincir, aynı zamanda kütlenin dörtte birini taşıyan zincirdir. Sayarak bakıldığında 12’de 1’lik bir artıktır; olasılıkla tartıldığında savunmanın dışarıda bıraktığı en büyük tek paydır.
Özet
- İstismar bir açığı kullanan adım dizisi, yük ise istismar tamamlandıktan sonra yazılan etkidir; beş istismar ile dört yük 12 geçerli zincir üretir, uzunlukları 2 ile 7 arası, toplam 53 adım.
- Bir adımı kırmak zincirin başına yaklaştıkça daha çok yol kapatır: 12, 8, 7, 7, 3, 2, 2. Aynı istismarın iki zinciri aynı adım dizisini izleyip yalnız yük adında ayrılabilir.
- Aynı kırılma zincirin neresinde olduğuna göre farklı miktarda tamamlanmış iş bırakır: erişimde 0, keşifte 8, yürütmede 18, etkide 41 adım.
- Üç kaldıraç eşit değildir: bir yükü engellemek en çok 5, bir istismarı engellemek en çok 4, bir adımı kırmak 8 zincir kapatır; yük en zayıf kaldıraçtır, çünkü zincirin sonunda oturur.
- Altı orta adımın tamamı kırıldığında 12 zincirden biri ayakta kalır — ortasında hiç adım olmayan, erişimden doğrudan etkiye giden zincir.
- Zincir sayısı ile olasılık kütlesi ayrı ölçülerdir: tetikleme zincirlerin %58,3’ünü ama kütlenin %25,7’sini kapatır; ayakta kalan tek zincir kütlenin %25,7’sini taşır.
Sonraki Adım
Bu dersin bütün ölçümleri tek bir varsayımın üstünde durdu: erisim bir adımdır. On iki zincirin
on ikisi de o adımdan başladı ve o adım hiç açılmadı. Oysa bir varlığa erişmek tek bir kapıdan
geçmek değildir — şube ucundan, saha uygulamasından, ortak arayüzünden ya da yönetim ucundan
başlayan ayrı ayrı yollar vardır ve her biri farklı sayıda durak üzerinden geçer. Konunun son
dersi bu yolları bir grafta modeller, yol sayımını gerçekten koşturur ve saldırı yüzeyini
azaltmanın kaç yol kapatıp kaç meşru işi durdurduğunu sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.