İçeriğe geç
academia.sh

Ders 17 / 22

İstek Sahteciliği

İstek sahteciliğinin iki yönünün ayrı zincir olarak ölçülmesi: tarayıcı yönünde beş adımın önkoşullarının kurban, tarayıcı ve sunucu arasında bölünmesi, sunucu yönünde bedelin üçüncü adımda yüzde kırkının gerçekleşmesi, on bir uçta ikisinin hiç kırılamaması, tek katmanın kaldırılmasının kırk beş işlemlik fark üretmesi ve iki yönün bedelinin ayrı birimlerde ölçülmesi.

İçindekiler

Önceki derste kurbanın tarayıcısında kod çalışıyordu. Aynı tarayıcının, hiçbir kod çalıştırmadan yapabileceği daha sessiz bir şey daha vardır: bir isteği kurbanın kimliğiyle göndermek. İstek sahteciliği bu sınıftır ve iki yönü vardır.

Birinci yönde sahtelenen şey kurbanın kimliğidir: istek kurbanın tarayıcısından çıkar ve oturum kalemini kendiliğinden yanında taşır. İkinci yönde sahtelenen şey sunucunun ağ konumudur: istek sunucudan çıkar ve dışarıdan erişilemeyen bir iç uca ulaşır. İki yön aynı sınıf adıyla anılır çünkü ikisinde de bir isteği başkasının yetkisiyle göndermek söz konusudur; ama zincirleri, önkoşul sahipleri ve bedel birimleri ayrıdır.

İki Zincir, İki Önkoşul Sahibi

Tarayıcı yönü, beş adım. (1) Kurbanın hedefte açık bir oturumu vardır — önkoşul: oturum kalemi tarayıcıda duruyor ve süresi dolmamış. (2) Kurban, saldıranın belirlediği bir sayfaya ulaşır — önkoşul: bir teslim kanalı var. (3) O sayfadan hedefe bir istek çıkar ve oturum kalemi isteğe kendiliğinden eklenir — önkoşul: aynı-site ilkesi bu isteği dışarıda bırakmıyor. (4) Uç isteği kabul eder — önkoşul: uç isteğin kaynağını kanıtlayan bir kalem istemiyor. (5) İşlem kalıcı olur — önkoşul: işlem tek adımda tamamlanıyor.

Sunucu yönü, beş adım. (1) Bir uç, dışarıdan verilen bir adrese istek gönderir — önkoşul: hedef adres istek alanından geliyor. (2) Adres çözümlemesi iç ağdaki bir adrese düşer — önkoşul: çözümleme sonrası bir denetim yok. (3) İstek iç uca ulaşır — önkoşul: iç uç ağ katmanında erişilebilir. (4) İç uç isteği kimlik sormadan yanıtlar — önkoşul: iç uçlar konum temelli güveniyor. (5) Yanıt çağırana geri döner — önkoşul: yanıt gövdesi ya da hata farkı dışarıya yansıyor.

İlk zincirin ilk iki adımının önkoşulu kurbanın elindedir; savunmanın orada tutunacak yeri yoktur. İkinci zincirde hiçbir adımın önkoşulu kurbana ait değildir — üçü savunanın kendi altyapısında, biri iç serviste. Bu, iki yönün savunma sorumluluğunun neden farklı yerlere düştüğünü açıklar.

TS14: iki yön ayrı zincirdir; sahip, adımın önkoşulunu elinde tutan taraftır. TS15: her katman tek bir yönde tek bir adımı kırar. TS16: bedelin birimi yöne göre değişir ve iki birim toplanmaz. TS17: egri[i], i. adım tamamlandığında bedelin ne kadarının gerçekleştiğini verir.

// isf/yon.mjs — istek sahteciliginin iki yonu, adim dizileri ve katmanlar (model).
// Gercek bir uc, gercek bir adres ve hicbir istek govdesi yok.
export const YON = {
  tarayici: {
    adim: ["acik-oturum", "teslim", "kendiliginden-eklenme", "ucun-kabulu", "kalicilik"],
    sahip: ["kurban", "kurban", "tarayici", "sunucu", "sunucu"],
    birim: "islem", egri: [0, 0, 0, 0, 1],
  },
  sunucu: {
    adim: ["adres-disaridan", "cozumleme", "ic-uca-ulasma", "kimliksiz-yanit", "geri-yansima"],
    sahip: ["sunucu", "ag", "ag", "ic-servis", "sunucu"],
    birim: "ic uc", egri: [0, 0, 0.4, 0.8, 1],
  },
};

export const KATMAN = [
  { ad: "ayni-site-cerez",     yon: "tarayici", kirar: 3, mesru: 2 },
  { ad: "istek-belirteci",     yon: "tarayici", kirar: 4, mesru: 5 },
  { ad: "kaynak-denetimi",     yon: "tarayici", kirar: 4, mesru: 3 },
  { ad: "yeniden-dogrulama",   yon: "tarayici", kirar: 5, mesru: 11 },
  { ad: "cikis-izin-listesi",  yon: "sunucu",   kirar: 1, mesru: 4 },
  { ad: "cozumleme-denetimi",  yon: "sunucu",   kirar: 2, mesru: 1 },
  { ad: "ag-bolutleme",        yon: "sunucu",   kirar: 3, mesru: 8 },
  { ad: "ic-uc-kimligi",       yon: "sunucu",   kirar: 4, mesru: 6 },
  { ad: "sade-yanit",          yon: "sunucu",   kirar: 5, mesru: 2 },
];

// Kurgu olcum aginin on bir ucu: yon, dagitilmis katmanlar ve yone ozgu bedel.
export const UC = [
  ["abone-portali.tarife-degis", "tarayici", ["ayni-site-cerez", "istek-belirteci"], 60],
  ["abone-portali.adres-guncelle", "tarayici", ["ayni-site-cerez"], 45],
  ["abone-portali.itiraz-ac", "tarayici", ["istek-belirteci", "kaynak-denetimi"], 30],
  ["saha-uygulamasi.is-emri-kapat", "tarayici", ["ayni-site-cerez", "yeniden-dogrulama"], 120],
  ["yonetim.esik-ayari", "tarayici", [], 8],
  ["yonetim.kullanici-yetkisi", "tarayici", ["istek-belirteci", "yeniden-dogrulama"], 4],
  ["fatura-uretimi.sablon-getir", "sunucu", ["cikis-izin-listesi", "cozumleme-denetimi"], 9],
  ["toplayici.geri-bildirim-ucu", "sunucu", ["cozumleme-denetimi", "ag-bolutleme"], 14],
  ["is-emri.harita-onizleme", "sunucu", ["sade-yanit"], 14],
  ["rapor.dis-kaynak-cek", "sunucu", [], 17],
  ["sube-ucu.baglanti-sinama", "sunucu", ["ag-bolutleme", "ic-uc-kimligi", "sade-yanit"], 6],
];

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(""));
// isf/olcum.mjs — iki yon on bir uc uzerinde kosturulur: ilk kirilan halka, denetimsiz
// adim ve gec kirmanin yone ozgu birimdeki bedeli. Rastgelelik yok.
import { YON, KATMAN, UC, yaz } from "./yon.mjs";

const ilkKirilan = (y, d) => Math.min(...KATMAN
  .filter((k) => k.yon === y && d.includes(k.ad)).map((k) => k.kirar), Infinity);
// n. adimda kirilan zincirde gerceklesmis bedel orani
const oran = (y, n) => (n === Infinity ? 1 : YON[y].egri[n - 2] ?? 0);

console.log(`2 yon, ${KATMAN.length} katman, ${UC.length} kurgu uc\n`);

console.log("1. iki yonun adim dizisi");
for (const [ad, z] of Object.entries(YON)) {
  console.log(`${ad} yonu — ${z.adim.length} adim, bedel birimi "${z.birim}", ` +
    `${KATMAN.filter((k) => k.yon === ad).length} katman`);
  z.adim.forEach((a, i) => console.log(`  ${i + 1}. ${a.padEnd(24)}onkosul sahibi: ` +
    `${z.sahip[i].padEnd(11)}tamamlaninca bedelin %${(z.egri[i] * 100).toFixed(0)}'i`));
}

const B = [-31, -10, 8, 13, 12, 8, 14];
console.log("\n2. uc basina zincir");
yaz(B, "uc", "yon", "katman", "ilk kirilan", "denetimsiz", "bedel", "gerceklesen");
const durum = UC.map(([ad, y, d, b]) => {
  const h = ilkKirilan(y, d);
  const kirilan = new Set(KATMAN.filter((k) => k.yon === y && d.includes(k.ad)).map((k) => k.kirar));
  return { ad, y, d, b, h, denetimsiz: YON[y].adim.length - kirilan.size, ger: b * oran(y, h) };
});
for (const u of durum)
  yaz(B, u.ad, u.y, u.d.length, u.h === Infinity ? "kirilmiyor" : `${u.h}. adim`,
    u.denetimsiz, u.b, u.ger.toFixed(1));
for (const y of Object.keys(YON)) {
  const k = durum.filter((u) => u.y === y);
  console.log(`${y} yonu: ${k.length} uc, toplam bedel ` +
    `${k.reduce((t, u) => t + u.b, 0)} ${YON[y].birim}, gerceklesen ` +
    `${k.reduce((t, u) => t + u.ger, 0).toFixed(1)}; kirilmayan uc ` +
    `${k.filter((u) => u.h === Infinity).length}`);
}

const C = [-20, -10, 9, 8, 15, 18];
console.log("\n3. bir katman butun uclardan kaldirilirsa");
yaz(C, "katman", "yon", "dagitim", "mesru", "kirilmaz olan", "gerceklesen fark");
for (const k of KATMAN) {
  const kume = durum.filter((u) => u.y === k.yon);
  let yeniAcik = 0, fark = 0;
  for (const u of kume) {
    const h2 = ilkKirilan(k.yon, u.d.filter((x) => x !== k.ad));
    if (u.h !== Infinity && h2 === Infinity) yeniAcik++;
    fark += u.b * oran(k.yon, h2) - u.ger;
  }
  yaz(C, k.ad, k.yon, kume.filter((u) => u.d.includes(k.ad)).length, k.mesru, yeniAcik,
    `+${fark.toFixed(1)}`);
}

const D = [-8, 13, 13, 13, 13];
console.log("\n4. bedel egrisinin bicimi");
yaz(D, "adim", "tarayici %", "sunucu %", "tarayici uc", "sunucu uc");
for (let n = 1; n <= 5; n++)
  yaz(D, `${n}.`, (YON.tarayici.egri[n - 1] * 100).toFixed(0),
    (YON.sunucu.egri[n - 1] * 100).toFixed(0),
    durum.filter((u) => u.y === "tarayici" && u.h === n).length,
    durum.filter((u) => u.y === "sunucu" && u.h === n).length);
console.log(`tarayici yonunde bedel yalnizca son adimda gerceklesir: dorduncu adimda kirmak ` +
  `bedeli sifirda tutar`);
console.log(`sunucu yonunde ucuncu adim bedelin %40'ini uretir: gec kirmak bedeli sifirlamaz`);
2 yon, 9 katman, 11 kurgu uc

1. iki yonun adim dizisi
tarayici yonu — 5 adim, bedel birimi "islem", 4 katman
  1. acik-oturum             onkosul sahibi: kurban     tamamlaninca bedelin %0'i
  2. teslim                  onkosul sahibi: kurban     tamamlaninca bedelin %0'i
  3. kendiliginden-eklenme   onkosul sahibi: tarayici   tamamlaninca bedelin %0'i
  4. ucun-kabulu             onkosul sahibi: sunucu     tamamlaninca bedelin %0'i
  5. kalicilik               onkosul sahibi: sunucu     tamamlaninca bedelin %100'i
sunucu yonu — 5 adim, bedel birimi "ic uc", 5 katman
  1. adres-disaridan         onkosul sahibi: sunucu     tamamlaninca bedelin %0'i
  2. cozumleme               onkosul sahibi: ag         tamamlaninca bedelin %0'i
  3. ic-uca-ulasma           onkosul sahibi: ag         tamamlaninca bedelin %40'i
  4. kimliksiz-yanit         onkosul sahibi: ic-servis  tamamlaninca bedelin %80'i
  5. geri-yansima            onkosul sahibi: sunucu     tamamlaninca bedelin %100'i

2. uc basina zincir
uc                             yon         katman  ilk kirilan  denetimsiz   bedel   gerceklesen
abone-portali.tarife-degis     tarayici         2      3. adim           3      60           0.0
abone-portali.adres-guncelle   tarayici         1      3. adim           4      45           0.0
abone-portali.itiraz-ac        tarayici         2      4. adim           4      30           0.0
saha-uygulamasi.is-emri-kapat  tarayici         2      3. adim           3     120           0.0
yonetim.esik-ayari             tarayici         0   kirilmiyor           5       8           8.0
yonetim.kullanici-yetkisi      tarayici         2      4. adim           3       4           0.0
fatura-uretimi.sablon-getir    sunucu           2      1. adim           3       9           0.0
toplayici.geri-bildirim-ucu    sunucu           2      2. adim           3      14           0.0
is-emri.harita-onizleme        sunucu           1      5. adim           4      14          11.2
rapor.dis-kaynak-cek           sunucu           0   kirilmiyor           5      17          17.0
sube-ucu.baglanti-sinama       sunucu           3      3. adim           2       6           0.0
tarayici yonu: 6 uc, toplam bedel 267 islem, gerceklesen 8.0; kirilmayan uc 1
sunucu yonu: 5 uc, toplam bedel 60 ic uc, gerceklesen 28.2; kirilmayan uc 1

3. bir katman butun uclardan kaldirilirsa
katman              yon         dagitim   mesru  kirilmaz olan  gerceklesen fark
ayni-site-cerez     tarayici          3       2              1             +45.0
istek-belirteci     tarayici          3       5              0              +0.0
kaynak-denetimi     tarayici          1       3              0              +0.0
yeniden-dogrulama   tarayici          2      11              0              +0.0
cikis-izin-listesi  sunucu            1       4              0              +0.0
cozumleme-denetimi  sunucu            2       1              0              +0.0
ag-bolutleme        sunucu            2       8              0              +2.4
ic-uc-kimligi       sunucu            1       6              0              +0.0
sade-yanit          sunucu            2       2              1              +2.8

4. bedel egrisinin bicimi
adim       tarayici %     sunucu %  tarayici uc    sunucu uc
1.                  0            0            0            1
2.                  0            0            0            1
3.                  0           40            3            1
4.                  0           80            2            0
5.                100          100            0            1
tarayici yonunde bedel yalnizca son adimda gerceklesir: dorduncu adimda kirmak bedeli sifirda tutar
sunucu yonunde ucuncu adim bedelin %40'ini uretir: gec kirmak bedeli sifirlamaz

Önkoşulun Sahibi

Birinci çıktı iki zinciri adım adım açar ve her adımın önkoşulunu kimin elinde tuttuğunu yazar. Tarayıcı yönünde iki adımın sahibi kurban, biri tarayıcı, ikisi sunucudur. Savunanın doğrudan karar verebildiği adım sayısı beşte ikidir; kalan üçünde ancak dolaylı bir etkisi olur.

Sunucu yönünde tablo tersine döner: iki adımın sahibi sunucunun kendisi, ikisi ağ, biri iç servistir. Hiçbir adımın önkoşulu kurbana ait değildir. Bu yön bir kullanıcı hatasına bağlı değildir; tamamen kurumun kendi yapılandırmasında geçer. Aynı sınıf adı altında toplanan iki zincirin savunma sorumluluğu bu yüzden farklı ekiplere düşer.

Uç Başına Kırılma

İkinci çıktı on bir ucu ölçer. Tarayıcı yönündeki altı uçtan üçü üçüncü adımda, ikisi dördüncü adımda kırılıyor; biri hiç kırılmıyor. Sunucu yönündeki beş uçtan biri birinci, biri ikinci, biri üçüncü, biri beşinci adımda kırılıyor; biri hiç kırılmıyor.

gerceklesen sütunu farkı somutlaştırır. Tarayıcı yönünde toplam bedel 267 işlemdir ve gerçekleşen yalnız 8 — çünkü kırılan beş uçta zincir beşinci adıma varmadan durur ve tarayıcı yönünde bedel yalnız son adımda oluşur. Sunucu yönünde toplam bedel 60 iç uçtur ve gerçekleşen 28,2; kırılamayan uç 17’nin tamamını, beşinci adımda kırılan uç 14’ün 11,2’sini üretir.

denetimsiz sütunu ikinci bir okuma verir. En çok katmanı olan uç sube-ucu.baglanti-sinama üçüncü adımda kırılıyor ve beş adımının yalnız ikisi denetimsiz; en az katmanı olan iki uçta beş adımın beşi de denetimsiz. Arada duran uçlarda katman sayısı ile denetimsiz adım sayısı birebir tamamlayıcı değildir, çünkü iki katman aynı adımı kırabilir: abone-portali.itiraz-ac iki katman taşır ama ikisi de dördüncü adımı kırar, bu yüzden denetimsiz adım sayısı dörttür. İki katmanın aynı adıma düşmesi ikinci bir halka kazandırmaz.

İki toplam yan yana yazılabilir ama toplanamaz. Biri günlük işlem, öteki erişilen iç uç sayısıdır. Bir savunma raporu “iki uçta koruma yok” dediğinde iki farklı büyüklükten söz etmiş olur: biri günde 8 kurgu işlemi etkiler, öteki 17 iç uca erişim açar.

Bir Katmanın Kaldırılması

Üçüncü çıktı duyarlılık ölçümüdür: her katman bütün uçlardan kaldırılır ve gerçekleşen bedel farkı yazılır. Dokuz katmandan altısının farkı sıfırdır — kaldırıldıklarında kırılma noktası geriye kayar ama bedel değişmez, çünkü arkalarında başka bir katman durur.

Fark üretenler üç tanedir. ayni-site-cerez kaldırılırsa bir uç kırılmaz hâle gelir ve gerçekleşen bedel 45 işlem artar; meşru işe bedeli 2 ile en ucuz katmandır. sade-yanit 2,8, ag-bolutleme 2,4 fark üretir. Buna karşılık meşru işe bedeli 11 olan yeniden-dogrulama kaldırıldığında fark sıfırdır: en pahalı katman, bu dağıtımda hiçbir şey eklemiyor.

Bu, katman seçiminin listeden değil dağıtımdan okunması gerektiğini gösterir. Bir katmanın değeri kendi gücünde değil, bulunduğu uçlarda ondan önce kıran başka bir katmanın olup olmadığındadır.

Ölçümün ters yönü de aynı sayıdan okunur. Farkı sıfır çıkan altı katmanın hiçbiri gereksiz değildir; yalnız bu dağıtımda yedek durumdadırlar. Önlerindeki katman bir uçtan kalktığı anda fark üretmeye başlarlar. Bir katmanın kaldırılıp kaldırılamayacağı sorusu bu yüzden tek başına sorulamaz: yanıt, aynı uçta duran öteki katmanların hangi adımları tuttuğuna bağlıdır ve dağıtım her değiştiğinde yeniden hesaplanması gerekir.

Bedel Eğrisinin Biçimi

Dördüncü çıktı iki yönün asıl farkını verir. Tarayıcı yönünde bedel eğrisi dört adım boyunca sıfırdır ve beşinci adımda birden %100’e çıkar. Dördüncü adımda kırmak ile birinci adımda kırmak aynı sonucu verir: bedel sıfır. Bu yönde “geç kırma” diye bir şey neredeyse yoktur; zincir ya tamamlanır ya tamamlanmaz.

Sunucu yönünde eğri kademelidir: üçüncü adım tamamlandığında bedelin %40’ı, dördüncüde %80’i gerçekleşmiştir. Beşinci adımda kırmak — yani yanıtın dışarı yansımasını engellemek — bedelin yalnız %20’sini önler. İç uçlara ulaşılmış, hangi servislerin yaşadığı öğrenilmiştir; yanıtın geri dönmemesi bunu geri almaz.

Aynı sınıf adı altındaki iki zincirde erken kırmanın kazancı aynı değildir. Tarayıcı yönünde son halkadan önceki her nokta eşit değerdedir; sunucu yönünde her adım bir öncekinden pahalıdır ve savunmanın ikinci adımdan geç kalmaması gerekir.

Özet

  • İstek sahteciliğinin iki yönü ayrı zincirlerdir: birinde kurbanın kimliği, ötekinde sunucunun ağ konumu kullanılır. İkisi de beş adımdır ama önkoşul sahipleri farklıdır.
  • Tarayıcı yönünde beş adımın 2’sinin önkoşulu kurbanın elindedir; sunucu yönünde hiçbir adımın önkoşulu kurbana ait değildir ve zincirin tamamı kurumun kendi yapılandırmasında geçer.
  • On bir uçtan 2’sinde hiçbir halka kırılmıyor: biri günde 8 kurgu işlem, öteki 17 iç uç. İki sayı ayrı birimdedir ve toplanmaz.
  • Dokuz katmandan 6’sının kaldırılması gerçekleşen bedeli değiştirmiyor; en ucuz katmanın (meşru bedel 2) kaldırılması 45 işlemlik fark üretiyor, en pahalı katmanın (meşru bedel 11) kaldırılması 0.
  • Bedel eğrileri farklıdır: tarayıcı yönünde bedel yalnız beşinci adımda gerçekleşir, sunucu yönünde üçüncü adımda %40’ı, dördüncüde %80’i gerçekleşmiş olur. Geç kırmak yalnız ikinci yönde gerçek bir kayıp bırakır.

Sonraki Adım

Bu dersin sunucu yönünde istek bir adrese gidiyordu ve adresin dışarıdan gelmesi zincirin ilk halkasıydı. Aynı yapı, adres yerine bir dosya yolu olduğunda başka bir sınıfa dönüşür: uç bir kalem adı alır, onu bir kök dizine ekler ve sonucu okur. Sonraki ders o zinciri sayar — yol bileşeninin nereden geldiği, birleştirmeden sonra hangi denetimin kaldığı, süreç kimliğinin okuyabildiği kalem sayısının bedeli nasıl belirlediği ve dolaylı bir tanıtıcı eşlemesinin zinciri kaçıncı adımda kırdığı.

İ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