İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat