İçeriğe geç
academia.sh

Ders 08 / 18

İstek Manipülasyonu

Vekil araçla istek değiştirmenin bir doğrulama adımı olarak ölçülmesi: 18 adayın 40 planlı isteği, yalnız gözleyen isteklerle 6 adayın karara bağlanması ve sıfır uyarı üretilmesi, en geniş kuralla 14 adayın karara bağlanıp 16 uyarı üretilmesi, üç kural kümesinde de kapsam dışı hedefe giden istek sayısının sıfır kalması ve gerçekte açık iki adayın hiçbir kuralla kanıtlanamaması.

İçindekiler

Önceki iki araç yalnız bakıyordu. İkisinin de sınırı aynıydı: bir alanın belirli bir değerle geçtiğini görmek, o alana başka bir değer geldiğinde sistemin ne yapacağını söylemez. Bir adayın gerçekten açık olduğunu göstermenin tek yolu isteği değiştirip yanıtı görmektir — ve bu, kursta ilk kez hedefe dokunan adımdır.

Vekil araç, istemci ile sunucu arasına girip isteği durdurur, değiştirir ve yeniden gönderir. Bu dersin konusu aracın kullanımı değil, o araçla yapılan işin muhasebesidir: bir adayı kanıtlamak kaç istek ister, bu isteklerin kaçı hedefte kalıcı bir şey değiştirir, kaçı hizmeti kesme riski taşır ve hangileri kapsamın dışına taşar. Hiçbir istek içeriği, dizge ya da yük yazılmaz; istekler yalnız sınıflarıyla sayılır.

İki Ayrı Sınıflandırma

Bir doğrulama isteği iki bağımsız eksende sınıflandırılır ve ikisi karıştırılırsa kapsam denetimi kurulamaz.

Birincisi risk sınıfıdır. g yalnız gözleyen istektir: hedefin durumunu değiştirmez, aynı istek tekrar gönderildiğinde aynı sonucu verir. d hedefte durum değiştiren istektir: bir kayıt yazar, bir oturum açar, bir sayacı ilerletir; geri alınabilir olması ayrı bir koşuldur. y hizmeti kesme riski taşıyan istektir; hız sınırı ve kaynak tüketimiyle ilgili adayların doğrulanmasında kaçınılmaz olur.

İkincisi kapsam sınıfıdır. kapsam-ici hedef, katılım kurallarında adı geçen ve üzerinde değişiklik yapılmasına izin verilen hedeftir. paylasilan hedef aynı ortamda başka kiracıların da bulunduğu bir yerdir: gözlemek serbesttir, durum değiştirmek başkasının verisine dokunma riski taşıdığı için değildir. kapsam-disi hedef üçüncü tarafa aittir ve hiçbir istek gönderilemez. Kapsam dışı bir hedefe tek bir gözlem isteği göndermek bile verilen yetkiyi geçersiz kılar; o an yapılan iş yetkisiz erişim olur ve yasal sonuç doğurur.

  • AA15. Aday listesi, plan uzunlukları, kapsam sınıfları ve gercek alanı modeldir. gercek, adayın doğrulama sonunda ortaya çıkacak durumudur; doğrulamadan önce bilinmez ve yalnız modelin sonucu hesaplayabilmesi için yazılmıştır.
  • AA16. Doğrulama planı bir adayın açık olduğunu göstermek için gereken en kısa istek dizisidir. Plan uzunlukları elle yazıldı.
  • AA17. Bir plan ancak bütün adımları çalıştırılabiliyorsa sonuç üretir. Eksik çalışan plan “açık değil” demez; dogrulanamadi der.
  • AA18. Her istek hedefte bir kayıt üretir. Uyarı sayısı risk sınıfına bağlıdır: g sıfır, d bir, y üç. Süreler istek başına elle yazıldı.
  • AA19. Kapsam denetimi programlıdır: izin verilen istek sınıfı, kural kümesi ile kapsam sınıfının kesişimidir. Kesişim boşsa istek gönderilmez.
  • AA20. Üç kural kümesi, katılım kurallarının üç ayrı sıkılık düzeyini temsil eder.
  • AA21. Yanlış pozitif, planı tam koşan ve açık olmadığı görülen adaydır; bu adayın raporda yeri yoktur.
// vek/dogrula.mjs — vekil aracla dogrulamanin ADIM SAYISI ve RISK SINIFI modelidir.
// Hicbir istek icerigi, dizge ya da yuk yazilmaz; istekler yalniz sinifiyla sayilir.
// g = yalniz gozleyen (durum degistirmez), d = hedefte durum degistiren,
// y = hizmeti kesme riski tasiyan.
export const RISK = {
  g: { kayit: 1, uyari: 0, dk: 2 },
  d: { kayit: 1, uyari: 1, dk: 5 },
  y: { kayit: 1, uyari: 3, dk: 15 },
};

// Kapsam sinifi: her hedefte hangi istek siniflari gonderilebilir.
export const KAPSAM = {
  'kapsam-ici':  ['g', 'd', 'y'],
  'paylasilan':  ['g'],            // ayni ortamda baska kiracilar var
  'kapsam-disi': [],               // ucuncu taraf; hicbir istek gonderilemez
};

// Katilim kurallari: hangi risk sinifina izin veriliyor.
export const KURAL = {
  'yalniz-gozlem':    ['g'],
  'geri-alinabilir':  ['g', 'd'],
  'yazili-ek-izinle': ['g', 'd', 'y'],
};

// satir: aday | aday sinifi | hedef kapsami | gercekte acik mi | dogrulama plani
export const ADAY = `
  aa01 bilgi-ifsasi    kapsam-ici  evet  g,g
  aa02 yetki-denetimi  kapsam-ici  evet  g,g,d
  aa03 oturum-yonetimi kapsam-ici  hayir g,g,d
  aa04 yapilandirma    kapsam-ici  evet  g
  aa05 girdi-dogrulama kapsam-ici  evet  g,d,d
  aa06 hiz-siniri      kapsam-ici  evet  g,y
  aa07 bilgi-ifsasi    paylasilan  hayir g,g
  aa08 yetki-denetimi  paylasilan  evet  g,d
  aa09 yapilandirma    kapsam-disi evet  g
  aa10 girdi-dogrulama kapsam-ici  hayir g,d
  aa11 oturum-yonetimi kapsam-ici  evet  g,g,g
  aa12 hiz-siniri      kapsam-ici  hayir g,y
  aa13 bilgi-ifsasi    kapsam-ici  hayir g
  aa14 yetki-denetimi  kapsam-ici  evet  g,g,d,d
  aa15 girdi-dogrulama paylasilan  hayir g,d
  aa16 yapilandirma    kapsam-ici  hayir g,g
  aa17 oturum-yonetimi kapsam-disi hayir g,d
  aa18 hiz-siniri      kapsam-ici  evet  g,g,y
`.trim().split('\n').map((r) => {
  const [ad, sinif, hedef, gercek, plan] = r.trim().split(/\s+/);
  return { ad, sinif, hedef, gercek: gercek === 'evet', plan: plan.split(',') };
});

// Bir adayin bir kural kumesindeki sonucu.
export function sonuc(a, kural) {
  const izin = KURAL[kural].filter((s) => KAPSAM[a.hedef].includes(s));
  const calisan = a.plan.filter((s) => izin.includes(s));
  const tam = calisan.length === a.plan.length;
  const s = { calisan: calisan.length, atlanan: a.plan.length - calisan.length,
    kayit: 0, uyari: 0, dk: 0 };
  for (const adim of calisan) { s.kayit += RISK[adim].kayit; s.uyari += RISK[adim].uyari; s.dk += RISK[adim].dk; }
  s.durum = tam ? (a.gercek ? 'kanit' : 'yanlis-pozitif') : 'dogrulanamadi';
  return s;
}

export function kuralOlc(kural) {
  const t = { kanit: 0, yanlisPozitif: 0, dogrulanamadi: 0, istek: 0, atlanan: 0,
    kayit: 0, uyari: 0, dk: 0, kapsamDisiDokunus: 0 };
  for (const a of ADAY) {
    const s = sonuc(a, kural);
    t[s.durum === 'yanlis-pozitif' ? 'yanlisPozitif' : s.durum] += 1;
    t.istek += s.calisan; t.atlanan += s.atlanan;
    t.kayit += s.kayit; t.uyari += s.uyari; t.dk += s.dk;
    if (a.hedef === 'kapsam-disi' && s.calisan > 0) t.kapsamDisiDokunus += 1;
  }
  return t;
}

On Sekiz Aday, Üç Kural Kümesi

// vek/olc.mjs — on sekiz aday uc kural kumesinden gecirilir.
import { ADAY, KURAL, RISK, sonuc, kuralOlc } from './dogrula.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());

const plan = ADAY.flatMap((a) => a.plan);
console.log(`${ADAY.length} aday, ${plan.length} planli istek: ` +
  ['g', 'd', 'y'].map((s) => `${s}=${plan.filter((x) => x === s).length}`).join(' '));
console.log(`gercekte acik olan aday ${ADAY.filter((a) => a.gercek).length} (model; ` +
  `dogrulamadan once bilinmiyor)`);

const A = [-6, -16, -12, 6, 8, 16];
console.log('\n1. aday basina plan ve sonuc (kural: geri-alinabilir)');
y(A, 'aday', 'sinif', 'hedef', 'plan', 'kosan', 'sonuc');
for (const a of ADAY) {
  const s = sonuc(a, 'geri-alinabilir');
  y(A, a.ad, a.sinif, a.hedef, a.plan.join(''), s.calisan, s.durum);
}

const B = [-18, 7, 16, 16, 8, 9, 8, 8, 7];
console.log('\n2. kural kumesi basina toplam');
y(B, 'kural', 'kanit', 'yanlis pozitif', 'dogrulanamadi', 'istek', 'atlanan', 'kayit', 'uyari', 'dk');
for (const k of Object.keys(KURAL)) {
  const t = kuralOlc(k);
  y(B, k, t.kanit, t.yanlisPozitif, t.dogrulanamadi, t.istek, t.atlanan, t.kayit, t.uyari, t.dk);
}

console.log('\n3. kapsam denetimi');
for (const k of Object.keys(KURAL))
  console.log(`  ${k.padEnd(18)} kapsam disi hedefe giden istek: ${kuralOlc(k).kapsamDisiDokunus}`);

const g = kuralOlc('yalniz-gozlem'), e = kuralOlc('yazili-ek-izinle');
console.log(`\nyalniz gozlemle karara baglanan aday   ${g.kanit + g.yanlisPozitif} / ${ADAY.length}`);
console.log(`en genis kuralla karara baglanan aday  ${e.kanit + e.yanlisPozitif} / ${ADAY.length}`);
console.log(`hicbir kuralla dogrulanamayan aday     ${e.dogrulanamadi}`);
const acikAmaKanitsiz = ADAY.filter((a) => a.gercek && sonuc(a, 'yazili-ek-izinle').durum !== 'kanit');
console.log(`  bunlarin gercekte acik olani         ${acikAmaKanitsiz.length} ` +
  `(${acikAmaKanitsiz.map((a) => a.ad).join(', ')})`);
console.log(`bir uyari basina kazanilan kanit       ` +
  `${((e.kanit - g.kanit) / (e.uyari - g.uyari)).toFixed(2)}`);
18 aday, 40 planli istek: g=27 d=10 y=3
gercekte acik olan aday 10 (model; dogrulamadan once bilinmiyor)

1. aday basina plan ve sonuc (kural: geri-alinabilir)
aday  sinif           hedef         plan   kosan           sonuc
aa01  bilgi-ifsasi    kapsam-ici      gg       2           kanit
aa02  yetki-denetimi  kapsam-ici     ggd       3           kanit
aa03  oturum-yonetimi kapsam-ici     ggd       3  yanlis-pozitif
aa04  yapilandirma    kapsam-ici       g       1           kanit
aa05  girdi-dogrulama kapsam-ici     gdd       3           kanit
aa06  hiz-siniri      kapsam-ici      gy       1   dogrulanamadi
aa07  bilgi-ifsasi    paylasilan      gg       2  yanlis-pozitif
aa08  yetki-denetimi  paylasilan      gd       1   dogrulanamadi
aa09  yapilandirma    kapsam-disi      g       0   dogrulanamadi
aa10  girdi-dogrulama kapsam-ici      gd       2  yanlis-pozitif
aa11  oturum-yonetimi kapsam-ici     ggg       3           kanit
aa12  hiz-siniri      kapsam-ici      gy       1   dogrulanamadi
aa13  bilgi-ifsasi    kapsam-ici       g       1  yanlis-pozitif
aa14  yetki-denetimi  kapsam-ici    ggdd       4           kanit
aa15  girdi-dogrulama paylasilan      gd       1   dogrulanamadi
aa16  yapilandirma    kapsam-ici      gg       2  yanlis-pozitif
aa17  oturum-yonetimi kapsam-disi     gd       0   dogrulanamadi
aa18  hiz-siniri      kapsam-ici     ggy       2   dogrulanamadi

2. kural kumesi basina toplam
kural               kanit  yanlis pozitif   dogrulanamadi   istek  atlanan   kayit   uyari     dk
yalniz-gozlem           3               3              12      25       15      25       0     50
geri-alinabilir         6               5               7      32        8      32       7     85
yazili-ek-izinle        8               6               4      35        5      35      16    130

3. kapsam denetimi
  yalniz-gozlem      kapsam disi hedefe giden istek: 0
  geri-alinabilir    kapsam disi hedefe giden istek: 0
  yazili-ek-izinle   kapsam disi hedefe giden istek: 0

yalniz gozlemle karara baglanan aday   6 / 18
en genis kuralla karara baglanan aday  14 / 18
hicbir kuralla dogrulanamayan aday     4
  bunlarin gercekte acik olani         2 (aa08, aa09)
bir uyari basina kazanilan kanit       0.31

Doğrulamanın Asıl Kazancı

İkinci tablonun ilk iki sütunu birlikte okunur. Yalnız gözlem kuralında 3 kanıt ve 3 yanlış pozitif çıkıyor; en geniş kuralda 8 kanıt ve 6 yanlış pozitif. Rapor açısından bu iki sütun eşit değerdedir. Altı yanlış pozitifi elemek, düzeltme ekibinin altı satırla uğraşmasını önler; her satır bir inceleme, bir tartışma ve çoğu zaman bir değişiklik talebi demektir. Kanıtlanmış bulgu kadar elenmiş aday da doğrulamanın ürünüdür.

Üçüncü sütun ise raporun en dürüst kısmıdır. dogrulanamadi, “bu aday açık değil” demek değildir; “bu adayı kuralların içinde kalarak karara bağlayamadım” demektir. Bu ayrımın kaybolması sızma testi raporlarının bilinen kusurudur: doğrulanamayan aday sessizce düşürülür ve kurum, hiç bakılmamış bir kalemi bakılmış sanır. On sekiz adayın en geniş kuralda bile dördü bu sütunda kalır ve modelin gercek alanına bakıldığında ikisinin gerçekten açık olduğu görülür.

O iki aday hangileridir sorusu, dersin en önemli satırıdır. aa08 paylaşılan bir ortamdadır: onu kanıtlamak için gereken durum değiştiren istek, aynı ortamdaki başka kiracıların verisine dokunabileceği için gönderilemez. aa09 üçüncü tarafa aittir ve tek bir gözlem isteği bile gönderilemez. İkisi de gerçekten açıktır ve ikisi de kanıtlanmadan raporlanır — bulgu değil, kapsam dışında kalmış risk olarak.

Planın Uzunluğu Bir Bulgudur

Birinci tablodaki plan sütunu tek başına bilgi taşır. Dört adayın planı tek istektir; birinin planı dört istek uzunluğundadır ve ikisi durum değiştiren sınıftadır. Bu fark rastlantı değildir: bir adayı kanıtlamak için gereken istek sayısı, o adayın önündeki denetim sayısıyla doğru orantılıdır. Tek istekle gösterilebilen bir yapılandırma kalemi, önünde hiçbir denetim olmadığı için tek isteklik kalmıştır; dört istek isteyen yetki denetimi kalemi ise ancak bir dizi koşul sağlandıktan sonra kendini gösterir.

Bu, raporda iki yönde kullanılır. Kısa planlı bir bulgu daha ciddidir çünkü aynı kısalık saldırgan tarafında da geçerlidir. Uzun planlı bir bulgu ise düzeltme önceliğinde geriye düşebilir, ama bunun gerekçesi “zor” değil, kaç koşulun birlikte sağlanması gerektiğidir ve o koşullar tek tek yazılır.

Planın uzunluğu maliyet tarafında da doğrudan çarpandır. Kırk planlı isteğin 27’si gözlem sınıfındadır; en geniş kuralda çalışan 35 isteğin 25’i gözlem, 7’si durum değiştiren, 3’ü kesme riski taşıyandır. Toplam 130 dakikanın 50’si gözlem isteklerinden, kalan 80 dakika ise yalnız on istekten gelir. Doğrulamanın süresi istek sayısıyla değil, istek sınıfıyla belirlenir.

Vekil aracın kaydettiği istek ve yanıt çiftleri, sonraki aşamada yeniden üretim adımlarının ham maddesi olur. Rapora giren şey bu ham kayıt değildir: sınıf, sayı, koşul ve gözlenen sonuç yazılır. Bir doğrulama kaydının olduğu gibi rapora eklenmesi, raporu okuyan herkese aynı isteği yeniden gönderme yeteneği vermek demektir ve bu, düzeltme sürecinin riskini gereksiz yere büyütür.

Adım Sayısı ve Bırakılan İz

Kural kümesi genişledikçe üç sayı birlikte artıyor. İstek 25’ten 35’e, süre 50 dakikadan 130 dakikaya, uyarı 0’dan 16’ya çıkıyor. Kayıt sayısı istekle birebir gidiyor çünkü her istek hedefte bir kayıt bırakıyor; ayırt edici olan uyarı sütunudur.

Yalnız gözleyen isteklerle yürütülen bir doğrulama 25 kayıt üretir ve hiçbir uyarı üretmez. Savunma tarafından bakıldığında bu, günlük dosyasında sıradan bir istek yığınıdır; ancak sonradan, hacim ve düzen üzerinden bir çözümlemeyle fark edilir. Durum değiştiren istekler açılınca yedi uyarı, hizmet kesme riski taşıyanlar açılınca on altı uyarı doğuyor. Buradaki asıl sayı marjinal orandır: yalnız gözlemden en geniş kurala geçiş beş ek kanıt kazandırırken on altı uyarı üretiyor — uyarı başına 0,31 kanıt.

Bu oran, katılım kurallarının neden pazarlık konusu olduğunu açıklar. Uyarıların bir bölümü savunmanın gerçekten çalıştığının işaretidir ve mavi takımın bunları görmesi istenir. Bir bölümü ise nöbetçi ekibi gerçek bir olay sanıp müdahaleye başlatır; test penceresi, iletişim kanalı ve önceden bildirilen kaynak listesi tam olarak bunun için yazılır. Uyarı sayısını sıfırda tutmak da bir seçenektir ama bedeli açıktır: on sekiz adayın on ikisi karara bağlanmadan kalır.

Üçüncü tablo üç kural kümesinde de aynı sayıyı veriyor: kapsam dışı hedefe giden istek sıfır. Bu sayı bir sonuç değil, bir değişmezdir; hangi kural kümesi seçilirse seçilsin sıfır kalmak zorundadır. Kapsam denetimini araca ya da kişiye bırakmak yerine plan üzerinde programlı çalıştırmak bunu güvence altına alır: istek gönderilmeden önce hedefin sınıfı sorulur, kesişim boşsa adım atlanır ve atlandığı yazılır.

Özet

  • On sekiz adayın doğrulama planları toplam 40 istek içerir: 27 yalnız gözleyen, 10 durum değiştiren, 3 hizmet kesme riski taşıyan.
  • Kural kümesi genişledikçe karara bağlanan aday 6’dan 14’e çıkar; kanıt 3’ten 8’e, elenen yanlış pozitif 3’ten 6’ya yükselir. Elenen aday da doğrulamanın ürünüdür.
  • Yalnız gözleyen isteklerle yürütülen doğrulama 25 kayıt ve sıfır uyarı bırakır; en geniş kuralda 35 kayıt ve 16 uyarı doğar. Marjinal oran uyarı başına 0,31 kanıttır.
  • Dört aday hiçbir kural kümesiyle doğrulanamaz ve ikisi gerçekte açıktır; bunlar bulgu olarak değil, kapsam dışında kalmış risk olarak raporlanır.
  • Planın uzunluğu adayın önündeki denetim sayısını ölçer; tek istekle gösterilen bir kalem, aynı kısalığın saldırgan tarafında da geçerli olması nedeniyle daha ciddidir.
  • Kapsam denetimi programlıdır ve üç kural kümesinde de kapsam dışı hedefe giden istek sıfırdır; bu bir sonuç değil, korunması gereken bir değişmezdir.

Sonraki Adım

Bu üç araç da ağ üzerinde çalışıyordu: trafiği kaydettiler, alanları okudular, isteği değiştirip yanıtı gördüler. Değerlendirme sırasında incelenmesi gereken kalemlerin bir bölümü ise ağdan değil dosyadan gelir: bir uçta bulunan bilinmeyen bir çalıştırılabilir, bir posta ekinden çıkan arşiv, saha ekibinin dışarıdan aldığı bir yardımcı araç. Bunların ne yaptığını istek göndererek öğrenmek mümkün değildir.

Sonraki ders sanal alan çözümlemesini bu eksende ele alır. Uç Nokta Güvenliği kursunda sanal alanın yalıtım gücü ölçülmüştü; burada o ölçüm girdi olarak alınır ve tek bir soru sorulur: bir kalemin davranışlarından kaçı gözlenebiliyor, kaçı ortamın sanal alan olduğunu fark edip gizleniyor. Gizlenen davranış, doğrulanamayan aday sütununu bu kez ağın değil, çözümleme ortamının kendi sınırından besler.

İ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