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
gercekalanı 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;
dogrulanamadider. - AA18. Her istek hedefte bir kayıt üretir. Uyarı sayısı risk sınıfına bağlıdır:
gsıfır,dbir,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.