---
title: 'Saldırı Teknikleri ve Tehdit Ortamı'
source: 'https://academia.sh/tr/kurslar/saldiri-teknikleri'
language: tr
updated: '2026-08-17T04:39:47+00:00'
license: 'CC BY-SA 4.0'
lessons: 22
outcomes:
    - 'Saldırı yaşam döngüsünü adım dizisi olarak modeller ve erken kırma kazancını hesaplar'
    - 'İnsan odaklı saldırıları ayırt edici göstergelerle sınıflandırır ve eşik seçiminin bedelini ölçer'
    - 'Uygulama katmanı açık sınıflarının hangi savunma katmanında kırıldığını sayar'
---

# Saldırı Teknikleri ve Tehdit Ortamı

Saldırının adım dizisi olarak modellenmesi ve zincirin hangi halkada kırılabildiği: tehdit aktörlerinin motivasyon ve yetenek düzeyleri, uzun soluklu hedefli kampanyaların özellikleri, keşiften hedefe ulaşmaya saldırı yaşam döngüsü, taktik ve teknik matrislerinin kapsama ölçüsü, aktör, altyapı, yetenek ve kurban ilişkisi, sıfırıncı gün kavramı, güven ve aciliyet istismarının insan katmanındaki karşılığı, kimlik avı türleri ve ayırt edici göstergeler, kısa mesaj ve sesli arama temelli saldırılar, fiziksel teknikler, yazım hatası ve görsel benzer alan adlarının tespiti, su kuyusu saldırıları, farkındalık programlarının ölçümü, enjeksiyon, siteler arası betik çalıştırma, istek sahteciliği, dizin geçişi, arabellek taşması, parola saldırılarının maliyet farkı ve tersine mühendisliğin savunmadaki yeri.

## Tehdit Modelleri

Saldırının adım dizisi olarak modellenmesi ve zincirin hangi halkada kırılabildiği: tehdit aktörlerinin yetenek ve motivasyon düzeyine göre zincirin kaç adımını geçebildiği, uzun soluklu kampanyalarda sürenin doğurduğu fırsat pencereleri ile yerleşik kalma süresinin büyüttüğü kalem sayısı, saldırı yaşam döngüsünün önkoşullarla kurulup erken kırma kazancının hesaplanması, taktik ve teknik matrisinin hiç denetimi olmayan adımı ortaya çıkarması, dört köşeli ilişki modelinde bir köşeyi bilmenin diğerlerini kaç kat daralttığı ve sıfırıncı gün tehdidinde imza tabanlı denetimin kaçırdığı ile davranış tabanlı denetimin yakaladığı halkaların ayrılması.

### Tehdit Aktörleri

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/tehdit-aktorleri

Aktörün yetenek ve motivasyon düzeyiyle ayrılması: sekiz adımlık zincirde beş aktör düzeyinden yalnız birinin sekiz adımın tamamını geçmesi, iki düzeyin yetenek eşiğine beşinci adımda takılması, yetenek duvarının zincirin uçlarında değil ortasında oturması, hedefine ulaşan iki aktörden birinin en düşük yetenekli aktör olması, zincir hiç kırılmazsa beş aktörün 64 kalem, keşifte kırılırsa 0 kalem etkilemesi ve bir adımı geç kırmanın bedelinin 0 ile 17 kalem arasında değişmesi.

Beş kurs boyunca hep savunma tarafından bakıldı: her denetimin kaç yolu kapattığı, neyi kaçırdığı
ve meşru işe bedeli sayıldı. Kaçırılan yolların **kim tarafından, hangi sırayla ve neden**
kullanıldığı ise hiç ele alınmadı. Bu kurs karşı tarafa geçer — ama saldırıyı bir olay olarak
değil, **önkoşulları olan bir adım dizisi** olarak ele alır.

Zincir modeli Siber Güvenliğe Giriş kursunda kuruldu: `İstismar ve Yük` dersi açıktan etkiye giden
diziyi adımladı, `Saldırı Yüzeyi` dersi erişim adımını yol sayısına çevirdi. Burada o model
devralınır ve tek soru sorulur: **bu zincir hangi halkada kırılabilir ve geç kırmak ne
kaybettirir.** İlk adım, zinciri yürüyenin kim olduğunu ölçülebilir hale getirmektir.

#### Aktör Bir Yetenek ve Motivasyon Çiftidir

Aşağıdaki yapı bir **modeldir**: gerçek bir grup, kampanya ya da olay adı yoktur; aktörler yalnız
**yetenek düzeyi** ve **motivasyonu** ile anılır. Buradaki adımların gerçek bir sistem üzerinde
denenmesi **yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır**.

**TM1:** zincir sekiz adımdır; her adımın bir yetenek eşiği (1–5), bir süre maliyeti ve
tamamlandığında erişilmiş olan kurgu kalem sayısı vardır. **TM2:** aktör üç sayıyla anılır —
yetenek düzeyi, sabır (gün bütçesi) ve **hedef adım**, yani motivasyonun zincirdeki karşılığı.
**TM3:** aktör zinciri baştan yürür ve yetenek eşiği aşılırsa ya da gün bütçesi biterse durur.

```js
// tehdit/aktor.mjs — aktor yetenegi ile zincir adimlarinin modeli: burada calisan bir saldiri
// adimi yoktur, yalnizca adim adlarindan ve sayilardan olusan bir veri yapisi vardir.
// Gercek bir aktor, grup ya da kampanya adi gecmez; aktorler yetenek ve motivasyonla anilir.

// TM1: zincir sekiz adimdir; her adimin bir yetenek esigi (1..5), bir sure maliyeti (gun) ve
// tamamlandiginda erisilmis olan kurgu kalem sayisi vardir. Kalem sayisi birikimlidir.
export const ADIM = [
  { ad: "kesif", yetenek: 1, gun: 3, kalem: 0 },
  { ad: "ilk-erisim", yetenek: 2, gun: 2, kalem: 1 },
  { ad: "yurutme", yetenek: 3, gun: 1, kalem: 2 },
  { ad: "kalicilik", yetenek: 3, gun: 2, kalem: 3 },
  { ad: "yetki-yukseltme", yetenek: 4, gun: 5, kalem: 9 },
  { ad: "yanal-gecis", yetenek: 4, gun: 14, kalem: 26 },
  { ad: "toplama", yetenek: 2, gun: 21, kalem: 41 },
  { ad: "sizdirma", yetenek: 3, gun: 4, kalem: 48 },
];

// TM2: aktor uc sayiyla anilir: yetenek duzeyi (1..5), sabir (gun butcesi) ve hedef adim
// (motivasyonun zincirdeki karsiligi). `atlanan`, konumun bedelsiz sagladigi adimlardir.
export const AKTOR = [
  { ad: "dusuk-yetenek-firsatci", yetenek: 2, sabir: 6, hedef: "yurutme", atlanan: [] },
  { ad: "orta-yetenek-ideolojik", yetenek: 3, sabir: 10, hedef: "kalicilik", atlanan: [] },
  { ad: "orta-yetenek-gelir-odakli", yetenek: 3, sabir: 45, hedef: "sizdirma", atlanan: [] },
  { ad: "ic-erisimli-orta-yetenek", yetenek: 3, sabir: 120, hedef: "toplama",
    atlanan: ["kesif", "ilk-erisim", "yetki-yukseltme"] },
  { ad: "yuksek-yetenek-hedefli", yetenek: 5, sabir: 400, hedef: "sizdirma", atlanan: [] },
];

// TM3: aktor zinciri bastan yurur; yetenek esigi asilirsa ya da gun butcesi biterse durur.
// Durdugu anda erisilmis kalem sayisi bir onceki adimin kalemidir.
export function yuru(a, esik = {}) {
  let gun = 0, i = 0, engel = "yok";
  for (; i < ADIM.length; i++) {
    if (a.atlanan.includes(ADIM[i].ad)) continue;
    const y = ADIM[i].yetenek + (esik[ADIM[i].ad] || 0);
    if (y > a.yetenek) { engel = "yetenek"; break; }
    if (gun + ADIM[i].gun > a.sabir) { engel = "sabir"; break; }
    gun += ADIM[i].gun;
  }
  const hedefSira = ADIM.findIndex((s) => s.ad === a.hedef);
  return { durak: i, gun, engel, kalem: i === 0 ? 0 : ADIM[i - 1].kalem,
    gecen: ADIM.slice(0, i).filter((s) => !a.atlanan.includes(s.ad)).length,
    durdugu: i < ADIM.length ? ADIM[i].ad : "-", basardi: i > hedefSira };
}

// Zincir k. adimda kirilirsa aktorun erisebildigi kalem, kendi duragi ile k'nin kucugudur.
export const kalemKirilinca = (a, k) => {
  const d = Math.min(yuru(a).durak, k);
  return d === 0 ? 0 : ADIM[d - 1].kalem;
};
export const toplamKalem = (k) => AKTOR.reduce((s, a) => s + kalemKirilinca(a, k), 0);
```

```js
// tehdit/olc.mjs — hangi aktor zincirin kac adimini geciyor, hangi halka kimi eliyor.
import { ADIM, AKTOR, yuru, toplamKalem } from "./aktor.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 S = AKTOR.map((a) => ({ a, r: yuru(a) }));

console.log(`${ADIM.length} adimlik zincir, ${AKTOR.length} aktor duzeyi; ` +
  `yetenek esikleri ${ADIM.map((s) => s.yetenek).join("")}, ` +
  `bastan sona ${ADIM.reduce((t, s) => t + s.gun, 0)} gun, ` +
  `tam zincirin erisebildigi kalem ${ADIM.at(-1).kalem}`);

const A = [-27, 9, 7, 18, 8, 6, 18, 8];
console.log("\n1. her aktor duzeyi zincirin kac adimini geciyor");
yaz(A, "aktor", "yetenek", "sabir", "hedef adim", "gecti", "gun", "durdugu adim", "kalem");
for (const { a, r } of S)
  yaz(A, a.ad, a.yetenek, a.sabir, a.hedef, r.gecen, r.gun, r.durdugu, r.kalem);
console.log(`hedefine ulasan aktor: ${S.filter((x) => x.r.basardi).length}/${AKTOR.length} ` +
  `(${S.filter((x) => x.r.basardi).map((x) => x.a.ad).join(", ")})`);

const B = [-18, 9, 6, 13, 15, 8];
console.log("\n2. hangi halka kimi eliyor");
yaz(B, "adim", "yetenek", "gun", "gecen aktor", "burada duran", "kalem");
for (let i = 0; i < ADIM.length; i++) {
  const gecen = S.filter((x) => x.r.durak > i).length;
  const duran = S.filter((x) => x.r.durak === i);
  yaz(B, ADIM[i].ad, ADIM[i].yetenek, ADIM[i].gun, gecen,
    duran.length ? `${duran.length} (${duran[0].r.engel})` : "-", ADIM[i].kalem);
}

const C = [-18, 14, 18, 14, 20];
console.log("\n3. zincir hangi adimda kirilirsa (bes aktorun toplam kalemi)");
yaz(C, "kirilan adim", "toplam kalem", "kurtarilan kalem", "dusen hedef", "bir adim gec kirma");
const taban = toplamKalem(ADIM.length);
for (let k = 0; k <= ADIM.length; k++) {
  const t = toplamKalem(k);
  const dusen = S.filter((x) => x.r.basardi &&
    k <= ADIM.findIndex((s) => s.ad === x.a.hedef)).length;
  yaz(C, k < ADIM.length ? ADIM[k].ad : "kirilmadan", t, taban - t, dusen,
    k < ADIM.length ? toplamKalem(k + 1) - t : "-");
}

const D = [-18, 15, 14, 18, 13];
console.log("\n4. bir adimin yetenek esigi bir basamak yukseltilirse");
yaz(D, "yukseltilen adim", "yeni durduran", "toplam kalem", "kurtarilan kalem", "dusen hedef");
for (const s of ADIM) {
  const y = AKTOR.map((a) => yuru(a, { [s.ad]: 1 }));
  const t = y.reduce((n, r) => n + r.kalem, 0);
  yaz(D, s.ad, y.filter((r, i) => r.durak < S[i].r.durak).length, t, taban - t,
    y.filter((r, i) => S[i].r.basardi && !r.basardi).length);
}
```

```
8 adimlik zincir, 5 aktor duzeyi; yetenek esikleri 12334423, bastan sona 52 gun, tam zincirin erisebildigi kalem 48

1. her aktor duzeyi zincirin kac adimini geciyor
aktor                        yetenek  sabir        hedef adim   gecti   gun      durdugu adim   kalem
dusuk-yetenek-firsatci             2      6           yurutme       2     5           yurutme       1
orta-yetenek-ideolojik             3     10         kalicilik       4     8   yetki-yukseltme       3
orta-yetenek-gelir-odakli          3     45          sizdirma       4     8   yetki-yukseltme       3
ic-erisimli-orta-yetenek           3    120           toplama       2     3       yanal-gecis       9
yuksek-yetenek-hedefli             5    400          sizdirma       8    52                 -      48
hedefine ulasan aktor: 2/5 (orta-yetenek-ideolojik, yuksek-yetenek-hedefli)

2. hangi halka kimi eliyor
adim                yetenek   gun  gecen aktor   burada duran   kalem
kesif                     1     3            5              -       0
ilk-erisim                2     2            5              -       1
yurutme                   3     1            4    1 (yetenek)       2
kalicilik                 3     2            4              -       3
yetki-yukseltme           4     5            2    2 (yetenek)       9
yanal-gecis               4    14            1    1 (yetenek)      26
toplama                   2    21            1              -      41
sizdirma                  3     4            1              -      48

3. zincir hangi adimda kirilirsa (bes aktorun toplam kalemi)
kirilan adim        toplam kalem  kurtarilan kalem   dusen hedef  bir adim gec kirma
kesif                          0                64             2                   0
ilk-erisim                     0                64             2                   5
yurutme                        5                59             2                   4
kalicilik                      9                55             2                   4
yetki-yukseltme               13                51             1                  12
yanal-gecis                   25                39             1                  17
toplama                       42                22             1                  15
sizdirma                      57                 7             1                   7
kirilmadan                    64                 0             0                   -

4. bir adimin yetenek esigi bir basamak yukseltilirse
yukseltilen adim    yeni durduran  toplam kalem  kurtarilan kalem  dusen hedef
kesif                           0            64                 0            0
ilk-erisim                      1            63                 1            0
yurutme                         3            52                12            1
kalicilik                       3            55                 9            1
yetki-yukseltme                 0            64                 0            0
yanal-gecis                     0            64                 0            0
toplama                         0            64                 0            0
sizdirma                        0            64                 0            0
```

Sayılar **ölçüm** sınıfındadır; girdileri TM1–TM3'tür.

#### Beş Düzeyden Biri Sekiz Adımı Geçiyor

Birinci tablo aktörü tek bir sıfatla değil, **kaç adım** sayısıyla anar. Beş düzeyden yalnız biri
zincirin sekiz adımının tamamını geçer. Düşük yetenekli fırsatçı iki adım sonra durur, iki orta
yetenekli düzey beşinci adımda takılır, içeriden erişimi olan düzey konumunun bedelsiz sağladığı
üç adım sayesinde beşinci adıma kadar gider ama altıncıda durur.

Durma nedeni her satırda yazılıdır ve hepsinde aynıdır: **yetenek**. Sabır bütçesi hiçbir düzeyi
durdurmaz, çünkü zincirin toplam süresi 52 gündür ve bu bütçeyi aşan tek düzey altı günlük
fırsatçıdır — o da yetenek eşiğine daha önce takılır. Süre bu derste bağlayıcı kısıt değildir;
bir sonraki ders sürenin kendisini ölçü ekseni yapacaktır.

İçeriden erişimi olan düzey ayrı bir satırdır. Yeteneği ortadır, ama konumu üç adımı bedelsiz
verir: keşif, ilk erişim ve yetki yükseltme. Bu düzey **yalnız iki adım yürüyerek** dokuz kaleme
ulaşır; aynı yetenekteki dışarıdaki düzey dört adım yürür ve üç kaleme ulaşır. Kaç adım geçildiği
tek başına ölçü değildir — **nereden başlandığı** onu üç kat büyütür.

#### Duvar Zincirin Ortasındadır

İkinci tablo eşikleri sıraya dizer: 1, 2, 3, 3, **4, 4**, 2, 3. En yüksek iki eşik zincirin
beşinci ve altıncı adımlarındadır; son iki adım ise onların altına iner — toplama 2, sızdırma 3.
Toplanan verinin dışarı çıkarılması, zincirin ortasını geçmekten daha az yetenek ister.

Bunun sonucu geçen aktör sütununda görünür. Keşif ve ilk erişimi beş düzeyin beşi de geçer;
yürütmeyi dördü, yetki yükseltmeyi ikisi, yanal geçişi **biri** geçer. Zincir bir eleme dizisidir
ve elemenin tamamı ortadaki iki adımda olur. Uçlardaki adımlar kimseyi elemez: girişteki iki adım
herkesin geçtiği, çıkıştaki iki adım da yalnız oraya varabilmiş olanın geçtiği adımlardır.

Bu, savunmanın nereye konacağı sorusunu doğrudan etkiler. Ortadaki iki adım aktörleri kendiliğinden
eler; oraya konan bir denetim zaten seyrelmiş bir kümeyle karşılaşır. Baştaki iki adıma konan bir
denetim ise beş düzeyin beşini birden görür. **Zincirin doğal elemesi ile savunmanın elemesi aynı
yerde toplanırsa, savunma yalnız kendiliğinden elenen aktörleri durdurur.**

#### Hedef Adım Başarıyı Yeniden Tanımlar

Hedefine ulaşan aktör satırı iki düzey listeler ve bunlardan biri sabrı on günlük, orta yetenekli
ideolojik düzeydir. Sekiz adımın yalnız dördünü geçmiştir; buna rağmen hedefine ulaşmıştır, çünkü
hedef adımı dördüncü sıradadır. Aynı yeteneğe sahip gelir odaklı düzey de tam olarak aynı dört
adımı geçer, aynı üç kaleme ulaşır ve **hedefine ulaşamaz**, çünkü onun hedef adımı sekizincidir.

İki satır tabloda ölçüm olarak aynıdır, sonuç olarak birbirinin zıddıdır. Motivasyon burada bir
sıfat değil, zincirdeki bir **sıra numarasıdır**. Başarıyı zincirin sonuna varmak diye tanımlayan
bir değerlendirme, dördüncü adımda hedefine ulaşan düzeyi başarısız sayar ve onu ölçüm dışında
bırakır. Aynı yanılgı ters yönde de işler: en yüksek yetenekli düzey sekiz adımı 52 günde geçer
ve 48 kalemin tamamına erişir — sabır bütçesinin ancak sekizde birini harcayarak.

#### Geç Kırmanın Bedeli Bir Sayıdır

Üçüncü tablo bu dersin son sütununu verir. Zincir hiç kırılmazsa beş aktörün toplam erişimi
**64 kalemdir**. Keşifte ya da ilk erişimde kırılırsa **0**; yürütmede 5, yetki yükseltmede 13,
yanal geçişte 25, toplamada 42 kalem. Son sütun aynı sayıları farkla okur: bir adım geç kırmanın
bedeli sırasıyla 0, 5, 4, 4, **12, 17**, 15 ve 7 kalemdir.

Bu sayılar beş aktörün toplamıdır, tek bir saldırının değil. Aynı zincir üzerinde farklı yeteneğe
sahip düzeyler farklı derinliklere varır; bir denetim noktası hepsini aynı anda karşılar. Bu yüzden
bir kırılma noktasının değeri, tek bir aktöre göre değil, **o noktaya varabilen bütün düzeylerin
toplam erişimine** göre yazılır.

Bedelin dağılımı düz değildir. İlk dört adımda geç kalmanın toplam bedeli 13 kalemdir; yetki
yükseltme ile toplama arasındaki üç adımda 44 kalemdir. **Zincirin ortasında bir adım geç kırmak,
başında dört adım geç kırmaktan üç kat pahalıdır.** Dördüncü sütun ise kırılmanın hedefe etkisini
verir: kalıcılıkta ve öncesinde kırmak iki aktörün hedefini birden düşürür, sonrasında yalnız
birini.

Dördüncü tablo savunma tarafının gerçek hamlesini dener: bir adımın yetenek eşiğini **bir basamak**
yükseltmek. Yürütme adımında bu, üç aktörü daha erken durdurur ve 12 kalem kurtarır; kalıcılıkta üç
aktörü durdurur ve 9 kalem kurtarır. Zincirin en zor iki adımında — yetki yükseltme ve yanal geçiş
— aynı hamle **hiçbir aktörü durdurmaz ve sıfır kalem kurtarır**: yanal geçişi zaten tek düzey
geçiyor, yetki yükseltmeyi geçen iki düzeyden biri konumu sayesinde o adımı hiç yürümüyor, öteki
eşik bir basamak yükselse de aşıyor. Sertleştirme çabasının en zor adıma yığılması, ölçüldüğünde
karşılığı olmayan bir karardır.

#### Özet

- Tehdit aktörü ad ile değil üç sayıyla anılır: yetenek düzeyi, sabır bütçesi ve hedef adım.
  Sekiz adımlık zincirde beş düzeyden yalnız biri sekiz adımın tamamını geçer.
- Yetenek duvarı zincirin ortasındadır: eşikler 1, 2, 3, 3, 4, 4, 2, 3 sırasını izler; beş düzeyin
  beşi ilk iki adımı, dördü üçüncüyü, ikisi beşinciyi ve biri altıncıyı geçer.
- Konum yürünen adım sayısını değiştirir: içeriden erişimli düzey üç adımı bedelsiz alır, yalnız
  iki adım yürür ve 9 kaleme ulaşır; aynı yetenekteki dışarıdaki düzey dört adım yürür, 3 kaleme.
- Motivasyon zincirdeki bir sıra numarasıdır: aynı dört adımı geçen iki düzeyden hedefi dördüncü
  adımda olan başarır, hedefi sekizinci adımda olan başaramaz.
- Kırılma noktası bedeli belirler: hiç kırılmazsa 64 kalem, keşifte kırılırsa 0. Bir adım geç
  kırmanın bedeli 0, 5, 4, 4, 12, 17, 15, 7 kalemdir; ortadaki üç adım toplamın üçte ikisini taşır.
- Bir adımın eşiğini bir basamak yükseltmek yürütmede 12, kalıcılıkta 9 kalem kurtarır; zincirin en
  zor iki adımında 0 kalem kurtarır: birini tek düzey geçiyor, ötekini geçen iki düzey de eşiğin
  bir basamak yükselmesinden etkilenmiyor.

#### Sonraki Adım

Bu dersin bütün ölçümlerinde süre bağlayıcı olmadı. Sabır bütçesi hiçbir aktörü durdurmadı, çünkü
zincirin toplam maliyeti 52 gün yazılmıştı ve en sabırlı düzeyin bütçesi 400 gündü. O düzey sekiz
adımı geçti, 48 kaleme erişti ve bütçesinin sekizde birini harcadı — geriye kalan 348 günde ne
yaptığı hiç sorulmadı.

Oysa uzun soluklu bir kampanyada asıl ölçü sürenin kendisidir. Bir adım günlerce değil **aylarca**
sürebilir; o ay boyunca her gün savunma tarafında bir kayıt doğar ve her kayıt bir fırsat
penceresidir. Sonraki ders zinciri süre eksenine oturtur: hangi adım kaç gün sürüyor, o süre
boyunca kaç fırsat penceresi doğuyor, kaç penceresi hiçbir denetimin bakmadığı gün ve tespit
edilmemiş kalınan her hafta kalem sayısını ne kadar büyütüyor.

### Gelişmiş Sürekli Tehdit

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/gelismis-surekli-tehdit

Uzun soluklu kampanyanın süre ekseninde ölçülmesi: 330 günlük sekiz adımlık bir dizide 261 günün (%79,1) hiçbir denetimin görmediği günler olması, beş denetimden yalnız ikisinin kayıt eşiğine varması, en uzun iki adımın sürenin %65,5'ini ve kalem artışının üçte ikisini taşıması, ilk tespitin 92. günde 7 kalemle gelmesi, tek bir kayıt eşiğinin 180'den 300'e çıkmasının tespiti 325. güne taşıyıp yerleşik kalma süresini 47 günden 280 güne ve kalem sayısını 7'den 45'e çıkarması ve keşif adımına konan bir denetimin tutunmayı hiç doğurmadan 48 kalem kurtarması.

Önceki dersin bütün ölçümlerinde süre bağlayıcı olmadı: zincirin toplam maliyeti 52 gün yazıldı,
en sabırlı düzeyin bütçesi 400 gündü ve hiçbir aktör gün bütçesi yüzünden durmadı. Sabır bir
kısıt olarak hiç devreye girmedi.

Uzun soluklu bir kampanyada ölçünün kendisi süredir. Bir adım günlerce değil **aylarca** sürebilir
ve o ay boyunca savunma tarafında her gün bir kayıt doğar. Her kayıt bir **fırsat penceresidir**:
denetimin uyarabileceği bir an. Bu ders zinciri süre eksenine oturtur ve üç sayı verir — kaç gün
sürüyor, kaç gün hiçbir denetimin bakmadığı gün ve tespit gecikmesi kalem sayısını ne kadar
büyütüyor.

#### Kampanya Bir Süre Dizisidir

Aşağıdaki yapı bir **modeldir**: gerçek bir kampanya, aktör ya da olay adı yoktur; adımlar yalnız
süre, günlük iz ve kalem sayısıyla anılır. Kurgu ölçüm ağı üzerinde çalışılır.

**TM4:** her adımın bir süresi, günde ürettiği kurgu kayıt sayısı (`iz`), o kaydı gören bir denetim
ve denetimin uyarı için beklediği kayıt eşiği vardır. **TM5:** bir denetim ancak kendi adımında
eşik kadar kayıt birikince uyarır; adım o kadar kayıt üretmeden biterse denetim var olsa da hiç
uyarmaz. **TM6:** kalem sayısı adım içinde doğrusal birikir.

```js
// tehdit/kampanya.mjs — uzun soluklu kampanyanin sure modeli: burada calisan bir saldiri adimi
// yoktur, yalnizca gun, iz ve kalem sayilarindan olusan bir veri yapisi vardir. Gercek bir
// kampanya, aktor ya da olay adi gecmez. Rastgelelik yok.

// TM4: her adimin bir suresi (gun), gunde urettigi kurgu kayit sayisi (iz), o kaydi goren bir
// denetim (ya da yok) ve denetimin uyari icin bekledigi kayit esigi vardir. `kalem`, adim
// bittiginde erisilmis olan birikimli kurgu kalem sayisidir.
export const ADIM = [
  { ad: "kesif", gun: 45, iz: 1, denetim: null, esik: 0, kalem: 0 },
  { ad: "ilk-erisim", gun: 12, iz: 4, denetim: "kimlik-gunlugu", esik: 60, kalem: 1 },
  { ad: "yurutme", gun: 2, iz: 9, denetim: "surec-kaydi", esik: 30, kalem: 2 },
  { ad: "kalicilik", gun: 3, iz: 2, denetim: "baslatma-envanteri", esik: 10, kalem: 3 },
  { ad: "yetki-yukseltme", gun: 38, iz: 6, denetim: "yetki-degisikligi", esik: 180, kalem: 9 },
  { ad: "yanal-gecis", gun: 96, iz: 3, denetim: null, esik: 0, kalem: 26 },
  { ad: "toplama", gun: 120, iz: 2, denetim: null, esik: 0, kalem: 41 },
  { ad: "sizdirma", gun: 14, iz: 12, denetim: "cikis-hacmi", esik: 100, kalem: 48 },
];

export const BASLANGIC = ADIM.map((_, i) =>
  ADIM.slice(0, i).reduce((t, s) => t + s.gun, 0));
export const SURE = ADIM.reduce((t, s) => t + s.gun, 0);
export const TUTUNMA = BASLANGIC[1]; // ilk erisim adiminin basladigi gun

// TM5: bir denetim ancak kendi adiminda esik kadar kayit birikince uyarir; adim o kadar kayit
// uretmeden biterse denetim var olsa da hic uyarmaz.
export function uyariGunu(i, ayar = {}) {
  const s = { ...ADIM[i], ...(ayar[ADIM[i].ad] || {}) };
  if (!s.denetim || s.gun * s.iz < s.esik) return null;
  return BASLANGIC[i] + Math.ceil(s.esik / s.iz);
}
export const ilkTespit = (ayar = {}) => ADIM
  .map((_, i) => uyariGunu(i, ayar)).filter((g) => g !== null).sort((a, b) => a - b)[0] ?? null;

// TM6: kalem sayisi adim icinde dogrusal birikir; gun d'de erisilmis kalem asagidaki gibidir.
export function kalemGun(d) {
  let onceki = 0;
  for (let i = 0; i < ADIM.length; i++) {
    const bas = BASLANGIC[i], son = bas + ADIM[i].gun;
    if (d < son) return Math.floor(onceki + ((d - bas) / ADIM[i].gun) * (ADIM[i].kalem - onceki));
    onceki = ADIM[i].kalem;
  }
  return ADIM.at(-1).kalem;
}
```

```js
// tehdit/sure.mjs — sure ekseni: hangi adim aylarca suruyor, kac firsat penceresi doguyor,
// yerlesik kalinan her gun kac kalem buyutuyor.
import { ADIM, BASLANGIC, SURE, TUTUNMA, uyariGunu, ilkTespit, kalemGun }
  from "./kampanya.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 gorulen = ADIM.filter((s) => s.denetim);
const pencereGun = gorulen.reduce((t, s) => t + s.gun, 0);
const pencereKayit = gorulen.reduce((t, s) => t + s.gun * s.iz, 0);

console.log(`${ADIM.length} adim, ${SURE} gun; ${gorulen.length} adimda denetim var, ` +
  `${ADIM.length - gorulen.length} adim hicbir denetimin gormedigi adim; ` +
  `denetimli gun ${pencereGun} (%${((pencereGun / SURE) * 100).toFixed(1)}), ` +
  `denetimli kayit ${pencereKayit}`);

const A = [-18, 6, 5, 22, 7, 10, 12, 8];
console.log("\n1. adim adim sure ve firsat penceresi");
yaz(A, "adim", "gun", "iz", "denetim", "esik", "uretilen", "uyari gunu", "kalem");
for (let i = 0; i < ADIM.length; i++) {
  const s = ADIM[i], u = uyariGunu(i);
  yaz(A, s.ad, s.gun, s.iz, s.denetim || "-", s.esik || "-", s.gun * s.iz,
    u === null ? (s.denetim ? "esik yok" : "-") : u, s.kalem);
}
console.log(`esige varan denetim: ${ADIM.filter((_, i) => uyariGunu(i) !== null).length}/` +
  `${gorulen.length}; ilk tespit gunu ${ilkTespit()}`);

const B = [-30, 8, 13, 9, 15];
console.log("\n2. surenin nerede toplandigi");
yaz(B, "kume", "gun", "sure payi %", "kayit", "kalem artisi");
for (const [ad, k] of [["denetimi olan adimlar", gorulen],
  ["hicbir denetimin gormedigi", ADIM.filter((s) => !s.denetim)],
  ["en uzun iki adim", [...ADIM].sort((x, y) => y.gun - x.gun).slice(0, 2)]]) {
  const g = k.reduce((t, s) => t + s.gun, 0);
  const art = k.reduce((t, s) => {
    const i = ADIM.indexOf(s);
    return t + s.kalem - (i === 0 ? 0 : ADIM[i - 1].kalem);
  }, 0);
  yaz(B, ad, g, ((g / SURE) * 100).toFixed(1), k.reduce((t, s) => t + s.gun * s.iz, 0), art);
}

const C = [-40, 12, 14, 8, 12];
console.log("\n3. tespit gunu ne zaman, o gune kadar kac kalem");
yaz(C, "ayar", "tespit gunu", "yerlesik gun", "kalem", "kurtarilan");
const SENARYO = [
  ["esikler oldugu gibi", {}],
  ["yetki esigi 180 -> 300", { "yetki-yukseltme": { esik: 300 } }],
  ["yetki esigi 300 + yanal gecise denetim", { "yetki-yukseltme": { esik: 300 },
    "yanal-gecis": { denetim: "oturum-sicramasi", esik: 60 } }],
  ["kesife denetim (esik 30)", { kesif: { denetim: "dis-sorgu-hacmi", esik: 30 } }],
  ["hicbir denetim uyarmaz", { "yetki-yukseltme": { esik: 300 }, sizdirma: { esik: 300 } }],
];
for (const [ad, ayar] of SENARYO) {
  const g = ilkTespit(ayar) ?? SURE;
  yaz(C, ad, ilkTespit(ayar) ?? "-", g < TUTUNMA ? "tutunma yok" : g - TUTUNMA,
    kalemGun(g), ADIM.at(-1).kalem - kalemGun(g));
}

const D = [-18, 6, 14, 12, 16];
console.log("\n4. gecikmenin kalem hizi");
yaz(D, "adim", "gun", "kalem artisi", "kalem/gun", "30 gun gecikme");
for (let i = 0; i < ADIM.length; i++) {
  const onceki = i === 0 ? 0 : ADIM[i - 1].kalem, art = ADIM[i].kalem - onceki;
  yaz(D, ADIM[i].ad, ADIM[i].gun, art, (art / ADIM[i].gun).toFixed(3),
    Math.min(art, Math.floor((art / ADIM[i].gun) * 30)));
}
const t0 = ilkTespit(), t1 = ilkTespit({ "yetki-yukseltme": { esik: 300 } });
console.log(`tek bir esigin 180'den 300'e cikmasi tespiti ${t0}. gunden ${t1}. gune tasir: ` +
  `yerlesik gun ${t0 - TUTUNMA} -> ${t1 - TUTUNMA}, kalem ${kalemGun(t0)} -> ${kalemGun(t1)}`);
```

```
8 adim, 330 gun; 5 adimda denetim var, 3 adim hicbir denetimin gormedigi adim; denetimli gun 69 (%20.9), denetimli kayit 468

1. adim adim sure ve firsat penceresi
adim                 gun   iz               denetim   esik  uretilen  uyari gunu   kalem
kesif                 45    1                     -      -        45           -       0
ilk-erisim            12    4        kimlik-gunlugu     60        48    esik yok       1
yurutme                2    9           surec-kaydi     30        18    esik yok       2
kalicilik              3    2    baslatma-envanteri     10         6    esik yok       3
yetki-yukseltme       38    6     yetki-degisikligi    180       228          92       9
yanal-gecis           96    3                     -      -       288           -      26
toplama              120    2                     -      -       240           -      41
sizdirma              14   12           cikis-hacmi    100       168         325      48
esige varan denetim: 2/5; ilk tespit gunu 92

2. surenin nerede toplandigi
kume                               gun  sure payi %    kayit   kalem artisi
denetimi olan adimlar               69         20.9      468             16
hicbir denetimin gormedigi         261         79.1      573             32
en uzun iki adim                   216         65.5      528             32

3. tespit gunu ne zaman, o gune kadar kac kalem
ayar                                     tespit gunu  yerlesik gun   kalem  kurtarilan
esikler oldugu gibi                               92            47       7          41
yetki esigi 180 -> 300                           325           280      45           3
yetki esigi 300 + yanal gecise denetim           120            75      12          36
kesife denetim (esik 30)                          30   tutunma yok       0          48
hicbir denetim uyarmaz                             -           285      48           0

4. gecikmenin kalem hizi
adim                 gun  kalem artisi   kalem/gun  30 gun gecikme
kesif                 45             0       0.000               0
ilk-erisim            12             1       0.083               1
yurutme                2             1       0.500               1
kalicilik              3             1       0.333               1
yetki-yukseltme       38             6       0.158               4
yanal-gecis           96            17       0.177               5
toplama              120            15       0.125               3
sizdirma              14             7       0.500               7
tek bir esigin 180'den 300'e cikmasi tespiti 92. gunden 325. gune tasir: yerlesik gun 47 -> 280, kalem 7 -> 45
```

Sayılar **ölçüm** sınıfındadır; girdileri TM4–TM6'dır.

#### Üç Yüz Otuz Günün Yüzde Yetmiş Dokuzu Karanlıkta

Zincirin toplam süresi **330 gündür** ve bu sürenin adımlara dağılımı düz değildir. Yürütme iki
gün, kalıcılık üç gün sürer; yanal geçiş 96, toplama 120 gündür. İki adım tek başına sürenin
**%65,5'ini** taşır.

Denetim dağılımı sürenin tersidir. Sekiz adımın beşinde bir denetim vardır, üçünde yoktur — ve
denetimsiz üç adım, en uzun ikisini içerir. Denetimi olan adımlar toplam **69 gün** sürer, yani
sürenin %20,9'u; hiçbir denetimin görmediği adımlar **261 gün**, yani %79,1. Bir kampanyanın
uzunluğu tek başına savunmaya zaman kazandırmaz: kazanılan zaman yalnız denetimli günlerdir.

İkinci tablonun son sütunu bunu keskinleştirir. Denetimli 69 gün boyunca erişilen kalem artışı
**16**, denetimsiz 261 gün boyunca **32**'dir. Kalemlerin üçte ikisi, hiç bakılmayan zaman
diliminde toplanır. Kayıt sayısı da aynı yöndedir: denetimsiz adımlar 573 kayıt üretir ve bu
kayıtların hiçbiri bir denetime düşmez.

#### Var Olan Denetim Uyarmayan Denetim Olabilir

Birinci tablonun **uyarı günü** sütunu, denetimin varlığı ile işleyişi arasındaki farkı yazar.
Beş denetimden üçü "eşik yok" satırıdır: denetim tanımlıdır, adımın kayıtlarını görür, ama adım
eşiğe varacak kadar kayıt üretmeden biter. İlk erişim 12 günde 48 kayıt üretir, eşiği 60'tır.
Yürütme iki günde 18 kayıt üretir, eşiği 30'dur. Kalıcılık üç günde 6 kayıt üretir, eşiği 10'dur.

Bu üç satır aynı kusurun üç örneğidir: **eşik, adımın süresine göre değil kayıt hacmine göre
konmuştur**. Kısa adımlar yüksek eşiğe hiç varamaz. Denetim envanterinde beş kalem görünür,
işleyen iki kalem vardır. Kapsama sayımı adım sayısıyla yapılırsa 5/8 yazılır; eşiğe varmayı da
sayan bir kapsama ölçüsü **2/8** yazar.

İlk uyarı 92. gündedir ve yetki yükseltme adımındaki denetimden gelir: adım 62. günde başlar,
günde 6 kayıt üretir, 180 kayıtlık eşiğe 30 günde varır. O gün erişilmiş kalem sayısı **7**'dir
ve kampanya 47 gündür yerleşiktir. **Yerleşik kalma süresi**, ilk erişim adımının başladığı gün
ile tespit günü arasındaki farktır.

#### Bir Eşiğin İki Yüz Otuz Üç Günlük Bedeli

Üçüncü tablo tek bir ayarı değiştirir. Yetki değişikliği denetiminin eşiği 180'den 300'e
çıkarılırsa — uyarı sayısını azaltmak için yapılan sıradan bir ayar — o adım 228 kayıt ürettiği
için eşiğe hiç varmaz. Uyarma görevi zincirin **son adımına** düşer: çıkış hacmi denetimi 325.
günde uyarır.

Sonuç üç sayıda birden görünür. Tespit günü 92'den 325'e çıkar, yerleşik kalma süresi 47 günden
**280 güne**, erişilen kalem 7'den **45'e**. Kurtarılan kalem 41'den 3'e iner. Tek bir eşik
değeri, tek bir denetimde, **38 kalem** ve 233 gün fark eder. Eşik ayarı bir uyarı hacmi kararı
gibi görünür; ölçüldüğünde bir kalem kararıdır.

Üçüncü satır telafiyi dener: eşik 300'de kalır ama yanal geçiş adımına bir denetim eklenir. O
adım günde 3 kayıt üretir, 60 kayıtlık eşiğe 20 günde varır ve tespit 120. güne çeker — 12 kalem,
36 kurtarılan. Kaybedilen 38 kalemin 33'ü geri alınır, hepsi değil. **Hiç bakılmayan bir adıma
denetim koymak, bozulan bir eşiği tam olarak telafi etmez.**

Dördüncü satır zincirin başına gider. Keşif adımına 30 kayıtlık eşikli bir denetim konursa uyarı
30. günde gelir — ilk erişim adımı 45. günde başladığı için **tutunma hiç doğmaz** ve 48 kalemin
tamamı kurtulur. Keşif adımı 45 gün sürer ve günde yalnız 1 kayıt üretir; bu adımı izlemenin
bedeli, dışarıdan gelen sorgu hacmini ayrıştıracak bir ölçüm kurmaktır. Beşinci satır ters uçtur:
hiçbir denetim uyarmazsa kampanya 285 gün yerleşik kalır ve 48 kalemin tamamına erişir.

#### Yerleşik Kalınan Her Gün

Dördüncü tablo gecikmeyi bir hıza çevirir. En yüksek kalem hızı yürütme ve sızdırma adımlarındadır:
günde 0,500 kalem. En düşük hız 0,083 ile ilk erişimdedir; keşifte kalem artışı hiç yoktur. Ama
hız tek başına bedeli vermez, çünkü hızın çarpıldığı süre adımdan adıma altmış kat değişir.

Son sütun bunu birleştirir: her adımda otuz günlük bir gecikmenin kalem karşılığı. Yürütmede 1,
kalıcılıkta 1, yetki yükseltmede 4, yanal geçişte **5**, toplamada 3 kalemdir. Kısa adımlarda otuz
gün beklemek mümkün değildir — adım zaten iki gün sürer ve artışı 1 kalemle sınırlıdır. Uzun
adımlarda ise otuz gün, adımın küçük bir dilimidir ve o dilim bile birkaç kalem taşır.

Buradan çıkan sıra, denetim yerleştirmenin süre ekseninden okunuşudur. Bir denetimi kısa bir adıma
koymak, uyarma penceresini o adımın süresiyle sınırlar: iki günde eşiğe varmayan bir denetim hiç
uyarmaz. Uzun bir adıma koymak ise pencereyi genişletir ama gecikmenin bedelini de büyütür.
**Süre ekseninde en değerli denetim, uzun bir adımın başında eşiğe varabilen denetimdir** — yanal
geçiş satırındaki 20 günlük uyarı süresi buna örnektir.

#### Özet

- 330 günlük sekiz adımlık dizide denetimi olan adımlar 69 gün (%20,9), hiçbir denetimin görmediği
  adımlar 261 gün (%79,1) sürer; en uzun iki adım sürenin %65,5'ini taşır ve ikisi de denetimsizdir.
- Kalem artışının üçte ikisi denetimsiz günlerde toplanır: denetimli 69 günde 16, denetimsiz 261
  günde 32 kalem.
- Denetimin varlığı uyarması demek değildir: beş denetimden üçü, adım eşiğe varacak kadar kayıt
  üretmeden bittiği için hiç uyarmaz. Adım sayısıyla kapsama 5/8, eşiğe varmayla 2/8'dir.
- İlk tespit 92. gündedir; o gün 7 kaleme erişilmiş ve yerleşik kalma süresi 47 gün olmuştur.
- Tek bir denetimin eşiği 180'den 300'e çıkarsa tespit 325. güne kayar: yerleşik gün 47'den 280'e,
  kalem 7'den 45'e çıkar. Aynı ayar geri alınmadan yanal geçişe denetim eklemek 33 kalem kurtarır.
- Otuz günlük gecikmenin bedeli adıma göre 0 ile 7 kalem arasındadır; keşif adımına konan bir
  denetim tutunmayı hiç doğurmadan 48 kalemin tamamını kurtarır.

#### Sonraki Adım

İki ders zinciri iki ayrı eksenden ölçtü: aktörün yeteneği kaç adım geçtiğini, adımın süresi kaç
fırsat penceresi doğduğunu belirledi. Her ikisinde de zincirin kendisi verili kabul edildi — sekiz
adım, sabit sıra, her adım bir öncekinin ardından.

Oysa zincirin asıl yapısı sıralamada değil **önkoşullarda**dır. Bir adım neyi gerektirir, o
gereklilik sağlanmadan sonraki adım neden olmaz, hangi adım atlanabilir ve hangisi atlanamaz.
Önkoşullar yazıldığında her adımın karşısına bir denetim noktası konabilir ve o zaman asıl soru
sorulabilir: zincir hangi adımda kırılıyor, kırılmadığında ne oluyor ve **bir adım erken kırmanın
kazancı kaç kalem**. Sonraki ders bu kursun ölçü birimini kurar ve erken kırma kazancını hesaplar.

### Saldırı Yaşam Döngüsü

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/saldiri-yasam-dongusu

Kursun ölçü biriminin kurulması: sekiz adımın önkoşullarıyla yazılması, beş ortam koşulundan birinin kaldırılmasının zinciri kesin olarak kesmesi, kırılmadan sona varılırsa 48 kalem erişilirken beklenen kalemin 20,14 olması, hiç kırılmadan sona varan payın (0,2384) beklenen toplamın yarısından fazlasını taşıması, ortam koşulu kaldırmanın 20,14 ile 1,67 kalem arasında değişen kesin kazanç vermesi ve aynı denetim kaleminin sekiz adıma tek tek konmasının 7,05'ten 0,58 kaleme inen bir erken kırma kazancı üretmesi.

İki ders zinciri iki ayrı eksenden ölçtü: aktörün yeteneği kaç adım geçildiğini, adımın süresi kaç
fırsat penceresi doğduğunu belirledi. Her ikisinde de zincirin kendisi verili kabul edildi — sekiz
adım, sabit sıra, her adım bir öncekinin ardından.

Zincirin asıl yapısı sıralamada değil **önkoşullarda**dır. Bir adım neye ihtiyaç duyar, o ihtiyaç
karşılanmazsa sonraki adım neden olmaz. Bu ders zinciri önkoşullarıyla kurar ve kursun ölçü
birimini tanımlar: **erken kırma kazancı**, aynı savunmanın zincirde bir adım öne alınmasıyla
kurtarılan kalem sayısıdır.

#### Adım Neye İhtiyaç Duyar

Aşağıdaki yapı bir **modeldir**; adımın nasıl yapıldığı hiçbir yerde yazılmaz, yalnız **neye
ihtiyaç duyduğu** ve **neyi sağlar hale getirdiği** yazılır. Kurgu ölçüm ağı üzerinde çalışılır.

**TM7:** ortam koşulları saldırganın üretmediği, savunmanın kaldırabildiği koşullardır. **TM8:**
her adım önkoşulları sağlandığında yürünebilir; denetim varsa bir yakalama olasılığıyla zinciri
orada kırar. **TM9:** bir adım ancak bütün önkoşulları sağlanmışsa yürünebilir; ilk sağlanamayan
adım zinciri yapısal olarak keser ve sonraki adımların hiçbiri yürünemez.

```js
// tehdit/dongu.mjs — saldiri yasam dongusunun onkosul modeli: burada calisan bir saldiri adimi
// yoktur. Her adim "neye ihtiyac duydugu" (onkosul) ve "neyi saglar hale getirdigi" (uretir)
// ile yazilir; adimin nasil yapildigi yazilmaz. Rastgelelik yok, bekleyen deger hesaplanir.

// TM7: ortam kosullari, saldirganin uretmedigi, savunmanin kaldirabildigi kosullardir.
export const ORTAM = ["dis-gorunur-kalem", "acik-giris-ucu", "yerel-zayif-yapilandirma",
  "duz-ag", "dis-cikis-yolu"];

// TM8: her adim onkosullari saglandiginda yurunebilir; denetim varsa `yakalama` olasiligiyla
// zinciri orada kirar. `kalem`, adim tamamlaninca erisilmis olan birikimli kurgu kalem sayisi.
export const ADIM = [
  { ad: "kesif", onkosul: ["dis-gorunur-kalem"], uretir: "hedef-listesi",
    denetim: null, yakalama: 0, kalem: 0 },
  { ad: "ilk-erisim", onkosul: ["hedef-listesi", "acik-giris-ucu"], uretir: "gecerli-kimlik",
    denetim: "kimlik-gunlugu", yakalama: 0.15, kalem: 1 },
  { ad: "yurutme", onkosul: ["gecerli-kimlik"], uretir: "kod-calistirma",
    denetim: "surec-kaydi", yakalama: 0.25, kalem: 2 },
  { ad: "kalicilik", onkosul: ["kod-calistirma"], uretir: "yeniden-baslatmada-surer",
    denetim: "baslatma-envanteri", yakalama: 0.2, kalem: 3 },
  { ad: "yetki-yukseltme", onkosul: ["kod-calistirma", "yerel-zayif-yapilandirma"],
    uretir: "yonetici-yetkisi", denetim: "yetki-degisikligi", yakalama: 0.15, kalem: 9 },
  { ad: "yanal-gecis", onkosul: ["yonetici-yetkisi", "duz-ag"], uretir: "komsu-erisimi",
    denetim: null, yakalama: 0, kalem: 26 },
  { ad: "toplama", onkosul: ["komsu-erisimi"], uretir: "toplu-veri",
    denetim: null, yakalama: 0, kalem: 41 },
  { ad: "sizdirma", onkosul: ["toplu-veri", "dis-cikis-yolu"], uretir: "etki",
    denetim: "cikis-hacmi", yakalama: 0.45, kalem: 48 },
];

// TM9: bir adim ancak butun onkosullari saglanmissa yurunebilir; ilk saglanamayan adim
// zinciri yapisal olarak keser ve sonraki adimlarin hicbiri yurunemez.
export function yurunebilir(kaldirilan = []) {
  const saglanan = new Set(ORTAM.filter((k) => !kaldirilan.includes(k)));
  let n = 0;
  for (const s of ADIM) {
    if (!s.onkosul.every((k) => saglanan.has(k))) break;
    saglanan.add(s.uretir);
    n++;
  }
  return n;
}

// Beklenen kalem: zincir i. adimda kirilirsa o ana kadar erisilmis kalem kalem(i-1)'dir.
// Kirilma olasiligi, onceki adimlarin kacirma olasiliklarinin carpimi ile o adimin yakalamasidir.
export function beklenenKalem(kaldirilan = [], ek = {}) {
  const son = yurunebilir(kaldirilan);
  let kalan = 1, toplam = 0;
  for (let i = 0; i < son; i++) {
    const p = 1 - (1 - ADIM[i].yakalama) * (1 - (ek[ADIM[i].ad] || 0));
    toplam += kalan * p * (i === 0 ? 0 : ADIM[i - 1].kalem);
    kalan *= 1 - p;
  }
  return toplam + kalan * (son === 0 ? 0 : ADIM[son - 1].kalem);
}
```

```js
// tehdit/kazanc.mjs — zincir hangi halkada kirilabiliyor ve erken kirmanin kazanci kac kalem.
import { ORTAM, ADIM, yurunebilir, beklenenKalem } from "./dongu.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 TABAN = beklenenKalem();
const denetimsiz = ADIM.filter((s) => !s.denetim);

console.log(`${ADIM.length} adim, ${ORTAM.length} ortam kosulu; ` +
  `${ADIM.length - denetimsiz.length} adimda denetim var, ${denetimsiz.length} adim ` +
  `hicbir denetimin gormedigi adim (${denetimsiz.map((s) => s.ad).join(", ")}); ` +
  `kirilmadan erisilen kalem ${ADIM.at(-1).kalem}, beklenen kalem ${TABAN.toFixed(2)}`);

const A = [-18, -42, -26, 20, 10, 7];
console.log("\n1. her adim neye ihtiyac duyuyor, ne saglar hale getiriyor");
yaz(A, "adim", "onkosul", "uretir", "denetim", "yakalama", "kalem");
for (const s of ADIM)
  yaz(A, s.ad, s.onkosul.join(" + "), s.uretir, s.denetim || "-",
    s.denetim ? s.yakalama.toFixed(2) : "-", s.kalem);

const B = [-26, -18, 12, 15, 11];
console.log("\n2. yapisal kirma: bir ortam kosulu kaldirilirsa");
yaz(B, "kaldirilan kosul", "imkansiz adim", "yurunen adim", "beklenen kalem", "kazanc");
for (const k of ORTAM) {
  const n = yurunebilir([k]), e = beklenenKalem([k]);
  yaz(B, k, ADIM[n].ad, n, e.toFixed(2), (TABAN - e).toFixed(2));
}

const C = [-18, 10, 14, 17, 13, 13];
console.log("\n3. olasilikli kirma: zincir hangi adimda kiriliyor");
yaz(C, "adim", "yakalama", "buraya varan", "burada kirilan", "o ana kalem", "katki");
let kalan = 1, toplam = 0;
for (let i = 0; i < ADIM.length; i++) {
  const p = ADIM[i].yakalama, kirilan = kalan * p, once = i === 0 ? 0 : ADIM[i - 1].kalem;
  toplam += kirilan * once;
  yaz(C, ADIM[i].ad, p.toFixed(2), kalan.toFixed(4), kirilan.toFixed(4), once,
    (kirilan * once).toFixed(3));
  kalan -= kirilan;
}
console.log(`hic kirilmadan sona varan pay ${kalan.toFixed(4)} x ${ADIM.at(-1).kalem} kalem = ` +
  `${(kalan * ADIM.at(-1).kalem).toFixed(3)}; beklenen kalem toplami ` +
  `${(toplam + kalan * ADIM.at(-1).kalem).toFixed(2)}`);

const D = [-18, 10, 16, 10, 23];
console.log("\n4. erken kirma kazanci: ayni denetim kalemi (yakalama 0.35) hangi adima konursa");
yaz(D, "konan adim", "onceki", "beklenen kalem", "kazanc", "bir onceki adima gore");
let oncekiKazanc = null;
for (const s of ADIM) {
  const e = beklenenKalem([], { [s.ad]: 0.35 }), kazanc = TABAN - e;
  yaz(D, s.ad, s.denetim ? s.yakalama.toFixed(2) : "yok", e.toFixed(2), kazanc.toFixed(2),
    oncekiKazanc === null ? "-" : (kazanc - oncekiKazanc).toFixed(2));
  oncekiKazanc = kazanc;
}
const enIyi = ADIM.map((s) => ({ ad: s.ad, k: TABAN - beklenenKalem([], { [s.ad]: 0.35 }) }))
  .sort((x, y) => y.k - x.k);
console.log(`en yuksek kazanc ${enIyi[0].ad} (${enIyi[0].k.toFixed(2)} kalem), en dusuk ` +
  `${enIyi.at(-1).ad} (${enIyi.at(-1).k.toFixed(2)}); denetimsiz uc adimin en iyisi ` +
  `${enIyi.find((x) => denetimsiz.some((s) => s.ad === x.ad)).ad}`);
```

```
8 adim, 5 ortam kosulu; 5 adimda denetim var, 3 adim hicbir denetimin gormedigi adim (kesif, yanal-gecis, toplama); kirilmadan erisilen kalem 48, beklenen kalem 20.14

1. her adim neye ihtiyac duyuyor, ne saglar hale getiriyor
adim              onkosul                                   uretir                                 denetim  yakalama  kalem
kesif             dis-gorunur-kalem                         hedef-listesi                                -         -      0
ilk-erisim        hedef-listesi + acik-giris-ucu            gecerli-kimlik                  kimlik-gunlugu      0.15      1
yurutme           gecerli-kimlik                            kod-calistirma                     surec-kaydi      0.25      2
kalicilik         kod-calistirma                            yeniden-baslatmada-surer    baslatma-envanteri      0.20      3
yetki-yukseltme   kod-calistirma + yerel-zayif-yapilandirma yonetici-yetkisi             yetki-degisikligi      0.15      9
yanal-gecis       yonetici-yetkisi + duz-ag                 komsu-erisimi                                -         -     26
toplama           komsu-erisimi                             toplu-veri                                   -         -     41
sizdirma          toplu-veri + dis-cikis-yolu               etki                               cikis-hacmi      0.45     48

2. yapisal kirma: bir ortam kosulu kaldirilirsa
kaldirilan kosul          imkansiz adim     yurunen adim beklenen kalem     kazanc
dis-gorunur-kalem         kesif                        0           0.00      20.14
acik-giris-ucu            ilk-erisim                   1           0.00      20.14
yerel-zayif-yapilandirma  yetki-yukseltme              4           2.00      18.14
duz-ag                    yanal-gecis                  5           4.60      15.54
dis-cikis-yolu            sizdirma                     7          18.47       1.67

3. olasilikli kirma: zincir hangi adimda kiriliyor
adim                yakalama  buraya varan   burada kirilan  o ana kalem        katki
kesif                   0.00        1.0000           0.0000            0        0.000
ilk-erisim              0.15        1.0000           0.1500            0        0.000
yurutme                 0.25        0.8500           0.2125            1        0.212
kalicilik               0.20        0.6375           0.1275            2        0.255
yetki-yukseltme         0.15        0.5100           0.0765            3        0.229
yanal-gecis             0.00        0.4335           0.0000            9        0.000
toplama                 0.00        0.4335           0.0000           26        0.000
sizdirma                0.45        0.4335           0.1951           41        7.998
hic kirilmadan sona varan pay 0.2384 x 48 kalem = 11.444; beklenen kalem toplami 20.14

4. erken kirma kazanci: ayni denetim kalemi (yakalama 0.35) hangi adima konursa
konan adim            onceki  beklenen kalem    kazanc  bir onceki adima gore
kesif                    yok           13.09      7.05                      -
ilk-erisim              0.15           13.09      7.05                   0.00
yurutme                 0.25           13.39      6.75                  -0.30
kalicilik               0.20           13.61      6.53                  -0.22
yetki-yukseltme         0.15           13.79      6.35                  -0.18
yanal-gecis              yok           14.70      5.44                  -0.91
toplama                  yok           17.28      2.86                  -2.58
sizdirma                0.45           19.56      0.58                  -2.28
en yuksek kazanc kesif (7.05 kalem), en dusuk sizdirma (0.58); denetimsiz uc adimin en iyisi kesif
```

Sayılar **ölçüm** sınıfındadır; girdileri TM7–TM9'dur.

#### Önkoşul Sütunu Zincirin Kendisidir

Birinci tablonun ikinci sütunu bu dersin taşıyıcısıdır. Her adım ne yaptığıyla değil, **neyin var
olmasını gerektirdiğiyle** yazılır. Yürütme adımı geçerli kimlik ister; kalıcılık adımı kod
çalıştırma ister; yanal geçiş hem yönetici yetkisi hem düz ağ ister. Adımın hangi yöntemle
yapıldığı burada hiç geçmez ve geçmesi de gerekmez — savunma tarafının kararı için gereken tek
bilgi ihtiyaç listesidir.

Üçüncü sütun eşleşmeyi kapatır: her adım bir koşul üretir ve o koşul sonraki adımın önkoşulunda
yer alır. Zincir bu yüzden bir sıra değil, bir **bağımlılık dizisidir**. Sıra bozulamaz, çünkü
her adımın girdi koşulu bir öncekinden gelir.

Önkoşullar iki kaynaktan doldurulur. Bir kısmı zincirin kendi ürettiği koşullardır; kalanı
**ortam koşullarıdır** — dışarıdan görünen kalem, açık giriş ucu, yerel zayıf yapılandırma, düz ağ
ve dış çıkış yolu. Beş ortam koşulunun hiçbirini saldıran taraf üretmez; hepsi savunma tarafının
elindedir. Bu ayrım bir sonraki tablonun tamamını belirler.

#### İki Ayrı Kırma Biçimi

Zincir iki şekilde kırılabilir ve ikisi ölçü olarak birbirine benzemez.

**Yapısal kırma** bir önkoşulu ortadan kaldırır. İkinci tablo beş ortam koşulunu tek tek kaldırır
ve hangi adımın imkânsız hale geldiğini yazar. Dışarıdan görünen kalem kaldırılırsa keşif adımı
yürünemez ve zincir hiç başlamaz; açık giriş ucu kaldırılırsa ilk erişim yürünemez. Her iki
durumda beklenen kalem **0,00**'dır ve kazanç 20,14 kalemin tamamıdır. Yerel zayıf yapılandırmanın
kaldırılması zinciri dördüncü adımdan sonra keser (2,00 kalem), düz ağın kaldırılması beşinci
adımdan sonra (4,60), dış çıkış yolunun kaldırılması ise yedinci adımdan sonra — beklenen kalem
**18,47** ve kazanç yalnız 1,67.

Aynı türden bir hamlenin değeri, zincirin neresinde uygulandığına göre **on iki kat** değişir.
Dış çıkış yolunu kapatmak, toplamanın tamamlanmasına izin verdiği için 41 kalemi zaten kaybettirmiş
olur.

**Olasılıklı kırma** ise adımı yürünebilir bırakır ve bir denetimin görmesini bekler. Üçüncü tablo
bunu yürütür: her adıma varan pay, orada kırılan pay ve o ana kadar erişilmiş kalem. Beş denetimin
yakalama oranları 0,15 ile 0,45 arasındadır; bunların hiçbiri kesin değildir. Zincirin sonuna hiç
kırılmadan varan pay **0,2384**'tür ve tek başına 11,44 kalem taşır — beklenen 20,14 kalemin
yarısından fazlası. **Beş denetimli bir zincirde en büyük tek kalem, hiç kırılmama payıdır.**

Beklenen kalem sayısı bir tahmin değil, girdilerden türetilen bir toplamdır: her satırın katkısı
o adımda kırılma payı ile o ana kadar erişilmiş kalemin çarpımıdır ve sekiz satırın toplamı
20,14'tür. Model iki şeyi varsayar — denetimlerin birbirinden bağımsız olduğu ve bir denetimin
gördüğü anda zinciri durdurduğu. İkisi de iyimser varsayımlardır; gerçek bir kurulumda uyarının
görülmesi ile yanıt verilmesi arasında geçen süre kalem sayısını daha da büyütür. Bu yüzden 20,14
sayısı bir üst sınır değil, **alt sınırdır**.

#### Denetimsiz Üç Adım

Üçüncü tablonun en dikkat çekici satırları yanal geçiş ve toplamadır. İkisinin de yakalama oranı
0,00'dır, ikisi de hiçbir zinciri kırmaz — ama ikisi zincirin kalem sayısını 3'ten **41'e**
çıkarır. Kalem artışının %79'u, hiçbir denetimin bakmadığı iki adımda olur.

Bu, savunma tarafında sık görülen bir dağılımın sonucudur. Denetimler kaydı bol olan adımlara
konur: kimlik girişleri, süreç başlatmaları, yetki değişiklikleri. Yanal geçiş ve toplama adımları
kendi başlarına yeni bir kayıt türü doğurmaz; zaten var olan yetkilerle, zaten var olan yollardan
yürünür. **Denetim, olayın gürültüsünü izler; kalem ise sessiz adımlarda birikir.**

Keşif adımı üçüncü denetimsiz adımdır ama ters uçtadır: kalem sayısını hiç artırmaz, çünkü henüz
hiçbir şeye dokunulmamıştır. Denetimsizlik aynı sözcüktür, sonucu iki farklı yerde iki farklı
şeydir.

#### Erken Kırma Kazancı

Dördüncü tablo bu kursun ölçü birimini tanımlar. Elde tek bir denetim kalemi vardır — yakalama
oranı 0,35 — ve sekiz adıma tek tek konur. Her satırda beklenen kalem yeniden hesaplanır; kazanç,
tabandan olan farktır.

Kazanç sırası şudur: 7,05, 7,05, 6,75, 6,53, 6,35, 5,44, 2,86, 0,58. **Aynı denetim, zincirin
başında sonundakinin on iki katı kadar kalem kazandırır.** İlk iki satırın eşitliği yapısaldır:
keşifte ya da ilk erişimde kırmak aynı sonucu verir, çünkü ikisinde de henüz hiçbir kaleme
dokunulmamıştır.

Son sütun bir adım gecikmenin bedelini ayrı ayrı verir. Zincirin ilk beş adımında bu bedel küçüktür
— 0,00 ile 0,30 arasında. Yanal geçişte 0,91, toplamada **2,58**, sızdırmada 2,28'dir. Kayıp
düzgün dağılmaz: ilk beş adımda gecikmek neredeyse bedava, altıncıda bedel beş katına çıkıp
0,91'e, yedincide 2,58'e varıyor ve sekizincide 2,28'de kalıyor. Sıralama tesadüf değildir; kalem
sayısı da tam orada 3'ten 26'ya sıçrar.

Denetimsiz üç adım arasında en iyi seçim keşiftir (7,05), en kötüsü toplamadır (2,86). Elde tek
bir denetim kalemi olan bir ekip için karar burada yazılıdır: hiç bakılmayan üç adımdan **en
erkenine** koymak, en geç olanına koymanın 2,5 katı kalem kurtarır.

Yine de dördüncü tablonun en yüksek satırı, ikinci tablonun en güçlü satırının ancak üçte birine
ulaşır.
En iyi denetim yerleştirmesi 7,05 kalem kazandırır; en zayıf yapısal kırma 1,67, ama en güçlüsü
**20,14** kazandırır. Bir önkoşulu kaldırmak kesin, bir denetim koymak olasılıklıdır. Ölçü birimi
aynıdır, büyüklük sınıfı değildir.

#### Özet

- Saldırı yaşam döngüsü adımların nasıl yapıldığıyla değil, **neye ihtiyaç duyduklarıyla** yazılır;
  her adım bir koşul üretir ve o koşul sonraki adımın önkoşuludur.
- Beş önkoşul saldıranın üretmediği ortam koşullarıdır; birini kaldırmak zinciri **kesin** olarak
  keser ve kazanç 20,14 ile 1,67 kalem arasında değişir — aynı hamle zincirin başında on iki kat
  değerlidir.
- Beş denetimin yakalama oranı 0,15 ile 0,45 arasındadır; zincirin sonuna hiç kırılmadan varan pay
  0,2384'tür ve 11,44 kalem taşır, yani beklenen 20,14 kalemin yarısından fazlası.
- Üç adım hiçbir denetimin görmediği adımdır; ikisi (yanal geçiş, toplama) kalem sayısını 3'ten
  41'e çıkarır, yani artışın %79'unu taşır.
- Erken kırma kazancı bu kursun ölçü birimidir: aynı denetim kalemi sekiz adıma tek tek konduğunda
  7,05'ten 0,58 kaleme inen bir kazanç dizisi verir.
- Bir adım geç kırmanın bedeli ilk beş adımda 0,30 kalemin altındadır, beşinciden sonra 0,91, 2,58
  ve 2,28 kalemdir; kalem sayısının 3'ten 26'ya sıçradığı yerde bedel de sıçrar.

#### Sonraki Adım

Bu ders sekiz adımı ve her adımın karşısındaki tek denetimi ölçtü. Gerçekte bir adımın karşısında
tek bir denetim değil, o adımın **kaç ayrı biçimde** yürünebildiği kadar denetim gerekir. Yanal
geçiş bir satırdır burada; oysa altında birbirinden bağımsız birçok teknik vardır ve bir denetim
bunların yalnız bir bölümünü görür.

Saldırgan davranışını sınıflandıran çalışmalar tam bu boşluğu doldurmak için kurulmuştur: adımlar
sütun, teknikler satır olarak dizilir ve her hücreye bir denetim eşlenir. Sonraki ders bu yapıyı
kurar ve tek soruyu sorar: kapsama yüzdesi yükselirken **hiç denetimi olmayan adım** sayısı
düşüyor mu, yoksa kapsama yalnız zaten görülen adımlarda mı büyüyor.

### Saldırgan Davranış Sınıflandırmaları

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/saldirgan-davranis-siniflandirmalari

Tekniklerin adımlara eşlenmesi ve hiç denetimi olmayan adımın sayılması: 8 taktik ile 27 teknik sınıfının 10.800 zincir üretmesi, beş denetim kaleminin tekniklerin %40,7'sini örtmesi, üç adımın hiçbir denetimin görmediği adım kalması, zincirlerin %80'inin ilk iki adımda kırılmasına karşın 72 zincirin (%0,67) hiçbir halkada kırılamaması, en geç kırılan %1,33'lük dilimin ortalama kalemin %42,6 payını taşıması ve aynı kapsama yüzdesini (%51,9) veren iki müdahalenin 1,39 ile 0,47 kalem gibi üç kat farklı kazanç üretmesi.

Önceki ders sekiz adımı ve her adımın karşısındaki tek denetimi ölçtü. Gerçekte bir adımın
karşısında tek bir denetim değil, o adımın **kaç ayrı biçimde** yürünebildiği kadar denetim
gerekir. Yanal geçiş orada bir satırdı; altında birbirinden bağımsız birçok teknik sınıfı vardır
ve bir denetim bunların yalnız bir bölümünü görür.

Saldırgan davranışını sınıflandıran çalışmalar tam bu boşluk için kurulmuştur. Yapı her zaman
aynıdır: **adımlar sütun, teknik sınıfları satır** olur ve her hücreye bir denetim eşlenir. Bu ders
o yapıyı kurar ve tek soruyu sorar: kapsama yüzdesi yükselirken **hiç denetimi olmayan adım**
sayısı düşüyor mu, yoksa kapsama zaten görülen adımlarda mı büyüyor.

#### Matris Bir Adım–Teknik Eşlemesidir

Aşağıdaki yapı bir **modeldir**: teknikler yalnız sınıf adıyla ve hangi denetimin gördüğü
bilgisiyle yazılır; hiçbirinin nasıl yürütüldüğü geçmez. Kurgu ölçüm ağı üzerinde çalışılır.

**TM10:** her adım (taktik) altında birden çok teknik sınıfı vardır ve bir zincir her adımdan bir
teknik seçer. **TM11:** bir denetim kalemi belirli teknikleri görür; görmediği teknik üzerinden
yürünen adım o zincirde kırılamaz. **TM12:** zincirin kırılabildiği en erken halka, seçilen
tekniklerden ilk görülenin bulunduğu adımdır; hiçbiri görülmüyorsa zincir kırılamaz.

```js
// tehdit/matris.mjs — taktik ve teknik matrisinin modeli: satirlar teknik sinifi, sutunlar
// zincir adimi. Burada calisan bir teknik yoktur; teknikler yalnizca sinif adiyla ve hangi
// denetimin gordugu bilgisiyle yazilir. Rastgelelik yok.

// TM10: her adim (taktik) altinda birden cok teknik sinifi vardir; bir zincir her adimdan
// bir teknik secer. `kalem`, adim tamamlaninca erisilmis birikimli kurgu kalem sayisidir.
export const TAKTIK = [
  { ad: "kesif", kalem: 0, teknik: ["acik-kaynak-derleme", "dis-yuzey-listeleme",
    "calisan-listesi-toplama", "hizmet-parmak-izi"] },
  { ad: "ilk-erisim", kalem: 1, teknik: ["gecerli-kimlikle-giris", "ekli-dosya-yoluyla",
    "dis-servis-istismari", "tedarik-baglantisi", "cikarilabilir-ortam"] },
  { ad: "yurutme", kalem: 2, teknik: ["yorumlayici-cagrisi", "zamanlanmis-tetikleme",
    "kullanici-etkilesimi"] },
  { ad: "kalicilik", kalem: 3, teknik: ["acilis-girisi", "servis-tanimi", "zamanlanmis-gorev",
    "hesap-olusturma", "yapilandirma-kancasi"] },
  { ad: "yetki-yukseltme", kalem: 9, teknik: ["yanlis-izin-kullanma", "belirtec-devralma",
    "yol-degistirme"] },
  { ad: "yanal-gecis", kalem: 26, teknik: ["uzak-servis-oturumu", "paylasima-yazma",
    "kimlik-yeniden-kullanimi"] },
  { ad: "toplama", kalem: 41, teknik: ["yerel-veri-toplama", "paylasim-tarama"] },
  { ad: "sizdirma", kalem: 48, teknik: ["sifreli-kanal", "bolunmus-aktarim"] },
];

// TM11: bir denetim kalemi belirli teknikleri gorur; gormedigi teknik uzerinden yurunen adim
// o zincirde kirilamaz.
export const DENETIM = {
  "kimlik-gunlugu": ["gecerli-kimlikle-giris", "dis-servis-istismari", "hesap-olusturma"],
  "surec-kaydi": ["yorumlayici-cagrisi", "zamanlanmis-tetikleme"],
  "baslatma-envanteri": ["acilis-girisi", "servis-tanimi", "zamanlanmis-gorev"],
  "yetki-degisikligi": ["yanlis-izin-kullanma", "belirtec-devralma"],
  "cikis-hacmi": ["sifreli-kanal"],
};

export const gorulenKume = (ek = {}) =>
  new Set(Object.values({ ...DENETIM, ...ek }).flat());
export const TEKNIK_SAYISI = TAKTIK.reduce((t, k) => t + k.teknik.length, 0);
export const ZINCIR_SAYISI = TAKTIK.reduce((t, k) => t * k.teknik.length, 1);

// TM12: bir zincir her taktikten bir teknik secer; zincirin kirilabildigi en erken halka,
// secilen tekniklerden ilk gorulenin bulundugu adimdir. Hicbiri gorulmuyorsa zincir kirilamaz.
export function dagilim(ek = {}) {
  const g = gorulenKume(ek), sayim = new Array(TAKTIK.length + 1).fill(0);
  const yuru = (i, ilk) => {
    if (i === TAKTIK.length) return sayim[ilk === -1 ? TAKTIK.length : ilk]++;
    for (const t of TAKTIK[i].teknik) yuru(i + 1, ilk === -1 && g.has(t) ? i : ilk);
  };
  yuru(0, -1);
  return sayim;
}
export const kalemOnce = (i) => (i === 0 ? 0 : TAKTIK[i - 1].kalem);
export function ortalamaKalem(ek = {}) {
  const s = dagilim(ek);
  return s.reduce((t, n, i) =>
    t + n * (i === TAKTIK.length ? TAKTIK.at(-1).kalem : kalemOnce(i)), 0) / ZINCIR_SAYISI;
}
```

```js
// tehdit/kapsama.mjs — kapsama yuzdesi yukselirken hic denetimi olmayan adim sayisi dusuyor mu.
import { TAKTIK, DENETIM, gorulenKume, TEKNIK_SAYISI, ZINCIR_SAYISI, dagilim, kalemOnce,
  ortalamaKalem } from "./matris.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 G = gorulenKume();
const ortulen = TEKNIK_SAYISI - TAKTIK.reduce((t, k) =>
  t + k.teknik.filter((x) => !G.has(x)).length, 0);
const bosTaktik = TAKTIK.filter((k) => k.teknik.every((x) => !G.has(x)));

console.log(`${TAKTIK.length} taktik x ${TEKNIK_SAYISI} teknik, ` +
  `${Object.keys(DENETIM).length} denetim kalemi; ortulen teknik ${ortulen} ` +
  `(%${((ortulen / TEKNIK_SAYISI) * 100).toFixed(1)}), hic denetimi olmayan adim ` +
  `${bosTaktik.length} (${bosTaktik.map((k) => k.ad).join(", ")}); ` +
  `zincir sayisi ${ZINCIR_SAYISI}, ortalama kalem ${ortalamaKalem().toFixed(2)}`);

const A = [-18, 9, 9, 11, 12, 8];
console.log("\n1. matris: her adimda kac teknik, kaci gorulen");
yaz(A, "taktik", "teknik", "gorulen", "gorulmeyen", "kapsama %", "kalem");
for (const k of TAKTIK) {
  const gor = k.teknik.filter((x) => G.has(x)).length;
  yaz(A, k.ad, k.teknik.length, gor, k.teknik.length - gor,
    ((gor / k.teknik.length) * 100).toFixed(1), k.kalem);
}

const B = [-22, 8, 22, 15];
console.log("\n2. denetim kalemi basina gorulen teknik");
yaz(B, "denetim", "teknik", "hangi adim", "matris payi %");
for (const [d, t] of Object.entries(DENETIM)) {
  const adim = [...new Set(t.map((x) => TAKTIK.find((k) => k.teknik.includes(x)).ad))];
  yaz(B, d, t.length, adim.join("/"), ((t.length / TEKNIK_SAYISI) * 100).toFixed(1));
}

const C = [-18, 12, 11, 14, 16];
console.log("\n3. zincirin en erken kirilabilen halkasi");
yaz(C, "ilk gorulen adim", "zincir", "zincir %", "o ana kalem", "kalem katkisi");
const S = dagilim();
for (let i = 0; i <= TAKTIK.length; i++) {
  if (S[i] === 0) continue;
  const kalem = i === TAKTIK.length ? TAKTIK.at(-1).kalem : kalemOnce(i);
  yaz(C, i === TAKTIK.length ? "kirilamiyor" : TAKTIK[i].ad, S[i],
    ((S[i] / ZINCIR_SAYISI) * 100).toFixed(2), kalem,
    ((S[i] * kalem) / ZINCIR_SAYISI).toFixed(2));
}

const D = [-32, 11, 10, 16, 9, 13];
console.log("\n4. bir denetim kalemi daha eklenirse");
yaz(D, "eklenen denetim", "kapsama %", "bos adim", "ortalama kalem", "kazanc", "kirilamayan");
const EK = [
  ["kesif: iki teknik", { yeni: ["acik-kaynak-derleme", "dis-yuzey-listeleme"] }],
  ["ilk-erisim: uc teknigin tamami", { yeni: ["ekli-dosya-yoluyla", "tedarik-baglantisi",
    "cikarilabilir-ortam"] }],
  ["kalicilik: kalan tek teknik", { yeni: ["yapilandirma-kancasi"] }],
  ["yanal-gecis: uc teknigin tamami", { yeni: ["uzak-servis-oturumu", "paylasima-yazma",
    "kimlik-yeniden-kullanimi"] }],
  ["toplama: iki teknigin tamami", { yeni: ["yerel-veri-toplama", "paylasim-tarama"] }],
];
const taban = ortalamaKalem();
for (const [ad, ek] of EK) {
  const g = gorulenKume(ek);
  const ort = TEKNIK_SAYISI - TAKTIK.reduce((t, k) =>
    t + k.teknik.filter((x) => !g.has(x)).length, 0);
  const bos = TAKTIK.filter((k) => k.teknik.every((x) => !g.has(x))).length;
  const o = ortalamaKalem(ek);
  yaz(D, ad, ((ort / TEKNIK_SAYISI) * 100).toFixed(1), bos, o.toFixed(2),
    (taban - o).toFixed(2), dagilim(ek)[TAKTIK.length]);
}
const gec = S[TAKTIK.length - 1] + S[TAKTIK.length];
console.log(`taban: kirilamayan ${S[TAKTIK.length]} zincir; en gec iki satirdaki ${gec} zincir ` +
  `(%${((gec / ZINCIR_SAYISI) * 100).toFixed(2)}) ortalama kalemin ` +
  `%${(((S[TAKTIK.length - 1] * TAKTIK.at(-2).kalem + S[TAKTIK.length] * TAKTIK.at(-1).kalem) /
    ZINCIR_SAYISI / taban) * 100).toFixed(1)} payini tasiyor`);
```

```
8 taktik x 27 teknik, 5 denetim kalemi; ortulen teknik 11 (%40.7), hic denetimi olmayan adim 3 (kesif, yanal-gecis, toplama); zincir sayisi 10800, ortalama kalem 1.39

1. matris: her adimda kac teknik, kaci gorulen
taktik               teknik  gorulen gorulmeyen   kapsama %   kalem
kesif                     4        0          4         0.0       0
ilk-erisim                5        2          3        40.0       1
yurutme                   3        2          1        66.7       2
kalicilik                 5        4          1        80.0       3
yetki-yukseltme           3        2          1        66.7       9
yanal-gecis               3        0          3         0.0      26
toplama                   2        0          2         0.0      41
sizdirma                  2        1          1        50.0      48

2. denetim kalemi basina gorulen teknik
denetim                 teknik            hangi adim  matris payi %
kimlik-gunlugu               3  ilk-erisim/kalicilik           11.1
surec-kaydi                  2               yurutme            7.4
baslatma-envanteri           3             kalicilik           11.1
yetki-degisikligi            2       yetki-yukseltme            7.4
cikis-hacmi                  1              sizdirma            3.7

3. zincirin en erken kirilabilen halkasi
ilk gorulen adim        zincir   zincir %   o ana kalem   kalem katkisi
ilk-erisim                4320      40.00             0            0.00
yurutme                   4320      40.00             1            0.40
kalicilik                 1728      16.00             2            0.32
yetki-yukseltme            288       2.67             3            0.08
sizdirma                    72       0.67            41            0.27
kirilamiyor                 72       0.67            48            0.32

4. bir denetim kalemi daha eklenirse
eklenen denetim                   kapsama %  bos adim  ortalama kalem   kazanc  kirilamayan
kesif: iki teknik                      48.1         2            0.70     0.70           36
ilk-erisim: uc teknigin tamami         51.9         3            0.00     1.39            0
kalicilik: kalan tek teknik            44.4         3            0.80     0.59            0
yanal-gecis: uc teknigin tamami        51.9         2            0.92     0.47            0
toplama: iki teknigin tamami           48.1         2            1.15     0.25            0
taban: kirilamayan 72 zincir; en gec iki satirdaki 144 zincir (%1.33) ortalama kalemin %42.6 payini tasiyor
```

Sayılar **ölçüm** sınıfındadır; girdileri TM10–TM12'dir.

#### Kırk Yüzde Kapsamanın İçi

Sekiz adımın altında **27 teknik sınıfı** vardır ve beş denetim kalemi bunların **11'ini** görür —
kapsama %40,7. Tek başına bu sayı bir karar taşımaz; birinci tablo onu adım adım böldüğünde
karar çıkar.

Kapsama düz dağılmaz: kalıcılık adımının beş tekniğinin dördü görülür (%80), yürütme ve yetki
yükseltmenin üçte ikisi görülür, ilk erişimin beşte ikisi. Üç adımda kapsama **sıfırdır** — keşif,
yanal geçiş ve toplama. Bu üç adım, önceki dersteki denetimsiz üç adımın aynısıdır; matris o
gözlemi teknik düzeyinde doğrular ve nedenini yazar: bu adımların hiçbir tekniği beş denetim
kaleminin gördüğü kümede yer almaz.

Matris yapısının bu dersteki işlevi sınıflandırmanın kendisi değildir. Sınıflandırma yalnız
sayılabilir bir ızgara sağlar: her hücre "bu adım bu teknikle yürünebilir mi" sorusuna evet ya da
hayır der ve her evet hücresine bir denetim eşlenip eşlenmediği ayrıca yazılır. Izgara olmadan
kapsama bir kanaat olarak kalır; ızgarayla birlikte kapsama iki sayının bölümü olur.

İkinci tablo aynı sayıyı denetim tarafından okur. Beş denetimin en genişi üç teknik görür ve
matrisin %11,1'ini kapsar; en darı bir teknik görür, %3,7. İki denetim aynı adımda çakışır: kimlik
günlüğü kalıcılık adımına düşen bir teknik görür, başlatma envanteri ise üçünü birden. **Denetim
sayısını artırmak, örtülen adım sayısını artırmak değildir.**

#### On Bin Sekiz Yüz Zincir

Adım başına teknik sayıları çarpıldığında **10.800 ayrı zincir** çıkar. Üçüncü tablo her zincirin
kırılabildiği **en erken halkayı** bulur ve zincirleri o halkaya göre gruplar.

Bu çarpım, teknik saymak ile zincir saymak arasındaki farkı yazar. Teknik sayısı toplamsaldır: bir
adıma iki teknik eklemek 27'yi 29'a çıkarır. Zincir sayısı çarpımsaldır: aynı iki teknik toplamayı
ikiden dörde çıkarırsa zincir sayısı 10.800'den 21.600'e çıkar. Kapsama yüzdesi teknik sayısı
üzerinden hesaplandığı için toplamsal, savunmanın karşılaştığı olasılık kümesi ise çarpımsal büyür.
İki ölçünün aynı yönde hareket etmesi için bir neden yoktur.

Dağılım baştan yığılıdır: zincirlerin %40'ı ilk erişimde, %40'ı yürütmede, %16'sı kalıcılıkta
kırılabilir. Toplam %96 ilk üç kırılabilir halkada toplanır ve bu zincirlerde erişilmiş kalem 0, 1
ya da 2'dir. Ortalama kalem **1,39**'dur. Kapsama yüzdesi düşük görünse de kapsamanın **zincirin
başında** durması ortalamayı aşağıda tutar.

Kuyruk ise ters yöndedir. 72 zincir ancak sızdırma adımında kırılabilir — o noktada 41 kaleme
erişilmiştir. Başka 72 zincir **hiçbir halkada kırılamaz**: sekiz adımın sekizinde de görülmeyen
bir teknik seçilmiştir. Bu iki grup zincirlerin yalnız **%1,33'üdür** ama ortalama kalemin
**%42,6 payını** taşır. Kapsama ortalamalarıyla değerlendirilen bir matris bu %1,33'ü hiç görmez.

Kuyruğun bu ağırlığı doğrudan kalem dizisinden gelir. Kalem sayısı adımlar boyunca 0, 1, 2, 3, 9,
26, 41, 48 diye ilerler; ilk dört adımın toplam katkısı 3'tür, son dört adımınki 45. Zincirlerin
büyük çoğunluğu ucuz bölgede kırılırken, kırılamayan azınlık pahalı bölgenin tamamını taşır.

Kırılamayan 72 zincir bu kursta ilk kez ortaya çıkan bir durumdur: zincirin hiçbir halkasında bir
kırma noktası yoktur. Bu durumda ölçü kırmadan **tespite** kayar — soru artık "hangi halkada
kırılır" değil, "olay olduktan sonra hangi kayıttan görülür"dür.

#### Aynı Kapsama, Üç Kat Fark

Dördüncü tablo beş ayrı müdahaleyi aynı ölçekte karşılaştırır ve bu dersin asıl bulgusunu verir.

İki satır **tam olarak aynı kapsama yüzdesini** üretir: ilk erişimin üç görülmeyen tekniğini
örtmek ve yanal geçişin üç tekniğini örtmek — her ikisi de kapsamayı %40,7'den **%51,9'a** çıkarır.
Kazançları ise 1,39 ve 0,47 kalemdir; birincisi ötekinin **üç katıdır**. Aynı büyüklükte bir çaba,
aynı yüzde artışı, üç kat farklı sonuç. Fark yalnız çakıştığı adımın zincirdeki sırasından gelir.

İkinci satır daha da keskindir: ilk erişim tamamen örtüldüğünde her zincir birinci adımdan sonra
kırılabilir hale gelir ve ortalama kalem **0,00**'a iner — ama **boş adım sayısı 3'te kalır**.
Kapsama tablosuna bakan bir değerlendirme bu müdahaleyi "hâlâ üç kör adım var" diye eksik bulur;
kalem ölçüsüne bakan bir değerlendirme onu en iyi hamle olarak yazar.

Ters örnek de aynı tablodadır. Yanal geçiş ve toplamanın örtülmesi boş adım sayısını 3'ten 2'ye
indirir — kapsama tablosunda görünen tek iyileşme budur — ve kazançları 0,47 ile 0,25 kalemdir,
listenin en düşük ikisi. **Boş adım sayısını düşürmek ile erken kırma kazancını yükseltmek ayrı
hedeflerdir ve aynı müdahaleyi seçmezler.**

Son sütun üçüncü bir ölçüt getirir: kırılamayan zincir sayısı. Taban 72'dir. Kalıcılığın kalan tek
tekniğini örtmek kapsamayı yalnız %44,4'e çıkarır, boş adım sayısını hiç değiştirmez, ama
kırılamayan zinciri **72'den 0'a** indirir — çünkü o teknik, kırılamayan zincirlerin hepsinin
geçtiği tek ortak boşluktur. Keşifte iki teknik örtmek aynı sayıyı yalnız yarıya indirir. Üç ölçüt
üç ayrı satırı seçer; hangi ölçütün kullanıldığı yazılmadan verilen bir kapsama kararı ölçülmemiş
sayılır.

#### Özet

- Saldırgan davranışı sınıflandırmaları adımları sütun, teknik sınıflarını satır yapan bir matris
  kurar: 8 adım, 27 teknik, adım başına teknik sayılarının çarpımı **10.800 zincir**.
- Beş denetim kalemi 27 tekniğin 11'ini görür (%40,7); üç adımda kapsama sıfırdır ve bunlar önceki
  derste denetimsiz çıkan üç adımın aynısıdır.
- Zincirlerin %96'sı ilk üç kırılabilir halkada kırılır ve ortalama kalem 1,39'dur; kapsamanın
  zincirin başında toplanması ortalamayı düşük tutar.
- Zincirlerin %1,33'ü (144 zincir) ortalama kalemin %42,6 payını taşır; bunların 72'si **hiçbir
  halkada kırılamaz** ve o zincirlerde ölçü kırmadan tespite kayar.
- Aynı kapsama yüzdesini (%51,9) veren iki müdahale 1,39 ve 0,47 kalem kazandırır; fark yalnız
  örtülen adımın zincirdeki sırasından gelir.
- Üç ölçüt üç ayrı müdahaleyi seçer: kapsama yüzdesi ve kalem kazancı ilk erişimi, boş adım sayısı
  yanal geçişi, kırılamayan zincir sayısı kalıcılığın kalan tek tekniğini gösterir.

#### Sonraki Adım

Matris bir soruyu yanıtsız bırakır. Hücreler "bu adım bu teknikle yürünebilir" der ve bir denetimin
o tekniği görüp görmediğini yazar. Ama bir gözlem eldeyken — bir kayıt, bir bağlantı, bir dosya
izi — o gözlemin **hangi zincire ait olduğu** matristen okunamaz. Aynı teknik sınıfı birbirinden
bağımsız birçok olayda geçer.

Bu boşluğu dolduran ikinci bir yapı vardır ve matristen farklı bir soru sorar: bir olayın dört
köşesi — kimin yaptığı, hangi altyapıyı kullandığı, hangi yeteneği taşıdığı ve kimi hedeflediği —
birbirine bağlıdır. Bir köşe bilindiğinde diğerleri daralır. Sonraki ders bu daralmayı **bağlantı
sayımı** olarak ölçer: bir köşeyi bilmek diğer üç köşenin kaç adayını eliyor ve hangi köşe zincirin
en erken halkasında görünür hale geliyor.

### Elmas Modeli

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/elmas-modeli

Dört köşeli ilişki modelinin bağlantı sayımına çevrilmesi: 20 gözlemde aktör, altyapı, yetenek ve kurban köşelerinin 134 olası bağlantıdan 77'sini doldurması, bir köşeyi bilmenin daraltma oranının o köşe ikilisinin bağlantı seyrekliğine tam olarak eşit çıkması, en güçlü köşenin (%50) zincirin sekizinci adımında ve 41 kalem sonra görünür olması, en erken görünen köşenin yalnız %30,7 daraltması, yetenek köşesinin 1 kalem bedelle %43,1 daraltma vermesi ve ikinci köşenin eklenmesinin daraltmaya yalnız 10 ile 13,1 puan eklemesi.

Matris bir soruyu yanıtsız bıraktı. Hücreler "bu adım bu teknikle yürünebilir" der ve bir denetimin
o tekniği görüp görmediğini yazar. Ama elde bir gözlem varken — bir kayıt, bir bağlantı, bir dosya
izi — o gözlemin **hangi olaya ait olduğu** matristen okunamaz. Aynı teknik sınıfı birbirinden
bağımsız birçok olayda geçer.

Bu boşluğu dolduran ikinci bir yapı, olayı dört köşeyle anar: **kim** (aktör profili), **hangi
altyapıyla**, **hangi yetenekle** ve **kime karşı**. Dört köşe altı ikili bağlantı üretir ve
modelin taşıdığı iddia şudur: bir köşe bilindiğinde diğerleri daralır. Bu ders o daralmayı
**bağlantı sayımı** olarak ölçer.

#### Dört Köşe, Altı Bağlantı

Aşağıdaki gözlem kümesi **kurgudur**: gerçek bir aktör, altyapı kalemi, kampanya ya da kurum adı
geçmez; aktör köşesi yalnız yetenek ve motivasyon düzeyiyle yazılır.

**TM13:** bir gözlem dört köşeyi birlikte kaydeder ve dört köşe altı ikili bağlantı üretir.
**TM14:** bir köşeyi bilmek, o değeri taşıyan gözlemlerle sınırlı kalmaktır; kalan aday sayısı o
alt kümede hedef köşenin farklı değer sayısıdır. **TM15:** her köşe zincirin belirli bir adımında
görünür olur ve o adıma kadar erişilmiş kalem sayısı, o köşeyi kullanmanın bedelidir.

```js
// tehdit/kose.mjs — dort koseli iliski modelinin veri yapisi: her gozlem bir olayin dort
// kosesini birlestirir. Gozlemler kurgudur; gercek bir aktor, altyapi kalemi, kampanya ya da
// kurum adi gecmez. Aktor kosesi yalnizca yetenek ve motivasyon duzeyiyle yazilir.

// TM13: bir gozlem dort koseyi birlikte kaydeder: aktor profili, altyapi kalemi, yetenek
// (teknik sinifi) ve kurban kalemi. Dort kose 6 ikili baglanti uretir.
export const KOSE = ["aktor", "altyapi", "yetenek", "kurban"];
export const GOZLEM = `
  yetenek-2-gelir      paylasimli-barindirma  ekli-dosya-yoluyla        sube-ucu
  yetenek-2-gelir      paylasimli-barindirma  ekli-dosya-yoluyla        abone-portali
  yetenek-2-gelir      acik-vekil             gecerli-kimlikle-giris    abone-portali
  yetenek-2-gelir      paylasimli-barindirma  gecerli-kimlikle-giris    sube-ucu
  yetenek-2-gelir      acik-vekil             ekli-dosya-yoluyla        saha-uygulamasi
  yetenek-3-gelir      paylasimli-barindirma  dis-servis-istismari      abone-portali
  yetenek-3-gelir      kiralik-uc             dis-servis-istismari      fatura-servisi
  yetenek-3-gelir      kiralik-uc             yorumlayici-cagrisi       fatura-servisi
  yetenek-3-gelir      acik-vekil             ekli-dosya-yoluyla        saha-uygulamasi
  yetenek-3-gelir      paylasimli-barindirma  gecerli-kimlikle-giris    abone-portali
  yetenek-3-ic-erisim  kendi-ucu              kimlik-yeniden-kullanimi  saha-uygulamasi
  yetenek-3-ic-erisim  kendi-ucu              gecerli-kimlikle-giris    fatura-servisi
  yetenek-3-ic-erisim  kendi-ucu              kimlik-yeniden-kullanimi  fatura-servisi
  yetenek-3-ic-erisim  kendi-ucu              sifreli-kanal             sube-ucu
  yetenek-5-hedefli    ele-gecirilmis-uc      dis-servis-istismari      saha-uygulamasi
  yetenek-5-hedefli    ele-gecirilmis-uc      yorumlayici-cagrisi       saha-uygulamasi
  yetenek-5-hedefli    ele-gecirilmis-uc      kimlik-yeniden-kullanimi  fatura-servisi
  yetenek-5-hedefli    ele-gecirilmis-uc      sifreli-kanal             sube-ucu
  yetenek-5-hedefli    kiralik-uc             sifreli-kanal             fatura-servisi
  yetenek-5-hedefli    kiralik-uc             yorumlayici-cagrisi       abone-portali`
  .trim().split("\n").map((r) => {
    const [aktor, altyapi, yetenek, kurban] = r.trim().split(/\s+/);
    return { aktor, altyapi, yetenek, kurban };
  });

export const deger = (k) => [...new Set(GOZLEM.map((g) => g[k]))];

// TM14: bir koseyi bilmek, o degeri tasiyan gozlemlerle sinirli kalmaktir; kalan aday sayisi
// o alt kumede hedef kosenin farkli deger sayisidir, kumeler uzerinden ortalanir.
export function daraltma(bilinen, hedef) {
  const toplam = deger(hedef).length;
  const kumeler = new Map();
  for (const g of GOZLEM) {
    const anahtar = bilinen.map((k) => g[k]).join("|");
    if (!kumeler.has(anahtar)) kumeler.set(anahtar, new Set());
    kumeler.get(anahtar).add(g[hedef]);
  }
  const ort = [...kumeler.values()].reduce((t, s) => t + s.size, 0) / kumeler.size;
  return { ort, toplam, oran: 1 - ort / toplam, kume: kumeler.size };
}

// TM15: her kose zincirin belirli bir adiminda gorunur olur; o adima kadar erisilmis kalem
// sayisi, o koseyi kullanmanin bedelidir. Aktor kosesi dogrudan gorunmez, cikarilir.
export const GORUNURLUK = { kurban: { adim: "ilk-erisim", kalem: 0 },
  yetenek: { adim: "yurutme", kalem: 1 }, altyapi: { adim: "sizdirma", kalem: 41 },
  aktor: { adim: "-", kalem: null } };
```

```js
// tehdit/pivot.mjs — bir koseyi bilmek diger koselerden kacini daraltiyor.
import { KOSE, GOZLEM, deger, daraltma, GORUNURLUK } from "./kose.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 ikili = KOSE.flatMap((a, i) => KOSE.slice(i + 1).map((b) => [a, b]));
const olasi = ikili.reduce((t, [a, b]) => t + deger(a).length * deger(b).length, 0);
const gorulen = ikili.reduce((t, [a, b]) =>
  t + new Set(GOZLEM.map((g) => `${g[a]}|${g[b]}`)).size, 0);

console.log(`${GOZLEM.length} gozlem, ${KOSE.length} kose ` +
  `(${KOSE.map((k) => `${k} ${deger(k).length}`).join(", ")}); ` +
  `${ikili.length} kose ikilisi, ${olasi} olasi baglanti, ${gorulen} gozlemde var ` +
  `(%${((gorulen / olasi) * 100).toFixed(1)})`);

const A = [-10, -10, 9, 11, 12];
console.log("\n1. kose ikilileri: kac baglanti gozlemde var");
yaz(A, "kose", "kose", "olasi", "gorulen", "seyreklik %");
for (const [a, b] of ikili) {
  const n = new Set(GOZLEM.map((g) => `${g[a]}|${g[b]}`)).size;
  const o = deger(a).length * deger(b).length;
  yaz(A, a, b, o, n, (100 - (n / o) * 100).toFixed(1));
}

const B = [-10, -10, 8, 15, 12, 11];
console.log("\n2. bir kose bilinirse otekinden kac aday kaliyor");
yaz(B, "bilinen", "hedef", "toplam", "ortalama aday", "daraltma %", "kume");
for (const b of KOSE) for (const h of KOSE) {
  if (b === h) continue;
  const d = daraltma([b], h);
  yaz(B, b, h, d.toplam, d.ort.toFixed(2), (d.oran * 100).toFixed(1), d.kume);
}

const C = [-10, 14, 14, 16, 9];
console.log("\n3. hangi kose ne zaman gorunuyor, ne kadar daraltiyor");
yaz(C, "kose", "gorunur adim", "o ana kalem", "ort daraltma %", "sira");
const guc = KOSE.map((k) => ({ k, g: KOSE.filter((h) => h !== k)
  .reduce((t, h) => t + daraltma([k], h).oran, 0) / (KOSE.length - 1) }))
  .sort((x, y) => y.g - x.g);
for (const { k, g } of guc)
  yaz(C, k, GORUNURLUK[k].adim, GORUNURLUK[k].kalem ?? "cikarim",
    (g * 100).toFixed(1), guc.findIndex((x) => x.k === k) + 1);

const D = [-24, -10, 15, 12, 15];
console.log("\n4. ikinci kose eklenirse ne kazaniliyor");
yaz(D, "bilinen kose(ler)", "hedef", "ortalama aday", "daraltma %", "ek daraltma %");
for (const h of KOSE) {
  const tekli = KOSE.filter((k) => k !== h)
    .map((k) => ({ k, d: daraltma([k], h) })).sort((x, y) => x.d.ort - y.d.ort)[0];
  const oteki = KOSE.filter((k) => k !== h && k !== tekli.k);
  const cift = daraltma([tekli.k, oteki[0]], h);
  yaz(D, tekli.k, h, tekli.d.ort.toFixed(2), (tekli.d.oran * 100).toFixed(1), "-");
  yaz(D, `${tekli.k} + ${oteki[0]}`, h, cift.ort.toFixed(2), (cift.oran * 100).toFixed(1),
    ((cift.oran - tekli.d.oran) * 100).toFixed(1));
}
console.log("uc kose bilinirse kalan ortalama aday: " + KOSE.map((h) =>
  `${h} ${daraltma(KOSE.filter((k) => k !== h), h).ort.toFixed(2)}`).join(", "));

const enIyi = guc[0];
console.log(`en guclu kose ${enIyi.k} (%${(enIyi.g * 100).toFixed(1)}), ` +
  `gorunurlugu ${GORUNURLUK[enIyi.k].adim} adiminda ve o ana kadar ` +
  `${GORUNURLUK[enIyi.k].kalem} kaleme erisilmis; en erken gorunen kose ` +
  `kurban (${GORUNURLUK.kurban.kalem} kalem) ve daraltmasi ` +
  `%${(guc.find((x) => x.k === "kurban").g * 100).toFixed(1)}`);
```

```
20 gozlem, 4 kose (aktor 4, altyapi 5, yetenek 6, kurban 4); 6 kose ikilisi, 134 olasi baglanti, 77 gozlemde var (%57.5)

1. kose ikilileri: kac baglanti gozlemde var
kose      kose          olasi    gorulen seyreklik %
aktor     altyapi          20          8        60.0
aktor     yetenek          24         13        45.8
aktor     kurban           16         13        18.8
altyapi   yetenek          30         15        50.0
altyapi   kurban           20         12        40.0
yetenek   kurban           24         16        33.3

2. bir kose bilinirse otekinden kac aday kaliyor
bilinen   hedef       toplam  ortalama aday  daraltma %       kume
aktor     altyapi          5           2.00        60.0          4
aktor     yetenek          6           3.25        45.8          4
aktor     kurban           4           3.25        18.8          4
altyapi   aktor            4           1.60        60.0          5
altyapi   yetenek          6           3.00        50.0          5
altyapi   kurban           4           2.40        40.0          5
yetenek   aktor            4           2.17        45.8          6
yetenek   altyapi          5           2.50        50.0          6
yetenek   kurban           4           2.67        33.3          6
kurban    aktor            4           3.25        18.8          4
kurban    altyapi          5           3.00        40.0          4
kurban    yetenek          6           4.00        33.3          4

3. hangi kose ne zaman gorunuyor, ne kadar daraltiyor
kose        gorunur adim   o ana kalem  ort daraltma %     sira
altyapi         sizdirma            41            50.0        1
yetenek          yurutme             1            43.1        2
aktor                  -       cikarim            41.5        3
kurban        ilk-erisim             0            30.7        4

4. ikinci kose eklenirse ne kazaniliyor
bilinen kose(ler)       hedef       ortalama aday  daraltma %  ek daraltma %
altyapi                 aktor                1.60        60.0              -
altyapi + yetenek       aktor                1.20        70.0           10.0
aktor                   altyapi              2.00        60.0              -
aktor + yetenek         altyapi              1.38        72.3           12.3
altyapi                 yetenek              3.00        50.0              -
altyapi + aktor         yetenek              2.25        62.5           12.5
altyapi                 kurban               2.40        40.0              -
altyapi + aktor         kurban               1.88        53.1           13.1
uc kose bilinirse kalan ortalama aday: aktor 1.05, altyapi 1.00, yetenek 1.33, kurban 1.11
en guclu kose altyapi (%50.0), gorunurlugu sizdirma adiminda ve o ana kadar 41 kaleme erisilmis; en erken gorunen kose kurban (0 kalem) ve daraltmasi %30.7
```

Sayılar **ölçüm** sınıfındadır; girdileri TM13–TM15'tir.

#### Daraltma Bir Seyreklik Ölçüsüdür

Dört köşenin değer sayıları 4, 5, 6 ve 4'tür. Altı köşe ikilisi toplam **134 olası bağlantı**
tanımlar; 20 gözlem bunların **77'sini** doldurur. Kalan 57 bağlantı hiç görülmemiştir ve modelin
bütün gücü buradan gelir.

İkinci tablo ile birinci tablo yan yana okunduğunda bir eşitlik ortaya çıkar: her köşe ikilisinin
**seyreklik yüzdesi**, o ikili için hesaplanan **daraltma yüzdesine tam olarak eşittir**. Aktör ile
altyapı ikilisinin seyrekliği %60,0'dır; aktörü bilmek altyapıyı %60,0 daraltır, altyapıyı bilmek
aktörü de %60,0 daraltır. Aktör ile kurban ikilisinin seyrekliği %18,8'dir ve daraltması da öyle.

Eşitlik tesadüf değildir. Bir köşenin her değeri için kalan aday sayılarının toplamı, tam olarak o
ikilideki farklı bağlantı sayısıdır; küme sayısına bölündüğünde ortalama aday çıkar ve hedef
köşenin toplam değer sayısına oranlandığında bağlantı yoğunluğu elde edilir. **Daraltma gücü,
bağlantı matrisinin ne kadar boş olduğudur.** Model bu yüzden bir sezgi değil, sayılabilir bir
şeydir: iki köşe arasında ne kadar az kombinasyon gerçekleşmişse, birini bilmek ötekini o kadar
daraltır.

Buradan çıkan uyarı da aynı ölçüdedir. Gözlem sayısı arttıkça bağlantı matrisi dolar ve daraltma
gücü **azalır**. Bir gözlem havuzunun büyümesi çıkarımı otomatik olarak güçlendirmez; matris
dolmaya başladığında aynı köşe daha az ayırt eder.

#### En Güçlü Köşe En Pahalı Köşedir

Üçüncü tablo bu dersin asıl karşılaştırmasıdır: her köşenin ortalama daraltma gücü ile zincirde
görünür olduğu adım yan yana yazılır.

Sıralamanın başında **altyapı** vardır: diğer üç köşeyi ortalama %50,0 daraltır. Ama altyapı köşesi
ancak sızdırma adımında görünür hale gelir — dış uç, veri dışarı çıkarken belli olur — ve o ana
kadar **41 kaleme** erişilmiştir. En güçlü ipucu, zincirin en geç halkasında doğar.

Bu geç doğuş modelin kendi yapısından gelir. Altyapı köşesi güçlüdür çünkü aktörle arasındaki
bağlantı matrisi en boş olanıdır — her aktör profili yalnız birkaç altyapı biçimi kullanır. Aynı
seyreklik, o köşenin savunma tarafında geç görünmesinin de nedenidir: seyrek kullanılan bir kalem
ancak zincirin sonunda, dışa dönük bir adımda kayda düşer.

Sıralamanın sonunda **kurban** vardır: %30,7 daraltma. Bu köşe savunma tarafında bedelsizdir,
çünkü hangi kalemin hedeflendiği ilk erişim adımında bellidir ve o noktada **0 kalem**
kaybedilmiştir. Bedelsiz olan en zayıf, en güçlü olan en pahalıdır.

Aradaki satır kararı verir. **Yetenek** köşesi %43,1 daraltır ve yürütme adımında görünür — o ana
kadar erişilmiş kalem **1**. Altyapının 6,9 puanlık üstünlüğü 40 kalem daha pahalıya gelir.
Zincirin ölçüsüyle bakıldığında en iyi köşe en çok daraltan köşe değil, **birim kalem başına en
çok daraltan** köşedir; yetenek köşesi bu ölçüde altyapıdan otuz beş kat verimlidir. Kurban
köşesi bedelsiz olduğu için onunla böyle bir oran kurulamaz; onu ayıran şey verim değil,
daraltmasının en düşük olmasıdır.

İkinci tablonun kendi içinde de bir asimetri vardır. Aynı ikili için daraltma yüzdesi iki yönde
eşit olsa da **kalan aday sayısı** eşit değildir: altyapıyı bilmek aktörü 4 adaydan 1,60'a indirir,
aktörü bilmek altyapıyı 5 adaydan 2,00'a. Yüzde aynı, mutlak sayı farklıdır ve karar mutlak sayıyla
verilir. Değer kümesi küçük olan köşeyi hedef almak, aynı seyreklikle daha kesin bir sonuç üretir.

Aktör köşesi tabloda ayrı durur: hiçbir adımda doğrudan görünmez, diğer üç köşeden çıkarılır.
Daraltma gücü %41,5'tir ama bu güç yalnız çıkarımın hedefi olarak anlamlıdır — aktörü bilmek diğer
köşeleri daraltır, ancak aktörü bilmenin tek yolu diğer köşelerden geçer.

#### İkinci Köşenin Getirisi

Dördüncü tablo her hedef köşe için en iyi tek pivotu bulur, sonra ona ikinci bir köşe ekler.

Aktörü daraltmak için en iyi tek köşe altyapıdır: dört adaydan **1,60**'a iner (%60,0). Yetenek
köşesi de eklendiğinde 1,20'ye iner (%70,0) — ikinci köşenin katkısı **10 puandır**. Diğer üç
satırda ek katkı 12,3, 12,5 ve 13,1 puandır. Dört durumda da ikinci köşe, birincinin sağladığının
**altıda biri kadar** ek daralma getirir.

Azalan getirinin nedeni birinci tablodadır. İkinci köşe yalnız birincinin bıraktığı alt kümede iş
görür ve o alt küme zaten seyrektir; ikinci pivotun kaldırabileceği bağlantı sayısı birincinin
kaldırdığından çok daha azdır. Son satır sınırı gösterir: üç köşe birden bilindiğinde kalan
ortalama aday 1,00 ile 1,33 arasındadır — yani üçüncü köşeden sonra eklenecek bir şey kalmamıştır.

Bu, dört köşeli modelin pratikte nasıl kullanıldığını yazar. İlk pivot kararın neredeyse tamamını
verir; ikinci pivot bir doğrulama aracıdır. Aktör köşesinde 1,60'tan 1,20'ye inmek, ortalama olarak
"iki aday" yerine "bir aday" demektir ve bu fark bazı gözlem kümelerinde belirleyici olur — ama
40 kalemlik bir bekleme pahasına elde ediliyorsa **ödenen bedel kazanılan daralmadan büyüktür**.

Zincir ölçüsüyle söylenirse: bir köşeyi daha beklemek, zincirde bir adım daha ilerlemek demektir.
Önceki dersin sayılarıyla bu bekleme yürütmeden sızdırmaya gitmek ise 1 kalemden 41 kaleme
geçmektir. **İlişki modeli daralma sağlar, ama daralmanın bedeli zincirin kendi ölçüsüyle
yazılmadıkça karar taşımaz.**

#### Özet

- Dört köşe (aktör, altyapı, yetenek, kurban) altı ikili bağlantı üretir; 20 gözlem 134 olası
  bağlantının 77'sini doldurur ve kalan 57 boşluk modelin bütün gücünü sağlar.
- Bir köşeyi bilmenin daraltma yüzdesi, o köşe ikilisinin bağlantı seyrekliğine tam olarak eşittir;
  daraltma gücü bağlantı matrisinin ne kadar boş olduğudur.
- Gözlem sayısı arttıkça matris dolar ve daraltma gücü azalır; havuzu büyütmek çıkarımı
  kendiliğinden güçlendirmez.
- En güçlü köşe altyapıdır (%50,0) ama sızdırma adımında, 41 kalem sonra görünür; en erken görünen
  köşe kurbandır (0 kalem) ve yalnız %30,7 daraltır.
- Yetenek köşesi 1 kalem bedelle %43,1 daraltır; altyapının 6,9 puanlık üstünlüğü 40 kalem daha
  pahalıdır.
- İkinci köşenin katkısı 10,0 ile 13,1 puan arasındadır — ilk pivotun sağladığının yaklaşık altıda
  biri; ilk pivot kararı verir, ikincisi doğrular.

#### Sonraki Adım

Beş ders boyunca ölçülen her şey aynı varsayımın üstünde durdu: denetimlerin gördüğü şeyler
**önceden bilinen** şeylerdi. Matristeki her hücre bir teknik sınıfına, her denetim kalemi tanınan
bir kayıt örüntüsüne bağlıydı; ilişki modelindeki her köşe daha önce görülmüş bir bağlantıya
dayandı.

Oysa bir tekniğin ilk kez kullanıldığı an bu varsayımın dışındadır. Tanınacak bir örüntü henüz
yoktur, bağlantı matrisinde o satır boştur ve düzeltmesi de çıkmamıştır. Konunun son dersi bu
durumu kapsam cinsinden ölçer: bilinen tehditte kaç halka kırılabiliyorsa bilinmeyen tehditte kaçı
kırılabiliyor, imza tabanlı denetim kaç adımı kaçırıyor, davranış tabanlı denetim kaçını hâlâ
yakalıyor ve düzeltme yayımlanana kadar geçen pencerede kaç kalem açık kalıyor.

### Bilinen ve Bilinmeyen Tehditler

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/bilinen-ve-bilinmeyen-tehditler

Sıfırıncı günün denetim kapsamı cinsinden ölçülmesi: sekiz denetimin bilinen tehditte 7 halkayı kırılabilir kılarken bilinmeyen tehditte 5'e inmesi, imza tabanlı üç denetimin iki adımı tamamen boş bırakması, davranış tabanlı üç denetimin yakalamasının %70'ini koruması, yapılandırma tabanlı iki denetimin hiç etkilenmemesi, beklenen kalemin 6,42'den 19,69'a çıkması ve 77 günlük yama öncesi pencerede 115,49 kalem açık kalırken yapısal kırma altında aynı pencerenin 0,00 vermesi.

Beş ders boyunca ölçülen her şey aynı varsayımın üstünde durdu: denetimlerin gördüğü şeyler
**önceden bilinen** şeylerdi. Matristeki her hücre tanınan bir teknik sınıfına, her denetim kalemi
tanınan bir kayıt örüntüsüne bağlıydı; ilişki modelindeki her köşe daha önce görülmüş bir
bağlantıya dayandı.

Bir tekniğin ilk kez kullanıldığı an bu varsayımın dışındadır. **Sıfırıncı gün (zero-day)**, bir
açığın savunma tarafında henüz bilinmediği ve düzeltmesinin bulunmadığı durumdur. Bu ders o durumu
bir sıfat olarak değil, **kapsam kaybı** olarak ölçer: kaç halka kırılabilir kalıyor, hangi denetim
türü ayakta duruyor ve düzeltme yayımlanana kadar geçen pencerede kaç kalem açık.

#### Denetimin Türü Neye Baktığını Belirler

Aşağıdaki yapı bir **modeldir**: çalışan bir istismar, bir açık kimliği ya da bir düzeltme kaydı
yoktur; yalnız denetim türleri ve yakalama oranları vardır. Kurgu ölçüm ağı üzerinde çalışılır.

**TM16:** her denetim bir türe aittir — imza tabanlı denetim tanınan bir örüntüye, davranış tabanlı
denetim sapmaya, yapılandırma tabanlı denetim durumun kendisine bakar. **TM17:** bilinmeyen
tehditte imza tabanlı denetimin yakalaması sıfırdır; davranış tabanlı denetim çalışır ama eşiği o
davranışa ayarlı olmadığı için bir çarpanla düşer; yapılandırma tabanlı denetim etkilenmez.
**TM18:** zincir k. adımda kırılırsa o ana kadar erişilmiş kalem bir önceki adımın kalemidir.

```js
// tehdit/bilinmeyen.mjs — bilinen ve bilinmeyen tehdidin denetim kapsami modeli: burada calisan
// bir istismar ya da acik kimligi yoktur; yalnizca denetim turleri ve yakalama oranlarindan
// olusan bir veri yapisi vardir. Rastgelelik yok, bekleyen deger hesaplanir.

export const ADIM = ["kesif", "ilk-erisim", "yurutme", "kalicilik", "yetki-yukseltme",
  "yanal-gecis", "toplama", "sizdirma"];
export const KALEM = [0, 1, 2, 3, 9, 26, 41, 48];

// TM16: her denetim bir ture aittir. Imza tabanli denetim taninan bir oruntuye bakar; davranis
// tabanli denetim sapmaya bakar; yapilandirma tabanli denetim durumun kendisine bakar.
export const DENETIM = [
  { ad: "imza-eslesmesi", tur: "imza", adim: "ilk-erisim", yakalama: 0.35 },
  { ad: "dosya-imzasi", tur: "imza", adim: "yurutme", yakalama: 0.4 },
  { ad: "surec-agaci-sapmasi", tur: "davranis", adim: "yurutme", yakalama: 0.2 },
  { ad: "baslatma-envanteri", tur: "yapilandirma", adim: "kalicilik", yakalama: 0.3 },
  { ad: "yetki-degisikligi", tur: "yapilandirma", adim: "yetki-yukseltme", yakalama: 0.25 },
  { ad: "oturum-sicramasi", tur: "davranis", adim: "yanal-gecis", yakalama: 0.18 },
  { ad: "veri-deseni-imzasi", tur: "imza", adim: "toplama", yakalama: 0.22 },
  { ad: "cikis-hacmi-sapmasi", tur: "davranis", adim: "sizdirma", yakalama: 0.45 },
];

// TM17: bilinmeyen tehditte imza tabanli denetimin yakalamasi sifirdir (henuz oruntu yoktur);
// davranis tabanli denetim calisir ama esigi o davranisa ayarli olmadigi icin bir carpanla
// duser; yapilandirma tabanli denetim tehdidin bilinip bilinmemesinden bagimsizdir.
export const CARPAN = {
  bilinen: { imza: 1, davranis: 1, yapilandirma: 1 },
  bilinmeyen: { imza: 0, davranis: 0.7, yapilandirma: 1 },
  "duyuruldu-yama-yok": { imza: 0, davranis: 1, yapilandirma: 1 },
  "yama-var-uygulanmadi": { imza: 1, davranis: 1, yapilandirma: 1 },
};

export function adimYakalama(carpan) {
  return ADIM.map((a) => 1 - DENETIM.filter((d) => d.adim === a)
    .reduce((t, d) => t * (1 - d.yakalama * carpan[d.tur]), 1));
}

// TM18: zincir k. adimda kirilirsa o ana kadar erisilmis kalem KALEM[k-1]'dir; yapisal kirma
// varsa zincir o adimdan sonra hic yurunemez.
export function beklenenKalem(carpan, son = ADIM.length) {
  const p = adimYakalama(carpan);
  let kalan = 1, toplam = 0;
  for (let i = 0; i < son; i++) {
    toplam += kalan * p[i] * (i === 0 ? 0 : KALEM[i - 1]);
    kalan *= 1 - p[i];
  }
  return toplam + kalan * (son === 0 ? 0 : KALEM[son - 1]);
}
export const kirilabilen = (carpan) => adimYakalama(carpan).filter((x) => x > 0).length;
```

```js
// tehdit/kapsam.mjs — imza tabanli denetim bilinmeyende kac adimi kaciriyor, davranis tabanli
// kacini hala yakaliyor, yama oncesi pencerede kac kalem acik kaliyor.
import { ADIM, KALEM, DENETIM, CARPAN, adimYakalama, beklenenKalem, kirilabilen }
  from "./bilinmeyen.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 tur = (t) => DENETIM.filter((d) => d.tur === t).length;

console.log(`${ADIM.length} adim, ${DENETIM.length} denetim ` +
  `(imza ${tur("imza")}, davranis ${tur("davranis")}, yapilandirma ${tur("yapilandirma")}); ` +
  `kirilabilen halka bilinende ${kirilabilen(CARPAN.bilinen)}, bilinmeyende ` +
  `${kirilabilen(CARPAN.bilinmeyen)}; beklenen kalem ` +
  `${beklenenKalem(CARPAN.bilinen).toFixed(2)} -> ` +
  `${beklenenKalem(CARPAN.bilinmeyen).toFixed(2)}`);

const A = [-22, -14, -18, 11, 13];
console.log("\n1. denetim kalemleri ve bilinmeyendeki yakalamalari");
yaz(A, "denetim", "tur", "adim", "bilinen", "bilinmeyen");
for (const d of DENETIM)
  yaz(A, d.ad, d.tur, d.adim, d.yakalama.toFixed(2),
    (d.yakalama * CARPAN.bilinmeyen[d.tur]).toFixed(2));

const B = [-18, 10, 12, 8, 16, 24];
console.log("\n2. adim adim: hangi halka bilinmeyende de kirilabiliyor");
yaz(B, "adim", "bilinen", "bilinmeyen", "kalem", "kalan yakalama", "durum");
const pB = adimYakalama(CARPAN.bilinen), pU = adimYakalama(CARPAN.bilinmeyen);
for (let i = 0; i < ADIM.length; i++)
  yaz(B, ADIM[i], pB[i].toFixed(3), pU[i].toFixed(3), KALEM[i],
    pB[i] === 0 ? "-" : `%${((pU[i] / pB[i]) * 100).toFixed(0)}`,
    pB[i] === 0 ? "hic denetim yok" : pU[i] === 0 ? "imza dusunce kapaniyor" : "aciksa kaliyor");

const C = [-30, 8, 8, 13, 16, 13];
console.log("\n3. yama oncesi ve sonrasi pencere");
yaz(C, "faz", "gun", "olay", "kirilabilen", "beklenen kalem", "acik kalem");
const FAZ = [["acik biliniyor, duyurulmamis", 40, "bilinmeyen", 8],
  ["duyuruldu, yama yok", 12, "duyuruldu-yama-yok", 8],
  ["yama var, uygulanmadi", 25, "yama-var-uygulanmadi", 8],
  ["yama uygulandi (yapisal)", 0, "yama-var-uygulanmadi", 1]];
let acikToplam = 0;
for (const [ad, gun, c, son] of FAZ) {
  const olay = gun / 10, e = beklenenKalem(CARPAN[c], son), acik = olay * e;
  if (gun > 0) acikToplam += acik;
  yaz(C, ad, gun, olay.toFixed(1), kirilabilen(CARPAN[c]), e.toFixed(2), acik.toFixed(2));
}
const gunToplam = FAZ.reduce((t, f) => t + f[1], 0);
console.log(`pencere ${gunToplam} gun, ${(gunToplam / 10).toFixed(1)} olay, ` +
  `acik kalem ${acikToplam.toFixed(2)}; ayni pencere yapisal kirma altinda ` +
  `${((gunToplam / 10) * beklenenKalem(CARPAN["yama-var-uygulanmadi"], 1)).toFixed(2)}`);

const D = [-26, 13, 16, 15, 11];
console.log("\n4. denetim turleri tek tek");
yaz(D, "acik olan denetim turu", "kirilabilen", "beklenen kalem", "bilinene gore", "kapsam %");
const yalniz = (t) => ({ imza: t === "imza" ? 1 : 0, davranis: t === "davranis" ? 1 : 0,
  yapilandirma: t === "yapilandirma" ? 1 : 0 });
const taban = beklenenKalem(CARPAN.bilinen);
for (const [ad, c] of [["hepsi (bilinen tehdit)", CARPAN.bilinen],
  ["hepsi (bilinmeyen tehdit)", CARPAN.bilinmeyen], ["yalniz imza", yalniz("imza")],
  ["yalniz davranis", yalniz("davranis")], ["yalniz yapilandirma", yalniz("yapilandirma")],
  ["hicbiri", yalniz("yok")]]) {
  const e = beklenenKalem(c);
  yaz(D, ad, kirilabilen(c), e.toFixed(2), (e - taban).toFixed(2),
    `${((1 - e / KALEM.at(-1)) * 100).toFixed(1)}`);
}
```

```
8 adim, 8 denetim (imza 3, davranis 3, yapilandirma 2); kirilabilen halka bilinende 7, bilinmeyende 5; beklenen kalem 6.42 -> 19.69

1. denetim kalemleri ve bilinmeyendeki yakalamalari
denetim               tur           adim                  bilinen   bilinmeyen
imza-eslesmesi        imza          ilk-erisim               0.35         0.00
dosya-imzasi          imza          yurutme                  0.40         0.00
surec-agaci-sapmasi   davranis      yurutme                  0.20         0.14
baslatma-envanteri    yapilandirma  kalicilik                0.30         0.30
yetki-degisikligi     yapilandirma  yetki-yukseltme          0.25         0.25
oturum-sicramasi      davranis      yanal-gecis              0.18         0.13
veri-deseni-imzasi    imza          toplama                  0.22         0.00
cikis-hacmi-sapmasi   davranis      sizdirma                 0.45         0.32

2. adim adim: hangi halka bilinmeyende de kirilabiliyor
adim                 bilinen  bilinmeyen   kalem  kalan yakalama                   durum
kesif                  0.000       0.000       0               -         hic denetim yok
ilk-erisim             0.350       0.000       1              %0  imza dusunce kapaniyor
yurutme                0.520       0.140       2             %27          aciksa kaliyor
kalicilik              0.300       0.300       3            %100          aciksa kaliyor
yetki-yukseltme        0.250       0.250       9            %100          aciksa kaliyor
yanal-gecis            0.180       0.126      26             %70          aciksa kaliyor
toplama                0.220       0.000      41              %0  imza dusunce kapaniyor
sizdirma               0.450       0.315      48             %70          aciksa kaliyor

3. yama oncesi ve sonrasi pencere
faz                                gun    olay  kirilabilen  beklenen kalem   acik kalem
acik biliniyor, duyurulmamis        40     4.0            5           19.69        78.76
duyuruldu, yama yok                 12     1.2            5           17.23        20.67
yama var, uygulanmadi               25     2.5            7            6.42        16.05
yama uygulandi (yapisal)             0     0.0            7            0.00         0.00
pencere 77 gun, 7.7 olay, acik kalem 115.49; ayni pencere yapisal kirma altinda 0.00

4. denetim turleri tek tek
acik olan denetim turu      kirilabilen  beklenen kalem  bilinene gore   kapsam %
hepsi (bilinen tehdit)                7            6.42           0.00       86.6
hepsi (bilinmeyen tehdit)             5           19.69          13.27       59.0
yalniz imza                           3           17.09          10.67       64.4
yalniz davranis                       3           30.92          24.50       35.6
yalniz yapilandirma                   2           26.32          19.90       45.2
hicbiri                               0           48.00          41.58        0.0
```

Sayılar **ölçüm** sınıfındadır; girdileri TM16–TM18'dir.

#### Yedi Halkadan Beşi

Sekiz denetim kalemi bilinen bir tehditte **7 halkayı** kırılabilir kılar; sekiz adımın yalnız
keşif adımı boştur. Aynı sekiz denetim bilinmeyen bir tehditte **5 halka** bırakır. Kayıp iki
halkadır ve bu iki halka rastgele seçilmemiştir: ilk erişim ve toplama, karşılarında yalnız imza
tabanlı denetim bulunan iki adımdır.

İkinci tablonun **kalan yakalama** sütunu her adım için oranı verir. Kalıcılık ve yetki yükseltme
adımlarında oran **%100**'dür — bu iki adımın denetimi yapılandırma tabanlıdır ve bir açılış
girişinin varlığı ya da bir yetkinin değişmesi, tehdidin bilinip bilinmemesinden bağımsız olarak
görülür. Yanal geçiş ve sızdırmada oran %70'tir. Yürütmede oran **%27**'ye düşer, çünkü o adımdaki
0,520'lik yakalamanın büyük bölümünü imza tabanlı denetim taşımaktadır; imza düştüğünde geriye
yalnız davranış tabanlı denetimin 0,140'ı kalır.

Beklenen kalem 6,42'den **19,69'a** çıkar — üç katından fazla. Kırılabilen halka sayısı 7'den 5'e
inerken, yani %29 azalırken, beklenen kalem %207 artar. **Halka sayısı ile kalem sayısı aynı
oranda hareket etmez**, çünkü kaybedilen iki halkadan biri (ilk erişim) zincirin en ucuz kırma
noktasıdır ve öteki (toplama) 41 kalemin hemen öncesindedir.

Birinci tablo aynı ayrımı denetim tarafından yazar. Sekiz kalemin üçü imza, üçü davranış, ikisi
yapılandırma tabanlıdır. Envanter sayısıyla bakıldığında üçe üçe iki gibi dengeli bir dağılım
görünür; bilinmeyen sütununda ise üç kalem sıfıra iner ve envanterin **%37,5'i** bir anda işlevsiz
kalır. Denetim envanterinin büyüklüğü ile sıfırıncı gün dayanıklılığı arasında bir bağ yoktur;
bağ, kalemlerin **hangi türde** olduğu ve **hangi adımlara** düştüğüyle kurulur.

#### Hangi Denetim Türü Ayakta Kalıyor

Dördüncü tablo türleri tek tek yalıtır ve beklenmedik bir sıralama verir. Bilinen bir tehditte
**yalnız imza** tabanlı üç denetim 17,09 kalem bırakır; **yalnız davranış** tabanlı üç denetim
30,92 bırakır. Aynı sayıda denetim kalemiyle imza tabanlı küme neredeyse iki kat iyidir, çünkü
yakalama oranları daha yüksektir (0,35, 0,40, 0,22 karşısında 0,20, 0,18, 0,45) ve ikisi zincirin
başına yerleşmiştir.

Bilinmeyen bir tehditte aynı üç imza kaleminin katkısı **sıfırdır**. Ayakta kalan yapı davranış ve
yapılandırma tabanlı beş kalemdir ve bunlar birlikte 19,69 kalem bırakır. İki tür ayrı ayrı zayıf
(30,92 ve 26,32), birlikte bilinen tehdit ölçüsünün üç katı kadar kalem bırakır — ama **hiçbiri
sıfır değildir**. Hiçbir denetimin olmadığı satırda beklenen kalem 48,00'dır, yani zincirin
tamamıdır.

Karar buradan çıkar. İmza tabanlı denetim bilinen tehditte en verimli araçtır ve bırakılması için
bir neden yoktur; bilinmeyen tehditte ise hiçbir şey yapmaz. Yapılandırma tabanlı denetim her iki
durumda aynı işi görür ve kapsamı en dar olandır (yalnız 2 halka). **Bir denetim envanterinin
sıfırıncı güne dayanıklılığı, imza dışı kalemlerin kaç halkada bulunduğuyla ölçülür** — bu kümede
5 halka.

#### Yama Öncesi Pencere

Üçüncü tablo pencereyi üç faza böler ve her fazda kaç kalemin açık kaldığını sayar. Kurgu ağda
her on günde bir bu sınıfa giren bir olay varsayılır.

İlk faz açığın bilindiği ama kamuya duyurulmadığı dönemdir: 40 gün, 4,0 olay, olay başına 19,69
kalem, toplam **78,76 kalem**. İkinci faz duyuru ile düzeltmenin yayımlanması arasıdır: 12 gün.
Burada imza hâlâ yoktur ama davranış tabanlı denetimlerin eşikleri artık o davranışa ayarlanmıştır
ve beklenen kalem 19,69'dan 17,23'e iner. Kırılabilen halka sayısı ise **5'te kalır** — eşik
ayarlamak yeni bir halka açmaz, var olanı biraz keskinleştirir.

Üçüncü faz düzeltme yayımlanmış ama uygulanmamış dönemdir: 25 gün. İmza örüntüsü yayımlandığı için
kırılabilen halka 7'ye döner ve beklenen kalem 6,42'ye iner. Yine de bu faz **16,05 kalem** açık
bırakır, çünkü düzeltme yalnız yayımlanmıştır.

Fazların kendi içinde bir sıralaması vardır ve bu sıralama beklenenin tersidir. Süre olarak en uzun
faz ilk fazdır (40 gün) ve kalem olarak da en ağırıdır; ama ikinci faz yalnız 12 gün sürmesine
rağmen olay başına 17,23 kalem taşır, üçüncü faz 25 gün sürdüğü halde olay başına 6,42 taşır.
**Pencere kısaldıkça kalem düşmez; kalem, o fazda kaç halkanın kırılabildiğine göre düşer.**

Toplam pencere 77 gün, 7,7 olay ve **115,49 kalemdir**. Aynı pencere düzeltme uygulanmış olsaydı
**0,00** verirdi: uygulanan düzeltme bir denetim değil, üçüncü derste ölçülen **yapısal kırmadır**
— önkoşulu ortadan kaldırır ve zincir ikinci adıma hiç geçemez. Bu kursun bütün ölçümlerinde
tekrarlanan sonuç burada en keskin biçimini alır: 115,49 kalemin 78,76'sı ilk fazda, yani hiçbir
duyurunun olmadığı 40 günde birikir ve o fazda yapılabilecek tek şey imza dışı denetimlerin kaç
halkada bulunduğudur.

#### Özet

- Sıfırıncı gün bir sıfat değil, bir kapsam kaybıdır: sekiz denetim bilinen tehditte 7 halkayı
  kırılabilir kılar, bilinmeyende 5'ini.
- Kaybedilen iki halka, karşısında yalnız imza tabanlı denetim bulunan adımlardır; yapılandırma
  tabanlı denetimin yakalaması %100 korunur, davranış tabanlının %70'i kalır, imza tabanlının
  %0'ı.
- Kırılabilen halka %29 azalırken beklenen kalem 6,42'den 19,69'a, yani %207 artar; halka sayısı
  ile kalem sayısı aynı oranda hareket etmez.
- Bilinen tehditte yalnız imza tabanlı üç denetim 17,09, yalnız davranış tabanlı üç denetim 30,92
  kalem bırakır; bilinmeyen tehditte imzanın katkısı sıfır, kalan beş kalemin bıraktığı 19,69'dur.
- 77 günlük pencere 115,49 kalem açık bırakır; bunun 78,76'sı duyuru öncesi 40 günde birikir,
  16,05'i düzeltme yayımlanmış ama uygulanmamışken.
- Uygulanan düzeltme bir denetim değil yapısal kırmadır: aynı pencere 0,00 kalem verir.

#### Sonraki Adım

Bu konu zinciri model olarak kurdu ve hangi halkanın kırılabildiğini saydı. Aktörler yetenek ve
motivasyonla ayrıldı ve her düzeyin kaç adım geçtiği yazıldı; süre ekseninde kaç günün hiçbir
denetimin görmediği gün olduğu ölçüldü; önkoşullar yazıldı ve erken kırma kazancı hesaplandı;
teknikler adımlara eşlendi ve hiç denetimi olmayan adım sayıldı; dört köşeli ilişki modeli bağlantı
sayımına çevrildi; ve bilinmeyen tehditte kapsamın nereye düştüğü yazıldı.

Bütün bu ölçümlerin ortak bir yeri vardı. Her zincirin ilk halkası bir **teknik** adım olarak
yazıldı: keşif, sonra ilk erişim. Oysa ilk erişim çoğu kez bir istismarla değil, **bir kişinin
verdiği kararla** açılır — bir iletiye verilen yanıt, bir telefonda söylenen bir cümle, bir kapıdan
birlikte geçmeye izin veren bir an. O halkanın önkoşulu bir yapılandırma zayıflığı değil, güven ya
da aciliyet duygusudur ve karşısına konacak denetim bir kayıt örüntüsü değildir. Sonraki konu —
**Sosyal Mühendislik** — zincirin bu ilk halkasını ölçer.

## Sosyal Mühendislik

İnsan katmanını zincirin bir halkası olarak ölçmek: karar anındaki doğrulama kalemi sayısı ve süre baskısının kısalttığı bütçe, kimlik avı türlerinin ayırt edici gösterge sayısı ve eşik seçiminin bedeli, kısa mesaj ile sesli aramanın doğrulanabilirlik farkı, fiziksel tekniklerin erişim kalemi cinsinden sayımı, taklit alan adı adaylarının düzenleme uzaklığı ve görsel benzerlikle tespiti, paylaşılan dış bağımlılık üzerinden kurulan su kuyusu saldırıları ve farkındalık programlarının iki ölçütle ölçülen kalıcılığı.

### Sosyal Mühendisliğin Temeli

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/sosyal-muhendisligin-temeli

Karar anını bir süre bütçesi olarak modellemek: yedi doğrulama kaleminin baskı altında kaçının kullanılabildiği, on iki talepte kaç sahte talebin geçtiği, altı adımlık zincirin kaç halkasında denetim bulunduğu ve geri arama yordamının durdurduğu talep ile kestiği meşru iş.

Önceki konu saldırıyı adım dizisi olarak modelledi ve her adımın karşısına bir denetim koymayı
denedi. O modelde zincirin ilk halkası hep teknikti: kayıtsız bir hesap, kapatılmamış bir uç,
denetlenmeyen bir bağlantı. Bu konunun sorusu farklıdır. Zincirin ilk halkası bir kişinin verdiği
karar olduğunda o kararın karşısına ne konabilir ve kaç tane konabilir?

Bir talebi doğrulamak zaman ister ve doğrulama kalemlerinin her birinin kendi süresi vardır.
Süre baskısı bu yüzden bir üslup meselesi değil, ölçülebilir bir kısıttır: karar vericiye bırakılan
saniye azaldıkça kullanabildiği doğrulama kalemi sayısı düşer. Güven de aynı biçimde ölçülür —
doğrulanamayan bir iç ayrıntı, bir kalemin yerini alan bir kısayoldur. Bu ders o iki etkeni tek bir
sayıya, **kullanılabilen kalem sayısına** indirger ve zincirin hangi halkasında kırıldığını sayar.
Burada modellenen adımların yazılı yetki ve tanımlı kapsam dışında denenmesi hem yasadışı hem de
meslek dışıdır.

- **SM1.** Talep kümesi, doğrulama kalemleri ve süreleri kurgusal bölgesel ölçüm ağının abone
  hizmetleri masasına aittir. Gerçek bir talep işlenmiyor; ölçülen şey `node` ile kurulan modeldir.
- **SM2.** Her doğrulama kaleminin sabit bir süresi var. Gerçekte süre kişiye ve o anki yüke göre
  değişir; sabit süre kalemlerin ucuzdan pahalıya sıralamasını korur, bu sıralama ölçünün temelidir.
- **SM3.** Karar verici kalemleri ucuzdan pahalıya uygular. Bu **en iyimser** varsayımdır; gerçek
  sıra sezgiyle belirlenir ve aynı bütçeye daha az kalem sığdırır.
- **SM4.** Talebin gerçek sınıfı modelde bilinir. Gerçekte sınıf ancak sonradan bilinir; bilindiği
  varsayılıyor ki geçen sahte talep ile kesilen meşru iş ayrı ayrı sayılabilsin.
- **SM5.** Bir kalem talebi ya eler ya elemez. Kısmi şüphe, ikinci bir soru sorma ve talebi askıya
  alma modellenmedi.
- **SM6.** Süre baskısı tek bir sayıya indirgendi: karar için kalan saniye. Otorite, karşılıklılık
  ve utanma gibi etkenler ayrı ayrı modellenmedi; hepsi bütçeyi kısaltan aynı sayı olarak taşınır.

#### Karar Anı Bir Süre Bütçesidir

Model üç parçadan oluşur. Doğrulama kalemleri süreleriyle birlikte listelenir; talepler sınıfları,
türleri, kendilerine bırakılan süre bütçesi ve tutarlarıyla verilir; her talebin karşısında onu
**eleyebilecek** kalemler yazılır. Eleyen kalem listesi bir tahmin değil, modelin tanımıdır: o
kalem uygulanırsa talep durur, uygulanmazsa geçer.

Talep türü ayrı bir sütun olarak taşınır çünkü yordamların kapsamı türle çizilir. Erişim, ödeme ve
kayıt olmak üzere üç tür var; bir yordamın hangi türe değdiği, hangi zincirin kırıldığını doğrudan
belirler ve dersin sonunda kapsam dışı kalan tek türün bedeli sayılacaktır.

```js
// karar.mjs — dogrulama kalemleri, talep kumesi ve karar zinciri; model
export const KALEM = { // ad: kalemi uygulamanin saniye maliyeti
  'tutari esikle karsilastirma': 20, 'gonderen adresini kayitla karsilastirma': 40,
  'is emri numarasini sistemde arama': 60, 'yetki listesinde talep sahibini bulma': 90,
  'gecmis talep kaydina bakma': 120, 'kayitli numaradan geri arama': 180, 'amir onayi isteme': 300,
};
const [T, G, I, Y, K, A, O] = Object.keys(KALEM);
export const ESIK = 2000; // kurgu odeme birimi
// [talep, sinif, tur, baski butcesi (sn), tutar, talebi eleyen kalemler]
export const TALEP = [
  ['sifre sifirlama', 'sahte', 'erisim', 60, 0, [A, Y]],
  ['odeme hesabi degisikligi', 'sahte', 'odeme', 120, 4800, [A, K]],
  ['acil odeme onayi', 'sahte', 'odeme', 30, 9500, [T, O, A]],
  ['is emri disi saha erisimi', 'sahte', 'erisim', 90, 0, [I, A]],
  ['abone kaydi disa aktarimi', 'sahte', 'kayit', 180, 0, [Y, O]],
  ['planli bakim gecici erisimi', 'mesru', 'erisim', 300, 0, []],
  ['yeni saha calisani hesabi', 'mesru', 'erisim', 600, 0, []],
  ['donem sonu fatura onayi', 'mesru', 'odeme', 240, 12000, []],
  ['sayac degisimi odemesi', 'mesru', 'odeme', 120, 1500, []],
  ['sube ucunda yazici tanimi', 'mesru', 'kayit', 480, 0, []],
  ['abone itirazi kayit sorgusu', 'mesru', 'kayit', 90, 0, []],
  ['kesinti ekibine gecici yetki', 'mesru', 'erisim', 45, 0, []],
];
// zincirin adimlari: [adim, onkosul, adimi goren denetim, adim bitince dusen kalem]
export const ZINCIR = [
  ['gorev bilgisi toplama', 'disaridan gorulebilen gorev listesi', null, 0],
  ['bahane kurma', 'ic bir surecin adi', null, 0],
  ['temas kurma', 'ulasilabilir kanal', 'kanal kayitli mi', 1],
  ['guven isareti verme', 'dogrulanamayan ic ayrinti', 'ayrinti kayitla karsilastirilir mi', 1],
  ['aciliyet yaratma', 'karar vericinin sure butcesi', 'sure butcesi yordamla sabit mi', 2],
  ['eylem talebi', 'yetkili karar verici', 'geri arama zorunlu mu', 5],
];
export function kalemler(butce) { // butceye sigan dogrulama kalemleri, ucuzdan pahaliya
  let t = 0; const secili = [];
  for (const [ad, sn] of Object.entries(KALEM)) { if (t + sn > butce) break; t += sn; secili.push(ad); }
  return { secili, sure: t };
}
export const yordamKapsami = (t) => t[2] === 'erisim' || (t[2] === 'odeme' && t[4] > ESIK);
```

#### Baskı Bütçesi Kalem Sayısını Nasıl Düşürüyor

```js
// kosum1.mjs — sure baskisi altinda kullanilabilen dogrulama kalemi sayisi ve gecen sahte talep
import { KALEM, TALEP, kalemler } from './karar.mjs';

console.log(`${Object.keys(KALEM).length} dogrulama kalemi, toplam ${Object.values(KALEM).reduce((a, b) => a + b, 0)} sn; ` +
  `${TALEP.length} talep, ${TALEP.filter((t) => t[1] === 'sahte').length} sahte\n`);
console.log(`${'talep'.padEnd(28)} ${'sinif'.padStart(5)} ${'baski'.padStart(5)} ${'kalem'.padStart(5)} ${'sonuc'.padStart(6)}`);
let gecen = 0, duran = 0;
for (const t of TALEP) {
  const { secili } = kalemler(t[3]);
  const durdu = t[5].some((k) => secili.includes(k));
  if (t[1] === 'sahte') { durdu ? duran++ : gecen++; }
  console.log(`${t[0].padEnd(28)} ${t[1].padStart(5)} ${String(t[3]).padStart(5)} ${String(secili.length).padStart(5)} ` +
    `${(t[1] === 'sahte' ? (durdu ? 'durdu' : 'gecti') : 'gecti').padStart(6)}`);
}
console.log(`\nbaski butcesine gore kullanilabilen kalem sayisi:`);
for (const b of [30, 60, 120, 180, 300, 600]) {
  const { secili, sure } = kalemler(b);
  console.log(`  ${String(b).padStart(3)} sn -> ${secili.length}/${Object.keys(KALEM).length} kalem (${sure} sn), ` +
    `disarida kalan: ${Object.keys(KALEM).filter((k) => !secili.includes(k)).length}`);
}
console.log(`\nyordamsiz karar: ${duran} sahte talep durdu, ${gecen} gecti`);
console.log(`gecen sahte talepler: ${TALEP.filter((t) => t[1] === 'sahte' && !t[5].some((k) => kalemler(t[3]).secili.includes(k))).map((t) => `${t[0]} (${t[3]} sn)`).join('; ')}`);
```

```
7 dogrulama kalemi, toplam 810 sn; 12 talep, 5 sahte

talep                        sinif baski kalem  sonuc
sifre sifirlama              sahte    60     2  gecti
odeme hesabi degisikligi     sahte   120     3  gecti
acil odeme onayi             sahte    30     1  durdu
is emri disi saha erisimi    sahte    90     2  gecti
abone kaydi disa aktarimi    sahte   180     3  gecti
planli bakim gecici erisimi  mesru   300     4  gecti
yeni saha calisani hesabi    mesru   600     6  gecti
donem sonu fatura onayi      mesru   240     4  gecti
sayac degisimi odemesi       mesru   120     3  gecti
sube ucunda yazici tanimi    mesru   480     5  gecti
abone itirazi kayit sorgusu  mesru    90     2  gecti
kesinti ekibine gecici yetki mesru    45     1  gecti

baski butcesine gore kullanilabilen kalem sayisi:
   30 sn -> 1/7 kalem (20 sn), disarida kalan: 6
   60 sn -> 2/7 kalem (60 sn), disarida kalan: 5
  120 sn -> 3/7 kalem (120 sn), disarida kalan: 4
  180 sn -> 3/7 kalem (120 sn), disarida kalan: 4
  300 sn -> 4/7 kalem (210 sn), disarida kalan: 3
  600 sn -> 6/7 kalem (510 sn), disarida kalan: 1

yordamsiz karar: 1 sahte talep durdu, 4 gecti
gecen sahte talepler: sifre sifirlama (60 sn); odeme hesabi degisikligi (120 sn); is emri disi saha erisimi (90 sn); abone kaydi disa aktarimi (180 sn)
```

Alt tablo dersin ilk sayısını veriyor. Masanın elinde yedi doğrulama kalemi var ve hepsini
uygulamak 810 saniye sürüyor. Otuz saniyelik bir bütçede bunlardan **biri** kullanılabiliyor, altısı
dışarıda kalıyor. Yüz seksen saniyede bile üç kalem kullanılabiliyor; en pahalı iki kalem — geri
arama ve amir onayı — ancak altı yüz saniyelik bir bütçede sıraya girebiliyor. Kalem sayısı bütçeyle
doğru orantılı değil, basamaklı düşüyor: yüz yirmi ile yüz seksen saniye arasında hiçbir yeni kalem
eklenmiyor, çünkü sıradaki kalem doksan saniye ve toplam iki yüz onu buluyor.

Üst tabloda bunun sonucu görünüyor. Beş sahte talebin dördü geçiyor ve geçenlerin ortak yanı
kalemlerin dışarıda bırakılması: sahte taleplerin her birini eleyecek kalem modelde **var**, ama
bırakılan bütçeye sığmıyor. Duran tek talep en kısa bütçeyi bırakan taleptir — otuz saniye — ve
onu duran şey en ucuz kalemdir. Tutarı eşikle karşılaştırmak yirmi saniye sürer ve dokuz bin beş
yüz birimlik bir ödemeyi tek başına işaretler. Bu, ölçünün ters yönlü ilk bulgusudur: baskıyı
artırmak zincire her zaman yaramaz, çünkü çok kısa bir bütçe en ucuz kalemi de tetikleyecek kadar
göze çarpar.

Yordamsız karar bu yüzden dört sahte talebi geçiriyor. Karar vericinin dikkatsizliği değil,
bütçesinin kısalığı ölçülüyor. Aynı kişi altı yüz saniyeyle altı kalem uygulayabiliyor.

#### Zincir, Halkalar ve Erken Kırma Kazancı

```js
// kosum2.mjs — zincir adimlari, kirilabilen halka ve geri arama yordaminin uc sutunu
import { TALEP, ZINCIR, KALEM, kalemler, yordamKapsami } from './karar.mjs';

const GERI = 'kayitli numaradan geri arama';
let kum = 0; const kumul = ZINCIR.map((a) => (kum += a[3]));
console.log(`${'#'.padStart(2)} ${'adim'.padEnd(22)} ${'onkosul'.padEnd(34)} ${'denetim'.padStart(7)} ${'kumul. kalem'.padStart(12)}`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(22)} ${a[1].padEnd(34)} ` +
  `${(a[2] ? 'var' : 'yok').padStart(7)} ${String(kumul[i]).padStart(12)}`));
const kirilabilir = ZINCIR.map((a, i) => (a[2] ? i : -1)).filter((i) => i >= 0);
const erken = kirilabilir[0], gec = kirilabilir[kirilabilir.length - 1];
console.log(`\nzincir ${ZINCIR.length} adim; denetimi olan ${kirilabilir.length}, hic denetimi olmayan ${ZINCIR.length - kirilabilir.length}`);
console.log(`en erken kirilabilen halka ${erken + 1} -> o ana kadar dusen kalem ${erken ? kumul[erken - 1] : 0}`);
console.log(`en gec kirilabilen halka  ${gec + 1} -> o ana kadar dusen kalem ${kumul[gec - 1]}`);
console.log(`hic kirilmazsa dusen kalem ${kumul[ZINCIR.length - 1]}; erken kirma kazanci ${kumul[gec - 1] - (erken ? kumul[erken - 1] : 0)} kalem`);

console.log(`\ngeri arama yordami (${KALEM[GERI]} sn, tur 'erisim' ya da esik ustu 'odeme'):`);
let durdu = 0, kacti = 0, kesilen = [], eksure = 0;
for (const t of TALEP) {
  const kapsam = yordamKapsami(t);
  const uygulanan = kalemler(t[3]).secili.concat(kapsam ? [GERI] : []);
  if (kapsam) eksure += KALEM[GERI];
  if (t[1] === 'sahte') { t[5].some((k) => uygulanan.includes(k)) ? durdu++ : kacti++; }
  else if (kapsam && t[3] < KALEM[GERI]) kesilen.push(`${t[0]} (${t[3]} sn)`);
}
console.log(`  kapsama giren talep ${TALEP.filter(yordamKapsami).length}/${TALEP.length}, eklenen dogrulama suresi ${eksure} sn`);
console.log(`  duran sahte talep ${durdu}/5, kacan ${kacti}`);
console.log(`  kacan: ${TALEP.filter((t) => t[1] === 'sahte' && !yordamKapsami(t) && !t[5].some((k) => kalemler(t[3]).secili.includes(k))).map((t) => `${t[0]} (tur ${t[2]})`).join('; ')}`);
console.log(`  kesilen mesru is ${kesilen.length}: ${kesilen.join('; ')}`);
```

```
 # adim                   onkosul                            denetim kumul. kalem
 1 gorev bilgisi toplama  disaridan gorulebilen gorev listesi     yok            0
 2 bahane kurma           ic bir surecin adi                     yok            0
 3 temas kurma            ulasilabilir kanal                     var            1
 4 guven isareti verme    dogrulanamayan ic ayrinti              var            2
 5 aciliyet yaratma       karar vericinin sure butcesi           var            4
 6 eylem talebi           yetkili karar verici                   var            9

zincir 6 adim; denetimi olan 4, hic denetimi olmayan 2
en erken kirilabilen halka 3 -> o ana kadar dusen kalem 0
en gec kirilabilen halka  6 -> o ana kadar dusen kalem 4
hic kirilmazsa dusen kalem 9; erken kirma kazanci 4 kalem

geri arama yordami (180 sn, tur 'erisim' ya da esik ustu 'odeme'):
  kapsama giren talep 8/12, eklenen dogrulama suresi 1440 sn
  duran sahte talep 4/5, kacan 1
  kacan: abone kaydi disa aktarimi (tur kayit)
  kesilen mesru is 1: kesinti ekibine gecici yetki (45 sn)
```

Zincir altı adım ve ilk iki adımın karşısında hiçbir denetim yok. Bunun nedeni adımların
zararsızlığı değil, savunmanın görüş alanının dışında kalmalarıdır: görev bilgisinin dışarıdan
görülebilir olması ve bir iç sürecin adının bilinmesi, hiçbir kayda düşmeyen hazırlık adımlarıdır.
Zincirin ilk iki halkası bu yüzden **sayılamaz**, yalnız daraltılabilir.

Kırılabilen dört halka üçüncü adımda başlıyor ve o noktada henüz hiçbir kalem düşmemiş. Altıncı
adımda kırmak ise dört kalem düşmüşken gelir. İkisi arasındaki fark erken kırma kazancıdır: **dört
kalem**. Zincir hiç kırılmazsa düşen kalem dokuza çıkar, yani son adımı geçirmenin kendi başına
bedeli beş kalemdir. Bu üç sayı bir arada okunduğunda savunmanın nereye yatırım yapacağı bir görüş
değil, bir sıralama olur.

Geri arama yordamı bunu üç sütunla gösteriyor. Yordam on iki talebin sekizini kapsıyor ve dört
sahte talebi durduruyor; yordamsız karar yalnız birini durdurmuştu. Kaçan tek talep kapsam
dışındadır: kayıt türündeki bir dışa aktarım isteği ne erişim ne de eşik üstü ödemedir, dolayısıyla
yordam ona hiç değmez. Burada zincirin kırılamadığı durum ölçüye giriyor — yordam bu talep için bir
halka değil, ölçü tespite kayıyor: talep geçer, ancak dışa aktarımın kaydı sonradan sayılabilir.

Bedel iki kalemde yazılır. Sekiz talepte yüz seksener saniye eklenerek toplam 1.440 saniyelik
doğrulama süresi doğuyor. Kesilen meşru iş bir tanedir ve hangi iş olduğu önemlidir: kesinti
ekibine geçici yetki verme talebi kırk beş saniyelik bir bütçeyle geliyor, geri arama yüz seksen
saniye sürüyor ve iş yordamın içine sığmıyor. Yordamın durdurduğu tek meşru iş, en acil olanıdır.
Bu bir kusur değil, yordam tasarımının kaçınılmaz sonucudur: süre baskısını denetime çeviren her
yordam, gerçekten acil olan işi de aynı denetime sokar.

#### Özet

- 7 doğrulama kaleminin tamamı 810 saniye sürüyor. 30 saniyelik bütçede 1 kalem, 180 saniyede 3,
  600 saniyede 6 kalem kullanılabiliyor; kalem sayısı bütçeyle basamaklı artıyor.
- Yordamsız kararda 5 sahte talebin 4'ü geçiyor. Her birini eleyecek kalem modelde var, ama
  bırakılan bütçeye sığmıyor; duran tek talep en kısa bütçeliydi ve onu en ucuz kalem durdurdu.
- Zincir 6 adım; 4 adımda denetim var, ilk 2 adım hiçbir kayda düşmüyor. Bu iki halka sayılamaz,
  yalnız dışarıdan görülen bilgi daraltılarak zorlaştırılabilir.
- En erken kırılabilen halka 3. adımdır ve orada düşen kalem 0'dır; 6. adımda kırmak 4 kalem düşmüş
  demektir. Erken kırma kazancı 4 kalem, zincirin hiç kırılmamasının bedeli 9 kalemdir.
- Geri arama yordamı 12 talebin 8'ini kapsıyor, 4 sahte talebi durduruyor; kapsam dışı kalan 1
  talepte hiçbir halka kırılmıyor ve ölçü tespite kayıyor.
- Yordamın bedeli 1.440 saniye ek doğrulama ve 1 kesilen meşru iştir. Kesilen iş, bütçesi yordamın
  süresinden kısa olan en acil taleptir.

#### Sonraki Adım

Bu derste talep karar vericiye ulaşmış sayıldı ve ölçülen şey kararın kendisiydi. Zincirin üçüncü
halkası — temas kurma — tek satırda geçildi, oysa temasın taşıdığı ileti ölçülebilir bir nesnedir.
Bir ileti kümesinde meşru olanla sahte olanı ayıran şey üslup değil, sayılabilir göstergelerdir:
gönderenin daha önce görülmemiş olması, yanıt adresinin gönderenden ayrışması, bağlantı hedefinin
metinden farklı olması. Sonraki dersin sorusu budur: bir ileti kümesinde kaç ayırt edici gösterge
sayılabiliyor, seçilen eşik kaç sahte iletiyi kaçırıyor ve kaç meşru iletiyi yanlış işaretliyor —
ve hedef daraldıkça gösterge sayısı neden düşüyor.

### Kimlik Avı Türleri

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/kimlik-avi-turleri

Yirmi altı iletilik kurgu bir kümede on gösterge türünü saymak: toplu, hedefli ve yönetici hedefli iletilerin ortalama gösterge sayısı farkı, eşik taramasında kaçırılan ile yanlış işaretlenenin ters yönü, eşikten bağımsız işaretlenen meşru iletiler ve beş adımlık zincirin erken kırma kazancı.

Önceki ders talebi karar vericiye ulaşmış saydı ve zincirin üçüncü halkasını — temas kurma — tek
satırda geçti. Oysa temasın taşıdığı ileti ölçülebilir bir nesnedir: sayılabilir göstergeler
taşır ve bu göstergeler bir sayıya toplanabilir. Bu ders o sayıyı üretir ve seçilen eşiğin
neyi kaçırdığını, neyi yanlış işaretlediğini birlikte yazar.

Ölçülen şey iletinin metni değildir. Metin sonsuz biçimde değişir; gösterge türü değişmez.
Gönderenin daha önce görülmemiş bir alan adından gelmesi, gönderen doğrulama kaydının geçmemesi,
bağlantı hedefinin metinde yazandan ayrışması — bunların her biri bir denetimin **görebileceği**
kalemdir. Gönderen doğrulama kayıtlarının nasıl kurulduğu başka bir kursta ölçülmüştü; burada o
kaydın sonucu on göstergeden yalnız biridir. Asıl soru şudur: kimlik avı hedef daraldıkça neden
daha az gösterge taşır ve bu, eşiğe ne yapar?

- **SM7.** İleti kümesi kurgusal bölgesel ölçüm ağının saha ekibi posta kutusuna aittir. Gerçek
  bir ileti yok; modelde yalnız **gösterge türü ve sayısı** taşınır, hiçbir ileti metni,
  konu satırı ya da bağlantı yer almaz.
- **SM8.** Her iletinin gerçek sınıfı modelde bilinir. Gerçekte sınıf ancak inceleme sonrası
  bilinir; bilindiği varsayılıyor ki kaçırılan ile yanlış işaretlenen ayrı ayrı sayılabilsin.
- **SM9.** Gösterge ağırlıkları sabittir ve puan ağırlıkların toplamıdır. Gerçek düzeneklerde
  ağırlık öğrenilir ve kayar; sabit ağırlık eğrinin biçimini basitleştirir, iki yanlışın ters
  yönünü değiştirmez.
- **SM10.** Küme sınıf oranı bakımından gerçekçi değildir: on altı sahte ve on meşru ileti var.
  Gerçek bir kutuda meşru ileti sayısı çok daha büyüktür ve yanlış işaretlenen sayısı aynı oranda
  büyür. Model bu yüzden yanlış pozitifi **eksik** gösterir.
- **SM11.** Bir ileti ya işaretlenir ya geçer. Karantina, uyarı şeridi ve kullanıcıya sorma gibi
  ara durumlar modellenmedi.
- **SM12.** Zincir tek bir kalıba indirgendi: teslim, etkileşim, kimlik bilgisi girişi, kullanım.
  Ek dosyayla ilerleyen ve doğrudan ödeme isteyen değişkeler ayrı zincir olarak sayılmadı.

#### Gösterge Türleri ve Sınıflar

```js
// ileti.mjs — gosterge turleri ve iletilerin gosterge kumesi; model (ileti icerigi yer almaz)
export const GOSTERGE = { // gosterge turu: ayirt edicilik agirligi
  'gonderen alan adi ilk kez goruluyor': 3, 'gonderen dogrulama kaydi gecmiyor': 3,
  'gonderen alani korunan ada benziyor': 3, 'baglanti hedefi metinden ayrisiyor': 3,
  'yanit adresi gonderenden farkli': 2, 'beklenmedik ek dosya turu': 2,
  'alici kumesi genis': 1, 'olagandisi gonderim saati': 1,
  'yanit zinciri disinda ilk temas': 1, 'sure baskisi ifadesi': 1,
};
const [A, D, B, L, Y, E, K, S, I, U] = Object.keys(GOSTERGE);
export const SINIF = ['toplu', 'hedefli', 'yonetici', 'mesru'];
// [ileti kimligi, sinif, tasidigi gostergeler]
export const ILETI = [
  ['T1', 'toplu', [A, D, L, Y, K, S, U]], ['T2', 'toplu', [A, D, L, E, K, U]],
  ['T3', 'toplu', [A, D, Y, K, I, U]], ['T4', 'toplu', [A, B, L, K, S, U]],
  ['T5', 'toplu', [A, D, L, K, U]], ['T6', 'toplu', [D, L, Y, K, S]],
  ['T7', 'toplu', [A, D, E, K, I, U]], ['T8', 'toplu', [A, L, K, S, I, U]],
  ['H1', 'hedefli', [B, L, I, U]], ['H2', 'hedefli', [A, L, I]],
  ['H3', 'hedefli', [B, Y, U]], ['H4', 'hedefli', [D, L]], ['H5', 'hedefli', [B, E, I]],
  ['Y1', 'yonetici', [B, U]], ['Y2', 'yonetici', [L]], ['Y3', 'yonetici', [B, I]],
  ['M1', 'mesru', [I]], ['M2', 'mesru', [K, S]], ['M3', 'mesru', []],
  ['M4', 'mesru', [A, S, I]], ['M5', 'mesru', [E]], ['M6', 'mesru', [S, U]],
  ['M7', 'mesru', [Y]], ['M8', 'mesru', [K, S, I, U]],
  ['M9', 'mesru', [A, D, L, Y, K]], ['M10', 'mesru', [A, D, Y, I]],
];
export const puan = (m) => m[2].reduce((a, g) => a + GOSTERGE[g], 0);
export const sahte = (m) => m[1] !== 'mesru';
export function esikte(e) {
  const isaret = ILETI.filter((m) => puan(m) >= e);
  return { kacan: ILETI.filter((m) => sahte(m) && puan(m) < e), yanlis: isaret.filter((m) => !sahte(m)),
    yakalanan: isaret.filter(sahte) };
}
// [adim, onkosul, adimi goren denetim, adim bitince dusen kalem]
export const ZINCIR = [
  ['ileti hazirlama', 'hedef adres listesi', null, 0],
  ['teslim', 'gecerli posta yolu', 'gosterge esigi', 1],
  ['acilma ve etkilesim', 'alicinin ilgisi', 'kullanici bildirimi', 1],
  ['kimlik bilgisi girisi', 'inandirici toplama noktasi', 'ikinci etmen', 3],
  ['toplanan bilginin kullanimi', 'gecerli oturum', 'olagandisi oturum tespiti', 6],
];
```

```js
// kosum1.mjs — gosterge basina sinif dagilimi ve uc saldiri turunun gosterge sayisi farki
import { GOSTERGE, ILETI, SINIF, puan, sahte } from './ileti.mjs';

console.log(`${ILETI.length} ileti, ${ILETI.filter(sahte).length} sahte; ${Object.keys(GOSTERGE).length} gosterge turu, ` +
  `en yuksek puan ${Object.values(GOSTERGE).reduce((a, b) => a + b, 0)}\n`);
console.log(`${'gosterge'.padEnd(36)} ${'ag.'.padStart(3)} ${'toplu'.padStart(5)} ${'hedefli'.padStart(7)} ` +
  `${'yonetici'.padStart(8)} ${'mesru'.padStart(5)}`);
for (const [g, a] of Object.entries(GOSTERGE)) {
  const c = SINIF.map((s) => ILETI.filter((m) => m[1] === s && m[2].includes(g)).length);
  console.log(`${g.padEnd(36)} ${String(a).padStart(3)} ${String(c[0]).padStart(5)} ${String(c[1]).padStart(7)} ` +
    `${String(c[2]).padStart(8)} ${String(c[3]).padStart(5)}`);
}
console.log(`\n${'sinif'.padEnd(9)} ${'ileti'.padStart(5)} ${'ort. gosterge'.padStart(13)} ${'ort. puan'.padStart(9)} ` +
  `${'en dusuk puan'.padStart(13)} ${'en yuksek puan'.padStart(14)}`);
for (const s of SINIF) {
  const k = ILETI.filter((m) => m[1] === s), p = k.map(puan);
  console.log(`${s.padEnd(9)} ${String(k.length).padStart(5)} ` +
    `${(k.reduce((a, m) => a + m[2].length, 0) / k.length).toFixed(2).padStart(13)} ` +
    `${(p.reduce((a, b) => a + b, 0) / k.length).toFixed(2).padStart(9)} ${String(Math.min(...p)).padStart(13)} ` +
    `${String(Math.max(...p)).padStart(14)}`);
}
const yon = ILETI.filter((m) => m[1] === 'yonetici'), mes = ILETI.filter((m) => m[1] === 'mesru');
console.log(`\nyonetici hedefli iletilerin ortalama gosterge sayisi (${(yon.reduce((a, m) => a + m[2].length, 0) / yon.length).toFixed(2)}), ` +
  `mesru iletilerinkinden (${(mes.reduce((a, m) => a + m[2].length, 0) / mes.length).toFixed(2)}) dusuk`);
console.log(`puani en yuksek 4 ileti: ${[...ILETI].sort((a, b) => puan(b) - puan(a)).slice(0, 4).map((m) => `${m[0]}/${m[1]} (${puan(m)})`).join(', ')}`);
```

```
26 ileti, 16 sahte; 10 gosterge turu, en yuksek puan 20

gosterge                             ag. toplu hedefli yonetici mesru
gonderen alan adi ilk kez goruluyor    3     7       1        0     3
gonderen dogrulama kaydi gecmiyor      3     6       1        0     2
gonderen alani korunan ada benziyor    3     1       3        2     0
baglanti hedefi metinden ayrisiyor     3     6       3        1     1
yanit adresi gonderenden farkli        2     3       1        0     3
beklenmedik ek dosya turu              2     2       1        0     1
alici kumesi genis                     1     8       0        0     3
olagandisi gonderim saati              1     4       0        0     4
yanit zinciri disinda ilk temas        1     3       3        1     4
sure baskisi ifadesi                   1     7       2        1     2

sinif     ileti ort. gosterge ort. puan en dusuk puan en yuksek puan
toplu         8          5.88     11.50            10             14
hedefli       5          3.00      6.60             6              8
yonetici      3          1.67      3.67             3              4
mesru        10          2.30      3.90             0             12

yonetici hedefli iletilerin ortalama gosterge sayisi (1.67), mesru iletilerinkinden (2.30) dusuk
puani en yuksek 4 ileti: T1/toplu (14), T2/toplu (13), T4/toplu (12), M9/mesru (12)
```

Gösterge tablosu tek tek okunduğunda hangi kalemin hangi sınıfa ait olduğu görünüyor. Geniş alıcı
kümesi sekiz toplu iletinin sekizinde var, hedefli ve yönetici hedefli iletilerin hiçbirinde yok;
korunan ada benzeyen gönderen alanı ise tersine, bir toplu iletide ve beş dar hedefli iletide
geçiyor. Ucuz göstergeler ölçek işaretidir, pahalı göstergeler hazırlık işareti.

Sınıf tablosu dersin merkezî sayısını veriyor. Toplu kimlik avı ileti başına 5,88 gösterge
taşıyor, hedefli kimlik avı 3,00, yönetici hedefli kimlik avı 1,67. Düşüş rastlantı değil,
tanımın kendisidir: hedef daraldıkça geniş alıcı kümesi, olağandışı saat ve genel gönderim
altyapısı gibi **ucuz** göstergeler ortadan kalkar. Geriye yalnız pahalı göstergeler kalır ve
onlar da azdır.

Son satır ölçünün sınırını gösteriyor. Yönetici hedefli iletilerin ortalama gösterge sayısı 1,67,
meşru iletilerinki 2,30. Sahte ileti meşru iletiden **daha az** gösterge taşıyor. Gösterge sayısına
bakan hiçbir eşik bu iki kümeyi doğru yönde ayıramaz; ayırmayı deneyen bir eşik, meşru iletileri
sahtelerden önce işaretler.

Puan sıralamasının ilk dördü aynı sorunu ağırlık tarafında gösteriyor. Dördüncü sırada meşru bir
ileti var ve on iki puanla üç toplu kimlik avı iletisiyle aynı bantta duruyor. Bu ileti bir dış
gönderim hizmeti üzerinden çıkan bir abone duyurusudur: ilk kez görülen bir alan adı, geçmeyen bir
doğrulama kaydı, gönderenden ayrışan bir yanıt adresi ve metinden ayrışan bir bağlantı hedefi
taşır. Göstergelerin hepsi doğru sayılmıştır; iletinin sahte olmaması bunu değiştirmez.

#### Eşiğin Çöktüğü Yer

```js
// kosum2.mjs — esik taramasi, yapisal yanlis pozitif ve zincirin erken kirma kazanci
import { ILETI, ZINCIR, puan, sahte, esikte } from './ileti.mjs';

const SAHTE = ILETI.filter(sahte).length;
console.log(`${'esik'.padStart(4)} ${'yakalanan'.padStart(9)} ${'kacan'.padStart(5)} ${'yanlis'.padStart(6)} ` +
  `${'toplam yanlis'.padStart(13)} ${'kacan sinif dagilimi'.padStart(22)}`);
const sonuc = [];
for (let e = 13; e >= 2; e--) {
  const r = esikte(e); sonuc.push({ e, r });
  const d = ['toplu', 'hedefli', 'yonetici'].map((s) => `${s[0].toUpperCase()}${r.kacan.filter((m) => m[1] === s).length}`).join(' ');
  console.log(`${String(e).padStart(4)} ${`${r.yakalanan.length}/${SAHTE}`.padStart(9)} ${String(r.kacan.length).padStart(5)} ` +
    `${String(r.yanlis.length).padStart(6)} ${String(r.kacan.length + r.yanlis.length).padStart(13)} ${d.padStart(22)}`);
}
const enaz = sonuc.reduce((a, s) => (s.r.kacan.length + s.r.yanlis.length < a.r.kacan.length + a.r.yanlis.length ? s : a));
const temiz = sonuc.filter((s) => s.r.yanlis.length === 0);
const tam = sonuc.filter((s) => s.r.kacan.length === 0);
console.log(`\ntoplam yanlisi en aza indiren esik ${enaz.e}: kacan ${enaz.r.kacan.length}, yanlis isaretlenen ${enaz.r.yanlis.length}`);
console.log(`sifir yanlis pozitifli en dusuk esik ${Math.min(...temiz.map((s) => s.e))}: orada kacan ${temiz.reduce((a, s) => (s.e < a.e ? s : a)).r.kacan.length}`);
console.log(`hic kacirmayan en yuksek esik ${Math.max(...tam.map((s) => s.e))}: orada yanlis isaretlenen ${tam.reduce((a, s) => (s.e > a.e ? s : a)).r.yanlis.length}`);
const hep = ILETI.filter((m) => !sahte(m) && puan(m) >= 9);
console.log(`esikten bagimsiz isaretlenen mesru ileti ${hep.length}: ${hep.map((m) => `${m[0]} (${puan(m)} puan, ${m[2].length} gosterge)`).join('; ')}`);

let kum = 0; const kumul = ZINCIR.map((a) => (kum += a[3]));
const kir = ZINCIR.map((a, i) => (a[2] ? i : -1)).filter((i) => i >= 0);
console.log(`\nzincir ${ZINCIR.length} adim, denetimli ${kir.length}, denetimsiz ${ZINCIR.length - kir.length}`);
console.log(`${'#'.padStart(2)} ${'adim'.padEnd(28)} ${'onkosul'.padEnd(27)} ${'denetim'.padEnd(25)} ${'kumul'}`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(28)} ${a[1].padEnd(27)} ${(a[2] ?? '-').padEnd(25)} ${kumul[i]}`));
console.log(`en erken kirilabilen halka ${kir[0] + 1} (dusen kalem ${kir[0] ? kumul[kir[0] - 1] : 0}), ` +
  `en gec ${kir[kir.length - 1] + 1} (dusen kalem ${kumul[kir[kir.length - 1] - 1]})`);
console.log(`erken kirma kazanci ${kumul[kir[kir.length - 1] - 1] - (kir[0] ? kumul[kir[0] - 1] : 0)} kalem; hic kirilmazsa ${kumul[ZINCIR.length - 1]}`);
```

```
esik yakalanan kacan yanlis toplam yanlis   kacan sinif dagilimi
  13      2/16    14      0            14               T6 H5 Y3
  12      3/16    13      1            14               T5 H5 Y3
  11      6/16    10      1            11               T2 H5 Y3
  10      8/16     8      1             9               T0 H5 Y3
   9      8/16     8      2            10               T0 H5 Y3
   8      9/16     7      2             9               T0 H4 Y3
   7     10/16     6      2             8               T0 H3 Y3
   6     13/16     3      2             5               T0 H0 Y3
   5     13/16     3      3             6               T0 H0 Y3
   4     15/16     1      4             5               T0 H0 Y1
   3     16/16     0      4             4               T0 H0 Y0
   2     16/16     0      8             8               T0 H0 Y0

toplam yanlisi en aza indiren esik 3: kacan 0, yanlis isaretlenen 4
sifir yanlis pozitifli en dusuk esik 13: orada kacan 14
hic kacirmayan en yuksek esik 3: orada yanlis isaretlenen 4
esikten bagimsiz isaretlenen mesru ileti 2: M9 (12 puan, 5 gosterge); M10 (9 puan, 4 gosterge)

zincir 5 adim, denetimli 4, denetimsiz 1
 # adim                         onkosul                     denetim                   kumul
 1 ileti hazirlama              hedef adres listesi         -                         0
 2 teslim                       gecerli posta yolu          gosterge esigi            1
 3 acilma ve etkilesim          alicinin ilgisi             kullanici bildirimi       2
 4 kimlik bilgisi girisi        inandirici toplama noktasi  ikinci etmen              5
 5 toplanan bilginin kullanimi  gecerli oturum              olagandisi oturum tespiti 11
en erken kirilabilen halka 2 (dusen kalem 0), en gec 5 (dusen kalem 5)
erken kirma kazanci 5 kalem; hic kirilmazsa 11
```

Kaçan sınıf dağılımı sütunu tarama boyunca aynı şeyi tekrarlıyor. Eşik ondan altıya inerken toplu
kimlik avı sıfırlanıyor ve hedefli kimlik avı erimeye başlıyor, ama yönetici hedefli üç ileti
altıda hâlâ tam kadro kaçıyor. Y sütunu ancak eşik dörde indiğinde kımıldıyor ve üçte sıfırlanıyor.
On üçten üçe inen bir eşik sahte iletilerin tamamını yakalıyor; karşılığında dört meşru ileti
işaretleniyor, yani on meşru iletinin **beşte ikisi**.

Yanlış işaretlenenlerin iki tanesi eşik sorunu değil. On iki ve dokuz puanlı meşru iletiler,
yönetici hedefli iletileri yakalayan her eşikte — hatta onları yakalamayan çoğu eşikte de —
işaretlenir. İki küme puan bandında iç içe geçmiştir. Bu, ağırlıkları ayarlayarak çözülmez;
çözülmesi için meşru toplu gönderimin **kendi göstergelerini kaybetmesi** gerekir: kendi alan
adından çıkması, doğrulama kaydının geçmesi, bağlantı hedefinin metinle uyuşması. Yani düzeltilecek
yer eşik değil, meşru akışın kendisidir.

Zincir tablosu üç sütunu kapatıyor. Beş adımın ilki hiçbir denetimin görmediği hazırlık adımıdır.
Kırılabilen dört halkanın en erkeni teslimdir ve orada düşen kalem sıfırdır; en geci beşinci
adımdır ve oraya gelindiğinde beş kalem düşmüştür. Erken kırma kazancı beş kalemdir; zincir hiç
kırılmazsa düşen kalem on bire çıkar. Eşiği yükseltip ikinci halkayı gevşetmek bu yüzden yalnız
bir sayının değişmesi değildir: yükü üçüncü ve dördüncü halkaya, yani kullanıcı bildirimine ve
ikinci etmene aktarır.

#### Özet

- 26 iletilik kümede 10 gösterge türü sayıldı. Toplu kimlik avı ileti başına 5,88 gösterge taşıyor,
  hedefli 3,00, yönetici hedefli 1,67; hedef daraldıkça ucuz göstergeler ortadan kalkıyor.
- Yönetici hedefli iletilerin ortalama gösterge sayısı (1,67) meşru iletilerinkinden (2,30)
  düşüktür. Yalnız gösterge sayısına bakan bir ölçü bu iki kümeyi ters yönde ayırır.
- Eşik 13'te yanlış pozitif sıfır ve 16 sahte iletinin 14'ü kaçıyor. Eşik 3'te hiçbiri kaçmıyor ve
  10 meşru iletinin 4'ü işaretleniyor. Toplam yanlışı en aza indiren eşik 3'tür (0 + 4).
- Kaçan sınıf dağılımı eşik 6'ya kadar 3 yönetici hedefli iletinin tamamını kaçırıyor; bu sütun
  ancak eşik 4'te kımıldıyor.
- 2 meşru ileti eşikten bağımsız işaretleniyor (12 ve 9 puan). Bu bir eşik ayarı sorunu değil,
  meşru toplu gönderim akışının aynı göstergeleri taşımasıdır.
- Zincir 5 adım, 1 adım denetimsiz. En erken kırılabilen halka 2. adımdır (0 kalem), en geç 5.
  adımdır (5 kalem); erken kırma kazancı 5 kalem, hiç kırılmazsa düşen kalem 11'dir.

#### Sonraki Adım

Bu dersin bütün göstergeleri tek bir kanala aitti ve o kanalın bir ortak yanı vardı: ileti
saklanır. Başlıklar okunabilir, alan adı sorgulanabilir, bağlantı hedefi metinle karşılaştırılabilir
ve bütün bunlar ileti açılmadan önce yapılabilir. Kısa mesaj ve sesli aramada bu kalemlerin çoğu
yoktur; sesli bir aramada geriye kalan tek doğrulanabilir kalem çoğu kez arayan numarasıdır ve o da
gösterildiği gibi olmayabilir. Sonraki dersin sorusu budur: kanal başına kaç doğrulama kalemi var,
hangi kanalda zincir hangi halkada kırılabiliyor ve bir geri doğrulama yordamı kanal kanal kaç
zinciri kırıyor.

### Diğer Kanallar

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/diger-kanallar

Kısa mesaj ve sesli arama temelli kimlik avını doğrulanabilirlik cinsinden ölçmek: on doğrulama kaleminin dört kanaldaki gücü, sesli aramada güçlü kalem sayısının sıfır olması, kanal başına kırılabilen halka sayısı ve geri doğrulama yordamının yalnız bir kanalda kazandırdığı halka ile dört kanalda ödenen bedel.

Önceki dersin bütün göstergeleri tek bir kanala aitti ve o kanalın belirleyici bir özelliği vardı:
ileti saklanır. Başlıklar okunabilir, alan adı sorgulanabilir, bağlantı hedefi metinle
karşılaştırılabilir — ve bunların hepsi ileti açılmadan önce yapılabilir. Kısa mesajda bu
kalemlerin bir bölümü, sesli aramada neredeyse tamamı yoktur.

Bu ders kanalları üslupla değil, tek bir ölçüyle karşılaştırır: **kanal başına kaç doğrulama kalemi
uygulanabiliyor.** Bir kalem üç durumdan birindedir — kanalda uygulanabilir, kanalda vardır ama
taklit edilebilir, kanalda hiç yoktur. Aynı beş adımlık zincir dört kanalda koşturulur ve her
kanalda kaç halkanın kırıldığı sayılır. Sonuçta bir kanal ortaya çıkar ki zincir hiçbir halkada
kırılmaz; o kanalın hangi yordamla kırılabildiği ve o yordamın neye mal olduğu dersin son
bölümüdür.

- **SM13.** Kanal listesi, doğrulama kalemleri ve güç değerleri kurgusal bölgesel ölçüm ağının saha
  ekipleri ile abone hizmetleri masasına aittir. Ölçülen şey `node` ile kurulan modeldir.
- **SM14.** Güç değeri üç basamaklıdır (2, 1, 0). Gerçekte doğrulanabilirlik süreklidir; üç basamak
  kanallar arası sıralamayı korur, kanal içi ince farkları siler.
- **SM15.** Kalemin "taklit edilebilir" sayılması, gösterilen kaynağın kaynağın kendisi olduğunun
  bağımsız bir kayıtla doğrulanamadığı anlamına gelir. Kanal altyapısının hangi durumda bunu
  sağladığı modellenmedi.
- **SM16.** Zincir dört kanalda **aynı** kabul edildi. Gerçekte kanal, zincirin uzunluğunu da
  değiştirir; sabit zincir kanallar arası karşılaştırmayı mümkün kılar.
- **SM17.** Trafik sayıları günlüktür ve kurgudur. Kapsama giren talep, yetki ya da ödeme isteyen
  taleptir; pencereye sığmayan talep, geri arama tamamlanmadan geçmesi gereken taleptir.
- **SM18.** Bir adım ya kırılır ya kırılmaz. Kısmi kırılma — talebin yavaşlaması, ikinci bir soru
  sorulması — modellenmedi.

#### Kanal Başına Doğrulanabilirlik

```js
// kanal.mjs — kanal basina dogrulama kalemi gucu, zincir ve mesru trafik; model
export const KANAL = ['e-posta', 'kisa mesaj', 'sesli arama', 'anlik ileti'];
// kalem: kanal sirasiyla guc (2 uygulanabilir, 1 zayif/taklit edilebilir, 0 yok)
export const KALEM = {
  'gonderen alan adi sorgusu': [2, 0, 0, 1],
  'gonderen dogrulama kaydi': [2, 0, 0, 0],
  'baglanti hedefi karsilastirmasi': [2, 2, 0, 2],
  'iletiyi acmadan inceleme': [2, 2, 0, 2],
  'kayitli rehberde bulma': [2, 1, 1, 1],
  'sonradan yeniden okuma': [2, 2, 0, 2],
  'gecmis yazismayla esleme': [2, 1, 0, 2],
  'kaynagi bagimsiz kayitla dogrulama': [1, 1, 1, 1],
  'ikinci kisiye danisma penceresi': [2, 2, 0, 2],
  'kaydi denetim icin saklama': [2, 2, 0, 1],
};
// [adim, onkosul, adimi kiran kalem (guc 2 gerekir), adim bitince dusen kalem]
export const ZINCIR = [
  ['kanal secimi ve hazirlik', 'ulasilabilir kanal adresi', null, 0],
  ['temas', 'alicinin yanit vermesi', 'kayitli rehberde bulma', 1],
  ['guven kurma', 'dogrulanamayan ic ayrinti', 'gecmis yazismayla esleme', 1],
  ['talep iletme', 'alicinin ilgisi', 'iletiyi acmadan inceleme', 3],
  ['eylem', 'karar vericinin tek basina olmasi', 'ikinci kisiye danisma penceresi', 6],
];
export const GERI_SURE = 180; // saniye
// [kanal, gunluk mesru talep, yordam kapsamina giren, kapsamda geri arama penceresine sigmayan]
export const TRAFIK = [['e-posta', 240, 36, 1], ['kisa mesaj', 60, 15, 3],
  ['sesli arama', 45, 18, 7], ['anlik ileti', 120, 24, 2]];
export const guc = (kalem, k) => KALEM[kalem][k];
export function kirilan(k, yordam = false) {
  const d = ZINCIR.map((a, i) => (a[2] && guc(a[2], k) === 2 ? i : -1)).filter((i) => i >= 0);
  return yordam && !d.includes(4) ? [...d, 4] : d;
}
```

```js
// kosum1.mjs — kanal basina dogrulama kalemi sayisi ve toplam dogrulanabilirlik gucu
import { KANAL, KALEM } from './kanal.mjs';

console.log(`${Object.keys(KALEM).length} dogrulama kalemi, ${KANAL.length} kanal ` +
  `(2 uygulanabilir, 1 zayif, 0 yok)\n`);
console.log(`${'kalem'.padEnd(35)} ${KANAL.map((k) => k.padStart(12)).join('')}`);
for (const [ad, v] of Object.entries(KALEM))
  console.log(`${ad.padEnd(35)} ${v.map((g) => String(g).padStart(12)).join('')}`);
console.log(`\n${'kanal'.padEnd(13)} ${'guclu kalem'.padStart(11)} ${'zayif kalem'.padStart(11)} ` +
  `${'hic yok'.padStart(7)} ${'toplam guc'.padStart(10)} ${'e-postanin yuzdesi'.padStart(18)}`);
const guclu = KANAL.map((_, k) => Object.values(KALEM).filter((v) => v[k] === 2).length);
const toplam = KANAL.map((_, k) => Object.values(KALEM).reduce((a, v) => a + v[k], 0));
KANAL.forEach((ad, k) => console.log(`${ad.padEnd(13)} ${String(guclu[k]).padStart(11)} ` +
  `${String(Object.values(KALEM).filter((v) => v[k] === 1).length).padStart(11)} ` +
  `${String(Object.values(KALEM).filter((v) => v[k] === 0).length).padStart(7)} ${String(toplam[k]).padStart(10)} ` +
  `${`%${Math.round((toplam[k] / toplam[0]) * 100)}`.padStart(18)}`));
const hepsinde = Object.entries(KALEM).filter(([, v]) => v.every((g) => g >= 1));
console.log(`\ndort kanalda da bulunan kalem ${hepsinde.length}: ${hepsinde.map(([a, v]) => `${a} (guc ${v.join('/')})`).join('; ')}`);
console.log(`sesli aramada guclu kalem sayisi: ${guclu[2]}`);
```

```
10 dogrulama kalemi, 4 kanal (2 uygulanabilir, 1 zayif, 0 yok)

kalem                                    e-posta  kisa mesaj sesli arama anlik ileti
gonderen alan adi sorgusu                      2           0           0           1
gonderen dogrulama kaydi                       2           0           0           0
baglanti hedefi karsilastirmasi                2           2           0           2
iletiyi acmadan inceleme                       2           2           0           2
kayitli rehberde bulma                         2           1           1           1
sonradan yeniden okuma                         2           2           0           2
gecmis yazismayla esleme                       2           1           0           2
kaynagi bagimsiz kayitla dogrulama             1           1           1           1
ikinci kisiye danisma penceresi                2           2           0           2
kaydi denetim icin saklama                     2           2           0           1

kanal         guclu kalem zayif kalem hic yok toplam guc e-postanin yuzdesi
e-posta                 9           1       0         19               %100
kisa mesaj              5           3       2         13                %68
sesli arama             0           2       8          2                %11
anlik ileti             5           4       1         14                %74

dort kanalda da bulunan kalem 2: kayitli rehberde bulma (guc 2/1/1/1); kaynagi bagimsiz kayitla dogrulama (guc 1/1/1/1)
sesli aramada guclu kalem sayisi: 0
```

Kanal tablosu tek bir satırda toplanıyor: sesli aramada güçlü doğrulama kalemi sayısı **sıfırdır**.
On kalemin sekizi bu kanalda hiç yok, ikisi var ama taklit edilebilir. Toplam güç ikidir ve
e-postanın on dokuzunun yüzde on birine karşılık gelir. Bunun nedeni kanalın kötü tasarlanmış olması
değil, canlı ve saklanmayan bir kanalda incelenecek bir nesnenin bulunmamasıdır: konuşma açılmadan
önce bakılamaz, sonradan yeniden okunamaz, denetim için saklanmaz.

Kısa mesaj ile anlık ileti arasındaki fark da öğretici. İkisinde de beş güçlü kalem var, ama
dağılımları farklı: anlık iletide geçmiş yazışmayla eşleme güçlü, kısa mesajda zayıftır; kısa
mesajda kaydı denetim için saklama güçlü, anlık iletide zayıftır. Toplam güç yakın olsa da zincirin
hangi halkasında kırıldıkları farklı çıkacak, çünkü halkalar toplama değil **belirli kalemlere**
bağlıdır.

Toplam güç sütununun yüzdesi kanalları tek bir sayıyla sıralasa da yanıltıcı olabilir: kısa mesaj
e-postanın yüzde altmış sekizi görünür, oysa e-postanın en güçlü iki kalemi — alan adı sorgusu ve
gönderen doğrulama kaydı — bu kanalda hiç yoktur. Yüzde, eksik olanın **hangisi** olduğunu
söylemez; zincirdeki karşılığı bir sonraki bölümde ayrıca sayılacaktır.

Dört kanalda da bulunan iki kalemden birincisi güçlü olduğu tek kanalda e-postadır; ikincisi hiçbir
kanalda güçlü değildir. Bütün kanallarda çalışan bir doğrulama kalemi yoktur; kanaldan bağımsız bir
doğrulama yordamı ancak dışarıdan eklenebilir.

#### Zincir Hangi Kanalda Kırılıyor

```js
// kosum2.mjs — kanal basina kirilan halka, geri dogrulama yordaminin kazanci ve bedeli
import { KANAL, ZINCIR, TRAFIK, GERI_SURE, kirilan } from './kanal.mjs';

let s = 0; const kumul = ZINCIR.map((a) => (s += a[3]));
console.log(`${'#'.padStart(2)} ${'adim'.padEnd(24)} ${'onkosul'.padEnd(33)} ${'adimi kiran kalem'.padEnd(31)} kumul`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(24)} ${a[1].padEnd(33)} ` +
  `${(a[2] ?? '-').padEnd(31)} ${kumul[i]}`));
const TAM = kumul[ZINCIR.length - 1];
const satir = (ad, d) => {
  const e = d.length ? (d[0] ? kumul[d[0] - 1] : 0) : TAM, g = d.length ? kumul[d[d.length - 1] - 1] : TAM;
  return `${ad.padEnd(13)} ${String(d.length).padStart(6)} ${(d.length ? String(d[0] + 1) : '-').padStart(10)} ` +
    `${String(e).padStart(11)} ${String(g).padStart(9)} ${String(g - e).padStart(6)}`;
};
console.log(`\n${'kanal'.padEnd(13)} ${'halka'.padStart(6)} ${'en erken'.padStart(10)} ${'erken kalem'.padStart(11)} ` +
  `${'gec kalem'.padStart(9)} ${'kazanc'.padStart(6)}   (hic kirilmazsa ${TAM})`);
KANAL.forEach((ad, k) => console.log(satir(ad, kirilan(k))));
console.log(`\ngeri dogrulama yordami eklendikten sonra (kayitli kanaldan geri arama, ${GERI_SURE} sn):`);
KANAL.forEach((ad, k) => console.log(satir(ad, kirilan(k, true))));
console.log(`\n${'kanal'.padEnd(13)} ${'mesru talep'.padStart(11)} ${'kapsam'.padStart(6)} ${'ek sure (sn)'.padStart(12)} ` +
  `${'kesilen is'.padStart(10)} ${'kirilan halka +'.padStart(15)}`);
let kap = 0, kes = 0;
for (const [ad, t, k, a] of TRAFIK) {
  kap += k; kes += a;
  const i = KANAL.indexOf(ad), fark = kirilan(i, true).length - kirilan(i).length;
  console.log(`${ad.padEnd(13)} ${String(t).padStart(11)} ${String(k).padStart(6)} ${String(k * GERI_SURE).padStart(12)} ` +
    `${String(a).padStart(10)} ${String(fark).padStart(15)}`);
}
console.log(`toplam: kapsam ${kap} talep, ${kap * GERI_SURE} sn (${(kap * GERI_SURE / 3600).toFixed(2)} saat), kesilen is ${kes}`);
console.log(`sesli aramada yordam oncesi dusen kalem ${TAM}, sonrasi ${kumul[3]}; kazanc ${TAM - kumul[3]} kalem, bedeli 7 kesilen is`);
const yalniz = TRAFIK.find((t) => t[0] === 'sesli arama');
console.log(`yordam yalniz sesli aramaya uygulanirsa: kapsam ${yalniz[2]} talep, ${yalniz[2] * GERI_SURE} sn, ` +
  `kesilen is ${yalniz[3]}; kirilan halka kazanci ayni (1)`);
```

```
 # adim                     onkosul                           adimi kiran kalem               kumul
 1 kanal secimi ve hazirlik ulasilabilir kanal adresi         -                               0
 2 temas                    alicinin yanit vermesi            kayitli rehberde bulma          1
 3 guven kurma              dogrulanamayan ic ayrinti         gecmis yazismayla esleme        2
 4 talep iletme             alicinin ilgisi                   iletiyi acmadan inceleme        5
 5 eylem                    karar vericinin tek basina olmasi ikinci kisiye danisma penceresi 11

kanal          halka   en erken erken kalem gec kalem kazanc   (hic kirilmazsa 11)
e-posta            4          2           0         5      5
kisa mesaj         2          4           2         5      3
sesli arama        0          -          11        11      0
anlik ileti        3          3           1         5      4

geri dogrulama yordami eklendikten sonra (kayitli kanaldan geri arama, 180 sn):
e-posta            4          2           0         5      5
kisa mesaj         2          4           2         5      3
sesli arama        1          5           5         5      0
anlik ileti        3          3           1         5      4

kanal         mesru talep kapsam ek sure (sn) kesilen is kirilan halka +
e-posta               240     36         6480          1               0
kisa mesaj             60     15         2700          3               0
sesli arama            45     18         3240          7               1
anlik ileti           120     24         4320          2               0
toplam: kapsam 93 talep, 16740 sn (4.65 saat), kesilen is 13
sesli aramada yordam oncesi dusen kalem 11, sonrasi 5; kazanc 6 kalem, bedeli 7 kesilen is
yordam yalniz sesli aramaya uygulanirsa: kapsam 18 talep, 3240 sn, kesilen is 7; kirilan halka kazanci ayni (1)
```

Kanal tablosu zincirin kanala göre nasıl değiştiğini gösteriyor. E-postada dört halka kırılabiliyor
ve en erkeni ikinci adımdır: orada hiçbir kalem düşmemiştir. Kısa mesajda kırılabilen halka sayısı
ikiye iniyor ve en erkeni dördüncü adımdır — o noktaya gelindiğinde iki kalem çoktan düşmüştür.
Anlık iletide üç halka var ve en erkeni üçüncü adımdır. Sesli aramada kırılabilen halka **sıfırdır**
ve tablodaki "geç kalem" sütunu on bir yazar: zincir hiç kırılmadığında düşen kalem sayısıdır.

Bu, kursun ikinci kez karşılaşılan durumudur: bir zincirin hiçbir halkasında denetim yoksa ölçü
kırmadan **tespite** kayar. Sesli aramada tespit, aramanın kendisinden değil sonrasından gelir —
talebin gerçekleştiği kalemin kaydından. Zincirin kırılmaması, olanın görülmemesi anlamına gelmez;
yalnız görülmenin **sonradan** olacağı anlamına gelir.

Geri doğrulama yordamı bu tabloyu tek bir yerde değiştiriyor. Sesli aramada beşinci halka
kırılabilir hale geliyor ve düşen kalem on birden beşe iniyor: kazanç altı kalemdir. Öteki üç
kanalda hiçbir değişiklik yok, çünkü beşinci halka orada zaten kırılabilirdi. Yordamın kazandırdığı
her şey tek bir kanaldadır.

Bedel tablosu bunun karşılığını yazıyor. Yordam dört kanala birden uygulanırsa doksan üç talebi
kapsıyor, günde 16.740 saniye — dört buçuk saatten fazla — doğrulama süresi ekliyor ve on üç meşru
işi kesiyor. Kırılan halka sayısına katkısı yalnız sesli aramada birdir; öteki üç kanalda sıfırdır.
Yordam yalnız sesli aramaya uygulanırsa kapsam on sekiz talebe, ek süre 3.240 saniyeye ve kesilen
iş yediye iniyor; kazanılan halka aynı kalıyor. Aynı kazancın bedeli beşte bire düşüyor ve farkı
yaratan tek şey yordamın **nereye** uygulandığıdır.

Kesilen yedi iş bu kanalda en yüksek olandır ve bu bir rastlantı değil. Sesli arama, meşru
kullanımda da acil işlerin kanalıdır; kapsama giren on sekiz talebin yedisi geri arama penceresine
sığmaz. Zincirin en zayıf kanalı, yordamın da en pahalı olduğu kanaldır.

#### Kanal Değiştirmenin Ölçüsü

Tablolar tek bir kanalda koşan zinciri ölçüyor, oysa zincirin adımları farklı kanallara
dağıtılabilir. Bunun etkisi çıktıdan doğrudan okunur. E-postada kırılabilen halkalar ikinci ve
üçüncü adımlardır; sesli aramada dördüncü ve beşinci adımların ikisi de kırılamaz. Adımların ilk
üçü e-postada, son ikisi sesli aramada geçtiğinde geriye yalnız iki kırılabilir halka kalır ve
ikisi de kümülatif sütunun bir ile iki değerinde durur.

Sayı olarak sonuç şudur: aynı zincirde erken kırma kazancı beş kalemden bire iner ve son iki
halkanın taşıdığı dokuz kalemlik fark hiçbir denetimin arkasında kalmaz. Kanal değiştirmek zincire
yeni bir adım eklemez; yalnız var olan adımları doğrulama kalemi az olan kanala taşır. Savunma
tarafındaki karşılığı da aynı ölçüdedir — bir talebin **başladığı** kanalda değil,
**tamamlandığı** kanalda hangi kalemlerin bulunduğu sayılır. Bir önceki bölümde yordamın yalnız
sesli aramaya uygulanması ucuz göründü; kanal değiştirme bu tercihi ayrıca zorunlu kılar, çünkü
zincirin son halkası bilerek o kanala taşınabilir. Kanal başına ölçüm bu yüzden tek başına
yetmez; talebin izlediği kanal dizisi de bir kalem olarak kaydedilmelidir.

#### Özet

- 10 doğrulama kaleminin dört kanaldaki toplam gücü sırasıyla 19, 13, 2 ve 14'tür. Sesli aramada
  güçlü kalem sayısı 0'dır; 8 kalem hiç yok, 2 kalem taklit edilebilir.
- Dört kanalda da bulunan yalnız 2 kalem var ve ikisi de birden fazla kanalda güçlü değil. Kanaldan
  bağımsız doğrulama ancak dışarıdan bir yordamla eklenebilir.
- Aynı 5 adımlık zincir e-postada 4, anlık iletide 3, kısa mesajda 2, sesli aramada 0 halkada
  kırılıyor. Sesli aramada zincir hiç kırılmıyor ve düşen kalem 11'de kalıyor.
- Kırılamayan zincirde ölçü tespite kayar: sesli aramada görme, aramanın sırasında değil talebin
  gerçekleştiği kalemin kaydında olur.
- Geri doğrulama yordamı yalnız sesli aramada bir halka kazandırıyor; düşen kalem 11'den 5'e
  iniyor, kazanç 6 kalemdir. Öteki üç kanalda kazanç 0'dır.
- Yordam dört kanala uygulanırsa günde 16.740 saniye ve 13 kesilen iş, yalnız sesli aramaya
  uygulanırsa 3.240 saniye ve 7 kesilen iş. Kazanılan halka her iki durumda aynıdır.

#### Sonraki Adım

Bu dersin dört kanalı da uzaktan işliyordu ve hepsinin ortak önkoşulu bir adresti: posta adresi,
numara ya da hesap. Bir kişinin binaya girmesi bu önkoşulların hiçbirine ihtiyaç duymaz. Kapıdan
geçmek, bir kartı taklit etmek, açık bırakılmış bir ekrana bakmak ya da atılmış bir belgeyi
toplamak farklı bir kaynak kümesini kullanır: kapı, kart ve görsel doğrulama. Sonraki dersin sorusu
budur: bir bina modelinde kaç erişim kalemi var, bunların kaçında denetim bulunuyor, hangi zincir
hangi kalemde kırılıyor ve bir refakat yordamı kaç adımı kırıp karşılığında kaç meşru geçişi
yavaşlatıyor.

### Fiziksel Teknikler

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/fiziksel-teknikler

Peşine takılma, omuz sörfü ve çöp karıştırmayı erişim kalemi cinsinden saymak: on kapı, beş kart ve iki görsel doğrulamadan oluşan kurgu bir binada hedef bölgeye giden yol sayısı, her yolda kaç kapının zinciri kırdığı, hiç kırılmayan iki yol ve refakat yordamının kazandırdığı on erişim kalemi ile günlük 6,8 saatlik bedeli.

Önceki dersin dört kanalı da uzaktan işliyordu ve hepsinin ortak önkoşulu bir adresti: posta
adresi, numara ya da hesap. Bir kişinin binaya girmesi bunların hiçbirine ihtiyaç duymaz. Kapıdan
geçmek, açık bırakılmış bir ekrana bakmak ya da atılmış bir belgeyi toplamak farklı bir kaynak
kümesini kullanır ve bu kümenin kalemleri sayılabilir: kapı, kart, görsel doğrulama.

Bu ders üç tekniği aynı bina modeli üzerinde ölçer. Peşine takılma bir kapının açık kalmasından
yararlanır; omuz sörfü bir görüş açısından; çöp karıştırma ayrılmamış bir atıktan. Üçünün de
zinciri kısadır ve üçünün de ilk adımı hiçbir denetimin görmediği bir adımdır. Ölçülen şey binaya
girmenin nasıl yapıldığı değil, **hangi erişim kaleminin hangi halkayı kırdığıdır**. Bu tür
denemelerin yazılı yetki ve tanımlı kapsam dışında yapılması hem yasadışı hem de meslek dışıdır.

- **SM19.** Bina, kapı grafiği, kart yetkileri ve atık akışı kurgusal bölgesel ölçüm ağının bir
  şube binasına aittir. Gerçek bir bina yok; ölçülen şey `node` ile kurulan modeldir.
- **SM20.** Kart tek başına peşine takılmayı durdurmaz: bir kart okunduğunda kapı açılır ve
  arkasından kaç kişi geçtiğini kart bilmez. Zinciri kıran denetimler kişiyi **gören** denetim ile
  tek kişilik geçiştir.
- **SM21.** Yol araması aynı kapıdan iki kez geçmeyen yolları sayar. Pencere, asansör boşluğu ve
  yangın çıkışı gibi kapı dışı geçişler modellenmedi; gerçek bir binada bu yollar da sayılır.
- **SM22.** Görsel doğrulama, orada bir kişinin bulunmasına bağlıdır. Vardiya dışı saatler ve yoğun
  geçiş anları modellenmedi; ikisi de bu denetimin gücünü düşürür.
- **SM23.** Düşen erişim kalemi, o adımdan sonra ulaşılabilir hale gelen kapı, ekran ve belge
  kaleminin sayısıdır. Kalem türleri ayrı ağırlıklandırılmadı.
- **SM24.** Refakat yordamı, iç bölgelerde yalnız başına bulunan kişinin görüldüğü varsayımına
  dayanır. Bir kişinin refakat ettiği kişiyi gözden kaçırması modellenmedi.

#### Erişim Kalemleri ve Yollar

```js
// bina.mjs — kapi grafigi, kart yetkileri ve uc fiziksel teknigin zinciri; model
// [kapi, kaynak bolge, hedef bolge, denetim]
export const KAPI = [
  ['ana giris', 'disari', 'giris holu', 'gorsel'],
  ['yan giris', 'disari', 'giris holu', 'kart'],
  ['otopark asansoru', 'disari', 'ofis kati', 'kart'],
  ['sevkiyat kapisi', 'disari', 'depo', 'yok'],
  ['hol turnikesi', 'giris holu', 'ofis kati', 'kart+tek kisi'],
  ['depo koridoru', 'depo', 'ofis kati', 'yok'],
  ['teknik oda kapisi', 'ofis kati', 'teknik oda', 'kart'],
  ['sunucu odasi kapisi', 'teknik oda', 'sunucu odasi', 'kart+gorsel'],
  ['arsiv kapisi', 'ofis kati', 'arsiv', 'kart'],
  ['atik noktasi', 'depo', 'atik alani', 'yok'],
];
export const KART = { // kart turu: actigi kapilar
  ziyaretci: ['yan giris'], ofis: ['yan giris', 'hol turnikesi', 'arsiv kapisi'],
  saha: ['yan giris', 'hol turnikesi', 'sevkiyat kapisi'],
  teknik: ['yan giris', 'otopark asansoru', 'hol turnikesi', 'teknik oda kapisi', 'sunucu odasi kapisi'],
  temizlik: ['yan giris', 'hol turnikesi', 'teknik oda kapisi', 'arsiv kapisi'],
};
// kart tek basina pesine takilmayi durdurmaz; kisiyi goren ya da tek kisilik gecis durdurur
export const kirar = (denetim) => denetim.includes('gorsel') || denetim.includes('tek kisi');
export function yollar(hedef, bolge = 'disari', gecilen = []) {
  if (bolge === hedef) return [gecilen];
  return KAPI.filter((k) => k[1] === bolge && !gecilen.includes(k[0]))
    .flatMap((k) => yollar(hedef, k[2], [...gecilen, k[0]]));
}
export const denetimi = (ad) => KAPI.find((k) => k[0] === ad)[3];
// [teknik, [adim, onkosul, adimi goren denetim, adim bitince dusen erisim kalemi]]
export const TEKNIK = {
  'pesine takilma': [
    ['kapi onunde bekleme', 'kapinin disaridan gorulmesi', null, 0],
    ['yetkili gecisin beklenmesi', 'yogun gecis saati', null, 0],
    ['ayni gecisle iceri girme', 'kapinin acik kalmasi', 'tek kisilik gecis', 2],
    ['hedef bolgeye ilerleme', 'ic kapilarin denetimsiz olmasi', 'gorsel dogrulama', 5],
  ],
  'omuz sorfu': [
    ['ortak alanda konumlanma', 'ziyaretci erisimi', null, 0],
    ['ekran ya da tus gozlemi', 'gorus acisi', 'ekran yerlesimi', 1],
    ['gozlenen bilginin kullanimi', 'gecerli oturum', 'ikinci etmen', 4],
  ],
  'cop karistirma': [
    ['atik noktasina erisim', 'atik alaninin denetimsiz olmasi', null, 0],
    ['belge toplama', 'ayrilmamis atik', 'belge imha yordami', 3],
    ['toplanan bilginin kullanimi', 'bilginin guncel olmasi', 'kayit saklama suresi', 4],
  ],
};
export const REFAKAT = { gunluk_gecis: 34, ortalama_dakika: 12 }; // kurgu
```

```js
// kosum1.mjs — erisim kalemlerinin sayimi ve hedef bolgeye giden yollarin denetim yogunlugu
import { KAPI, KART, kirar, yollar, denetimi } from './bina.mjs';

const gorsel = KAPI.filter((k) => k[3].includes('gorsel'));
console.log(`${KAPI.length} kapi, ${Object.keys(KART).length} kart turu, ${gorsel.length} gorsel dogrulama noktasi`);
console.log(`denetimsiz kapi ${KAPI.filter((k) => k[3] === 'yok').length}, yalniz kartla acilan ${KAPI.filter((k) => k[3] === 'kart').length}, ` +
  `pesine takilmayi kiran ${KAPI.filter((k) => kirar(k[3])).length}\n`);
console.log(`${'kapi'.padEnd(20)} ${'kaynak'.padEnd(11)} ${'hedef'.padEnd(12)} ${'denetim'.padEnd(13)} ${'acan kart'.padStart(9)}`);
for (const [ad, a, b, d] of KAPI)
  console.log(`${ad.padEnd(20)} ${a.padEnd(11)} ${b.padEnd(12)} ${d.padEnd(13)} ` +
    `${String(Object.values(KART).filter((v) => v.includes(ad)).length).padStart(9)}`);
for (const hedef of ['sunucu odasi', 'arsiv']) {
  const y = yollar(hedef);
  console.log(`\n${hedef}: ${y.length} yol`);
  console.log(`${'yol'.padEnd(72)} ${'kapi'.padStart(4)} ${'kiran'.padStart(5)} ${'kartsiz gecilen'.padStart(15)}`);
  for (const yol of y)
    console.log(`${yol.join(' > ').padEnd(72)} ${String(yol.length).padStart(4)} ` +
      `${String(yol.filter((k) => kirar(denetimi(k))).length).padStart(5)} ` +
      `${String(yol.filter((k) => denetimi(k) === 'yok').length).padStart(15)}`);
  const enaz = y.reduce((a, b) => (b.filter((k) => kirar(denetimi(k))).length < a.filter((k) => kirar(denetimi(k))).length ? b : a));
  console.log(`en az denetimli yol: ${enaz.join(' > ')} (${enaz.filter((k) => kirar(denetimi(k))).length} kiran kapi)`);
}
console.log(`\nsunucu odasini acan kart turu ${Object.entries(KART).filter(([, v]) => v.includes('sunucu odasi kapisi')).length}, ` +
  `teknik oda kapisini acan ${Object.entries(KART).filter(([, v]) => v.includes('teknik oda kapisi')).length}`);
```

```
10 kapi, 5 kart turu, 2 gorsel dogrulama noktasi
denetimsiz kapi 3, yalniz kartla acilan 4, pesine takilmayi kiran 3

kapi                 kaynak      hedef        denetim       acan kart
ana giris            disari      giris holu   gorsel                0
yan giris            disari      giris holu   kart                  5
otopark asansoru     disari      ofis kati    kart                  1
sevkiyat kapisi      disari      depo         yok                   1
hol turnikesi        giris holu  ofis kati    kart+tek kisi         4
depo koridoru        depo        ofis kati    yok                   0
teknik oda kapisi    ofis kati   teknik oda   kart                  2
sunucu odasi kapisi  teknik oda  sunucu odasi kart+gorsel           1
arsiv kapisi         ofis kati   arsiv        kart                  2
atik noktasi         depo        atik alani   yok                   0

sunucu odasi: 4 yol
yol                                                                      kapi kiran kartsiz gecilen
ana giris > hol turnikesi > teknik oda kapisi > sunucu odasi kapisi         4     3               0
yan giris > hol turnikesi > teknik oda kapisi > sunucu odasi kapisi         4     2               0
otopark asansoru > teknik oda kapisi > sunucu odasi kapisi                  3     1               0
sevkiyat kapisi > depo koridoru > teknik oda kapisi > sunucu odasi kapisi    4     1               2
en az denetimli yol: otopark asansoru > teknik oda kapisi > sunucu odasi kapisi (1 kiran kapi)

arsiv: 4 yol
yol                                                                      kapi kiran kartsiz gecilen
ana giris > hol turnikesi > arsiv kapisi                                    3     2               0
yan giris > hol turnikesi > arsiv kapisi                                    3     1               0
otopark asansoru > arsiv kapisi                                             2     0               0
sevkiyat kapisi > depo koridoru > arsiv kapisi                              3     0               2
en az denetimli yol: otopark asansoru > arsiv kapisi (0 kiran kapi)

sunucu odasini acan kart turu 1, teknik oda kapisini acan 2
```

Kapı tablosu erişim kalemlerini sayıyor: on kapı, beş kart türü, iki görsel doğrulama noktası. Üç
kapıda hiçbir denetim yok, dört kapı yalnız kartla açılıyor ve peşine takılmayı kıran kapı sayısı
üçtür. Kart sütunu ikinci bir dengesizliği gösteriyor: sunucu odası kapısını tek bir kart türü
açıyor, ama teknik oda kapısını iki tür açıyor ve bunlardan biri temizlik kartıdır. Yetkinin en dar
olduğu yer son kapıdır, bir öncekinde ise iki katına çıkar.

Yol tablosu asıl sayıyı veriyor. Sunucu odasına dört yol var ve bu yolların kırıcı kapı sayısı üç
ile bir arasında değişiyor. Ana girişten geçen yol üç kırıcı kapı içerir; otopark asansöründen
geçen yol yalnız bir tane. Aynı hedefe giden iki yol arasındaki bu fark, savunmanın ana girişe
yığıldığını ve yan girişlerin aynı ölçüyle ele alınmadığını gösterir.

Arşiv daha keskin. Dört yolun ikisinde kırıcı kapı sayısı **sıfırdır**. Sevkiyat kapısı ile depo
koridoru hiçbir denetim taşımıyor ve ikisi de kartsız geçiliyor; otopark asansörü kart istiyor ama
kişiyi görmüyor. Yol sayımı burada bir yüzey değil, bir sıralama üretir: hangi hedefe hangi yoldan
gidildiğinde hiçbir denetimin görmediği bir güzergâh kalıyor.

#### Üç Zincir ve Refakat Yordamı

```js
// kosum2.mjs — uc teknigin zinciri, yola bagli kirilan halka ve refakat yordaminin bedeli
import { TEKNIK, REFAKAT, yollar, denetimi } from './bina.mjs';

const kumulof = (z) => { let s = 0; return z.map((a) => (s += a[3])); };
console.log(`${'teknik'.padEnd(16)} ${'adim'.padStart(4)} ${'denetimli'.padStart(9)} ${'erken kalem'.padStart(11)} ` +
  `${'gec kalem'.padStart(9)} ${'kazanc'.padStart(6)} ${'hic kirilmazsa'.padStart(14)}`);
for (const [ad, z] of Object.entries(TEKNIK)) {
  const k = kumulof(z), d = z.map((a, i) => (a[2] ? i : -1)).filter((i) => i >= 0);
  const e = d[0] ? k[d[0] - 1] : 0, g = k[d[d.length - 1] - 1];
  console.log(`${ad.padEnd(16)} ${String(z.length).padStart(4)} ${String(d.length).padStart(9)} ${String(e).padStart(11)} ` +
    `${String(g).padStart(9)} ${String(g - e).padStart(6)} ${String(k[z.length - 1]).padStart(14)}`);
}
const P = TEKNIK['pesine takilma'], PK = kumulof(P);
console.log(`\npesine takilma zinciri:`);
P.forEach((a, i) => console.log(`  ${i + 1} ${a[0].padEnd(26)} onkosul ${a[1].padEnd(33)} denetim ${(a[2] ?? '-')}`));
const halka = (yol, refakat) => {
  const d = [];
  if (yol.some((k) => denetimi(k).includes('tek kisi'))) d.push(2);
  if (refakat || yol.some((k) => denetimi(k).includes('gorsel'))) d.push(3);
  return d;
};
const dusen = (d) => (d.length ? { e: d[0] ? PK[d[0] - 1] : 0, g: PK[d[d.length - 1] - 1] } : { e: PK[3], g: PK[3] });
let kirilmayan = 0, kazanc = 0;
// dusen sutunu: en erken kirilabilen halkada dusen erisim kalemi; hic kirilamiyorsa zincirin tamami
for (const hedef of ['sunucu odasi', 'arsiv']) {
  console.log(`\n${hedef} (${yollar(hedef).length} yol)`.padEnd(74) +
    `${'halka'.padStart(5)} ${'dusen'.padStart(5)} ${'refakatli'.padStart(9)} ${'dusen'.padStart(5)}`);
  for (const yol of yollar(hedef)) {
    const a = halka(yol, false), b = halka(yol, true), da = dusen(a), db = dusen(b);
    if (!a.length) kirilmayan++;
    kazanc += da.e - db.e;
    console.log(`${yol.join(' > ').padEnd(73)} ${String(a.length).padStart(5)} ${String(da.e).padStart(5)} ` +
      `${String(b.length).padStart(9)} ${String(db.e).padStart(5)}`);
  }
}
console.log(`\nrefakatsiz hic kirilmayan yol ${kirilmayan}/8; refakat yordaminin toplam kazanci ${kazanc} erisim kalemi`);
console.log(`bedel: gunde ${REFAKAT.gunluk_gecis} refakatli gecis x ${REFAKAT.ortalama_dakika} dk = ` +
  `${REFAKAT.gunluk_gecis * REFAKAT.ortalama_dakika} dk (${(REFAKAT.gunluk_gecis * REFAKAT.ortalama_dakika / 60).toFixed(1)} saat/gun)`);
```

```
teknik           adim denetimli erken kalem gec kalem kazanc hic kirilmazsa
pesine takilma      4         2           0         2      2              7
omuz sorfu          3         2           0         1      1              5
cop karistirma      3         2           0         3      3              7

pesine takilma zinciri:
  1 kapi onunde bekleme        onkosul kapinin disaridan gorulmesi       denetim -
  2 yetkili gecisin beklenmesi onkosul yogun gecis saati                 denetim -
  3 ayni gecisle iceri girme   onkosul kapinin acik kalmasi              denetim tek kisilik gecis
  4 hedef bolgeye ilerleme     onkosul ic kapilarin denetimsiz olmasi    denetim gorsel dogrulama

sunucu odasi (4 yol)                                                     halka dusen refakatli dusen
ana giris > hol turnikesi > teknik oda kapisi > sunucu odasi kapisi           2     0         2     0
yan giris > hol turnikesi > teknik oda kapisi > sunucu odasi kapisi           2     0         2     0
otopark asansoru > teknik oda kapisi > sunucu odasi kapisi                    1     2         1     2
sevkiyat kapisi > depo koridoru > teknik oda kapisi > sunucu odasi kapisi     1     2         1     2

arsiv (4 yol)                                                            halka dusen refakatli dusen
ana giris > hol turnikesi > arsiv kapisi                                      2     0         2     0
yan giris > hol turnikesi > arsiv kapisi                                      1     0         2     0
otopark asansoru > arsiv kapisi                                               0     7         1     2
sevkiyat kapisi > depo koridoru > arsiv kapisi                                0     7         1     2

refakatsiz hic kirilmayan yol 2/8; refakat yordaminin toplam kazanci 10 erisim kalemi
bedel: gunde 34 refakatli gecis x 12 dk = 408 dk (6.8 saat/gun)
```

Üç teknik tablosu zincirlerin ne kadar kısa olduğunu gösteriyor: dört, üç ve üç adım. Üçünde de ilk
adım denetimsizdir ve üçünde de denetimli halka sayısı ikidir. Erken kırma kazançları farklıdır:
peşine takılmada iki, omuz sörfünde bir, çöp karıştırmada üç erişim kalemi. En yüksek kazanç çöp
karıştırmadadır, çünkü ikinci adımı — belge toplama — üç kalem düşürür ve o adımı kıran denetim
kapıda değil, atığın ayrılmasındadır. Zincir hiç kırılmazsa düşen kalem yedidir.

Yol tablosu peşine takılmayı bina üzerinde koşturuyor ve kursun ikinci kez gördüğü durumu bir kez
daha üretiyor: sekiz yolun ikisinde hiçbir halka kırılmıyor. Bu iki yol arşive gidiyor ve
düşen kalem yedidir — zincirin tamamı. Kalan altı yolda en erken kırılabilen halkada düşen kalem ya
sıfır ya ikidir; yani denetim varsa erkendir, yoksa hiç yoktur. Arada bir seçenek çıkmıyor.

Refakat yordamı sütunları karşılaştırınca yordamın nerede işe yaradığı görünüyor. Altı yolda hiçbir
şey değişmiyor, çünkü o yollarda zaten erken kırılan bir halka var. Değişen iki yol, hiç
kırılmayanlardır: düşen kalem yediden ikiye iniyor ve toplam kazanç on erişim kalemidir. Yordamın
kazandırdığı her şey, daha önce hiçbir denetimin bulunmadığı iki güzergâhtadır.

Bedel tek satırda yazılı: günde otuz dört refakatli geçiş, geçiş başına ortalama on iki dakika,
toplam 408 dakika — günde 6,8 saat. Bu süre bir kişinin işgücünün tamamına yakınıdır ve refakat
edenin kendi işinden düşer. Yordamın yalnız iki güzergâhta kazanç sağladığı bilindiğinde ortaya
ölçülebilir bir seçenek çıkar: refakat yerine o iki güzergâhtaki üç denetimsiz kapıya görsel ya da
tek kişilik geçiş denetimi eklemek. İkisi de aynı on kalemi kazandırır; biri her gün ödenir, öteki
bir kez.

#### Özet

- Bina modelinde 10 kapı, 5 kart türü ve 2 görsel doğrulama noktası var. 3 kapı denetimsiz, 4 kapı
  yalnız kartla açılıyor; peşine takılmayı kıran kapı sayısı 3'tür.
- Sunucu odasına 4 yol gidiyor ve kırıcı kapı sayısı 3 ile 1 arasında değişiyor. Arşive giden 4
  yolun 2'sinde kırıcı kapı sayısı 0'dır.
- Üç tekniğin de ilk adımı denetimsizdir. Erken kırma kazancı peşine takılmada 2, omuz sörfünde 1,
  çöp karıştırmada 3 erişim kalemidir; zincir hiç kırılmazsa düşen kalem 7, 5 ve 7'dir.
- Peşine takılma 8 yolun 6'sında kırılıyor, 2'sinde hiç kırılmıyor. Kırılan yollarda en erken
  halkada düşen kalem 0 ya da 2; ara bir değer çıkmıyor.
- Refakat yordamı yalnız o 2 yolda etkili: düşen kalem 7'den 2'ye iniyor, toplam kazanç 10 erişim
  kalemidir. Öteki 6 yolda kazanç 0'dır.
- Yordamın bedeli günde 34 refakatli geçiş × 12 dakika = 408 dakika (6,8 saat). Aynı 10 kalem, o 2
  güzergâhtaki 3 denetimsiz kapıya denetim eklenerek de kazanılır.

#### Sonraki Adım

Bu dersin bütün zincirleri bir kapıdan geçmeyi gerektirdi ve her kapı sayılabilir bir kalemdi.
Uzaktan yapılan bir taklit hiçbir kapıya ihtiyaç duymaz: gerçek bir adın bir karakter uzağındaki
bir alan adı, kaydedildiği anda hiçbir denetimin karşısına çıkmaz. Bu adların **üretilmesi** değil,
**tespit edilmesi** ölçülebilir bir iştir: korunan adlarla aday adlar arasındaki düzenleme uzaklığı
hesaplanabilir, görsel olarak benzeyen karakterler normalleştirilebilir. Sonraki dersin sorusu
budur: bir kayıt listesinde kaç taklit adayı çıkıyor, bunların kaçı yanlış pozitif ve kaydın
izlenmesi kullanıma geçmeden önce kaç günlük pencere kazandırıyor.

### Alan Adı Taklidi

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/alan-adi-taklidi

Yazım hatası ve görsel benzer alan adlarını kurgu bir kayıt listesinde tespit etmek: düzenleme uzaklığı ile görsel normalizasyonun ayrı ayrı ve birlikte yakaladığı aday sayısı, her ölçütün yanlış pozitifi, kaçırılan tek taklit ve kayıt izlemesinin kazandırdığı ortalama 11,3 günlük pencere.

Önceki dersin bütün zincirleri bir kapıdan geçmeyi gerektirdi ve her kapı sayılabilir bir kalemdi.
Uzaktan yapılan bir taklit hiçbir kapıya ihtiyaç duymaz: korunan bir adın bir karakter uzağındaki
bir ad, kaydedildiği anda hiçbir denetimin karşısına çıkmaz. Bu adların **tespiti** ise ölçülebilir
bir iştir ve bu ders yalnız onu ölçer — bir ad üretilmez, gözlenen bir kayıt listesi taranır.

İki ölçüt kullanılır. Birincisi düzenleme uzaklığıdır: bir etiketi korunan bir ada dönüştürmek için
kaç ekleme, silme ve değiştirme gerekiyor. İkincisi görsel benzerliktir: birbirine benzeyen yazımlar
tek bir biçime indirgenir, sonra uzaklık yeniden ölçülür. İkisi farklı taklitleri yakalar ve
ikisinin de kendi yanlış pozitifi vardır. Üçüncü ölçü zaman tarafındadır: bir adın kaydedildiği gün
ile ilk kullanıldığı gün arasındaki fark, savunmanın zinciri hangi halkada kırabileceğini belirler.

- **SM25.** Korunan adlar, kayıt listesi ve günler kurgusaldır ve belgeleme için ayrılmış uzantılar
  kullanılmıştır. Gerçek bir alan adı, kurum ya da marka anılmıyor; ölçülen şey `node` ile kurulan
  modeldir.
- **SM26.** Kayıtların gerçek sınıfı modelde bilinir. Gerçekte sınıf ancak inceleme sonrası bilinir;
  bilindiği varsayılıyor ki yakalanan ile yanlış pozitif ayrı ayrı sayılabilsin.
- **SM27.** Görsel normalizasyon beş karışan biçimle sınırlı tutuldu. Gerçek bir tarayıcıda karışan
  yazım kümesi çok daha geniştir ve farklı yazı sistemlerinden gelen karakterleri de kapsar; dar
  küme yakalananı azaltır, ölçünün yönünü değiştirmez.
- **SM28.** Etiket karşılaştırması uzantıdan bağımsız yapılır. Aynı etiketin farklı bir uzantıyla
  kaydedilmesi uzaklık sıfır verir ve listede böyle bir kayıt vardır.
- **SM29.** İlk kullanım günü modelde bilinir. Gerçekte kullanım ancak gözlendiğinde bilinir;
  pencere bu yüzden modelde olduğundan **kısa** ölçülür.
- **SM30.** Kayıt akışının eksiksiz gözlendiği varsayıldı. Gözlenmeyen bir kayıt hiçbir ölçütle
  bulunamaz ve o durumda zincirin ilk halkası hiç sayılamaz.

#### İki Ölçütün Çıktısı

```js
// ad.mjs — korunan adlar, gozlenen kayit listesi ve tespit olcutleri; model (ad uretilmez, olculur)
export const KORUNAN = ['olcumag', 'aboneportali', 'sahaislem']; // uzanti .example
// [etiket, uzanti, kayit gunu, ilk kullanim gunu, gercek sinif]
export const KAYIT = [
  ['olcurnag', '.example', 3, 19, 'taklit'], ['o1cumag', '.test', 5, 12, 'taklit'],
  ['olcunag', '.example', 8, 26, 'taklit'], ['ab0neportali', '.example', 11, 21, 'taklit'],
  ['aboneportali-giris', '.test', 12, 15, 'taklit'], ['sahais1em', '.example', 14, 30, 'taklit'],
  ['sahaisiem', '.invalid', 16, 24, 'taklit'], ['sahaislem', '.test', 18, 22, 'taklit'],
  ['olcumak', '.example', 2, 4, 'ilgisiz'], ['aboneportal', '.test', 6, 9, 'ilgisiz'],
  ['sahaisleme', '.example', 7, 10, 'ilgisiz'], ['olcumagaza', '.test', 9, 13, 'ilgisiz'],
  ['abonelik', '.example', 10, 14, 'ilgisiz'], ['sahakayit', '.invalid', 13, 17, 'ilgisiz'],
  ['olcumerkezi', '.example', 15, 20, 'ilgisiz'], ['portalabone', '.test', 17, 23, 'ilgisiz'],
  ['veriolcum', '.example', 19, 25, 'ilgisiz'], ['sayacokuma', '.invalid', 20, 27, 'ilgisiz'],
  ['faturaservisi', '.example', 21, 28, 'ilgisiz'], ['isemriakisi', '.test', 22, 29, 'ilgisiz'],
  ['bolgeolcum', '.example', 23, 31, 'ilgisiz'], ['aboneislem', '.invalid', 24, 32, 'ilgisiz'],
  ['sahaportali', '.test', 25, 33, 'ilgisiz'], ['olcumveri', '.example', 26, 34, 'ilgisiz'],
  ['olcumaci', '.test', 4, 8, 'ilgisiz'],
];
export function uzaklik(a, b) { // duzenleme uzakligi
  const d = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
  for (let j = 0; j <= b.length; j++) d[0][j] = j;
  for (let i = 1; i <= a.length; i++)
    for (let j = 1; j <= b.length; j++)
      d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
  return d[a.length][b.length];
}
// gorsel benzerlik: karisan bicimler tek bir yazima indirgenir, sonra uzaklik olculur
export const normalize = (s) => s.replace(/rn/g, 'm').replace(/vv/g, 'w')
  .replace(/1/g, 'l').replace(/0/g, 'o').replace(/5/g, 's');
export const enYakin = (etiket, f = (x) => x) =>
  KORUNAN.reduce((a, k) => Math.min(a, uzaklik(f(etiket), f(k))), Infinity);
export const pencere = (k) => k[3] - k[2];
// [adim, onkosul, adimi goren denetim, adim bitince dusen kalem]
export const ZINCIR = [
  ['ad kaydi', 'kayit hizmetine erisim', 'kayit akisinin izlenmesi', 0],
  ['posta ve sertifika kurulumu', 'kayitli ad', 'seffaflik kaydinin izlenmesi', 1],
  ['ilk ileti', 'hedef adres listesi', 'gosterge esigi', 2],
  ['kimlik bilgisi toplama', 'inandirici toplama noktasi', 'ikinci etmen', 3],
  ['toplanan bilginin kullanimi', 'gecerli oturum', 'olagandisi oturum tespiti', 6],
];
```

```js
// kosum1.mjs — kayit listesinde duzenleme uzakligi ve gorsel benzerlik olcumu
import { KORUNAN, KAYIT, normalize, enYakin, pencere } from './ad.mjs';

console.log(`${KORUNAN.length} korunan ad (${KORUNAN.map((k) => k + '.example').join(', ')}), ` +
  `${KAYIT.length} gozlenen kayit, ${KAYIT.filter((k) => k[4] === 'taklit').length} taklit\n`);
console.log(`${'etiket'.padEnd(19)} ${'uzanti'.padEnd(9)} ${'sinif'.padStart(7)} ${'uzaklik'.padStart(7)} ` +
  `${'gorsel'.padStart(6)} ${'kayit'.padStart(5)} ${'kullanim'.padStart(8)} ${'pencere'.padStart(7)}`);
const yakin = [...KAYIT].sort((a, b) => enYakin(a[0]) - enYakin(b[0])).filter((k) => enYakin(k[0]) <= 3 || k[4] === 'taklit');
for (const k of yakin)
  console.log(`${k[0].padEnd(19)} ${k[1].padEnd(9)} ${k[4].padStart(7)} ${String(enYakin(k[0])).padStart(7)} ` +
    `${String(enYakin(k[0], normalize)).padStart(6)} ${String(k[2]).padStart(5)} ${String(k[3]).padStart(8)} ` +
    `${String(pencere(k)).padStart(7)}`);
const uzak = KAYIT.filter((k) => enYakin(k[0]) > 3 && k[4] !== 'taklit');
console.log(`\nlistenin geri kalani: ${uzak.length} kayit, uzaklik ${Math.min(...uzak.map((k) => enYakin(k[0])))}-${Math.max(...uzak.map((k) => enYakin(k[0])))}, ` +
  `hicbiri taklit degil ve hicbirinde gorsel esleme yok`);
const gorselSifir = KAYIT.filter((k) => enYakin(k[0], normalize) === 0);
console.log(`gorsel normalizasyondan sonra uzakligi 0 olan kayit ${gorselSifir.length}: ` +
  `${gorselSifir.map((k) => `${k[0]} (${k[4]}, ham uzaklik ${enYakin(k[0])})`).join('; ')}`);
console.log(`normalizasyonun degistirdigi etiket ${KAYIT.filter((k) => normalize(k[0]) !== k[0]).length}`);
```

```
3 korunan ad (olcumag.example, aboneportali.example, sahaislem.example), 25 gozlenen kayit, 8 taklit

etiket              uzanti      sinif uzaklik gorsel kayit kullanim pencere
sahaislem           .test      taklit       0      0    18       22       4
o1cumag             .test      taklit       1      0     5       12       7
olcunag             .example   taklit       1      1     8       26      18
ab0neportali        .example   taklit       1      0    11       21      10
sahais1em           .example   taklit       1      0    14       30      16
sahaisiem           .invalid   taklit       1      1    16       24       8
olcumak             .example  ilgisiz       1      1     2        4       2
aboneportal         .test     ilgisiz       1      1     6        9       3
sahaisleme          .example  ilgisiz       1      1     7       10       3
olcurnag            .example   taklit       2      0     3       19      16
olcumaci            .test     ilgisiz       2      2     4        8       4
olcumagaza          .test     ilgisiz       3      3     9       13       4
aboneportali-giris  .test      taklit       6      6    12       15       3

listenin geri kalani: 12 kayit, uzaklik 4-10, hicbiri taklit degil ve hicbirinde gorsel esleme yok
gorsel normalizasyondan sonra uzakligi 0 olan kayit 5: olcurnag (taklit, ham uzaklik 2); o1cumag (taklit, ham uzaklik 1); ab0neportali (taklit, ham uzaklik 1); sahais1em (taklit, ham uzaklik 1); sahaislem (taklit, ham uzaklik 0)
normalizasyonun degistirdigi etiket 4
```

Tablonun ilk satırı en ucuz taklidi gösteriyor: korunan etiketin **aynısı**, yalnız uzantısı farklı.
Düzenleme uzaklığı sıfırdır ve hiçbir yazım değişikliği içermez. Etiket karşılaştırmasını uzantıdan
bağımsız yapmayan bir tarama bunu hiç görmez.

Uzaklık bir olan satırlarda ölçünün gerilimi görünüyor: sekiz satırın beşi taklit, üçü ilgisizdir.
Aynı bantta duran `olcumak` ve `aboneportal` gerçek bir taklit değil, korunan ada bir harf uzaklıkta
bulunan başka kelimelerdir. Düzenleme uzaklığı bunları ayıramaz, çünkü ayıracak bilgi uzaklıkta
yoktur.

Görsel sütunu ikinci ölçütün ne yaptığını gösteriyor. Beş kayıtta normalizasyondan sonra uzaklık
sıfıra iniyor ve **beşi de taklittir**. Bunlardan biri ham uzaklığı iki olan `olcurnag`: iki
karakterin birlikte tek bir karaktere benzemesi düzenleme uzaklığını iki adım uzatır, oysa görsel
olarak fark yoktur. Normalizasyon yirmi beş etiketin dördünü değiştiriyor; bu ölçüt dar bir kümede
çalışır ve tam da bu yüzden yanlış pozitif üretmez.

Son satırdaki taklit iki ölçütün de dışında kalıyor. `aboneportali-giris` korunan adı olduğu gibi
içerir ve ona bir sözcük ekler; düzenleme uzaklığı altıdır. İki ölçüt de yazımın **değişmesine**
bakar, oysa burada yazım hiç değişmemiştir.

#### Ölçütlerin Karşılaştırması ve Pencere

```js
// kosum2.mjs — esik taramasi, birlesik olcut, izleme penceresi ve zincirin erken kirma kazanci
import { KAYIT, ZINCIR, normalize, enYakin, pencere } from './ad.mjs';

const TAKLIT = KAYIT.filter((k) => k[4] === 'taklit').length;
const say = (f) => { const a = KAYIT.filter(f); return { aday: a.length, dogru: a.filter((k) => k[4] === 'taklit').length,
  yanlis: a.filter((k) => k[4] === 'ilgisiz').length, kacan: KAYIT.filter((k) => k[4] === 'taklit' && !f(k)) }; };
console.log(`${'olcut'.padEnd(28)} ${'aday'.padStart(4)} ${'yakalanan'.padStart(9)} ${'yanlis pozitif'.padStart(14)} ${'kacan'.padStart(5)}`);
for (const e of [0, 1, 2, 3]) {
  const r = say((k) => enYakin(k[0]) <= e);
  console.log(`${`duzenleme uzakligi <= ${e}`.padEnd(28)} ${String(r.aday).padStart(4)} ${`${r.dogru}/${TAKLIT}`.padStart(9)} ` +
    `${String(r.yanlis).padStart(14)} ${String(r.kacan.length).padStart(5)}`);
}
const g = say((k) => enYakin(k[0], normalize) === 0);
console.log(`${'gorsel benzerlik = 0'.padEnd(28)} ${String(g.aday).padStart(4)} ${`${g.dogru}/${TAKLIT}`.padStart(9)} ` +
  `${String(g.yanlis).padStart(14)} ${String(g.kacan.length).padStart(5)}`);
const b = say((k) => enYakin(k[0], normalize) === 0 || enYakin(k[0]) <= 1);
console.log(`${'birlesik (gorsel 0 ya da <=1)'.padEnd(28)} ${String(b.aday).padStart(4)} ${`${b.dogru}/${TAKLIT}`.padStart(9)} ` +
  `${String(b.yanlis).padStart(14)} ${String(b.kacan.length).padStart(5)}`);
console.log(`\nbirlesik olcutun kacirdigi: ${b.kacan.map((k) => `${k[0]} (uzaklik ${enYakin(k[0])}, pencere ${pencere(k)} gun)`).join('; ')}`);
const bulunan = KAYIT.filter((k) => k[4] === 'taklit' && (enYakin(k[0], normalize) === 0 || enYakin(k[0]) <= 1));
const p = bulunan.map(pencere);
console.log(`yakalanan ${bulunan.length} taklit icin izleme penceresi: ortalama ${(p.reduce((a, c) => a + c, 0) / p.length).toFixed(2)} gun, ` +
  `en kisa ${Math.min(...p)}, en uzun ${Math.max(...p)}`);
console.log(`yanlis pozitiflerin elle inceleme yuku: ${b.yanlis} kayit`);

let s = 0; const kumul = ZINCIR.map((a) => (s += a[3]));
console.log(`\n${'#'.padStart(2)} ${'adim'.padEnd(28)} ${'onkosul'.padEnd(27)} ${'denetim'.padEnd(28)} kirilirsa dusen`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(28)} ${a[1].padEnd(27)} ${a[2].padEnd(28)} ` +
  `${i ? kumul[i - 1] : 0}`));
console.log(`zincir ${ZINCIR.length} adim, hepsinde denetim var; hic kirilmazsa dusen kalem ${kumul[4]}`);
console.log(`izleme varken en erken halka 1 (dusen 0), en gec halka 5 (dusen ${kumul[3]}); erken kirma kazanci ${kumul[3]} kalem`);
console.log(`kayit izleme yoksa en erken halka 3 (dusen ${kumul[1]}) ve ortalama ${(p.reduce((a, c) => a + c, 0) / p.length).toFixed(2)} gunluk pencere kullanilmaz`);
```

```
olcut                        aday yakalanan yanlis pozitif kacan
duzenleme uzakligi <= 0         1       1/8              0     7
duzenleme uzakligi <= 1         9       6/8              3     2
duzenleme uzakligi <= 2        11       7/8              4     1
duzenleme uzakligi <= 3        12       7/8              5     1
gorsel benzerlik = 0            5       5/8              0     3
birlesik (gorsel 0 ya da <=1)   10       7/8              3     1

birlesik olcutun kacirdigi: aboneportali-giris (uzaklik 6, pencere 3 gun)
yakalanan 7 taklit icin izleme penceresi: ortalama 11.29 gun, en kisa 4, en uzun 18
yanlis pozitiflerin elle inceleme yuku: 3 kayit

 # adim                         onkosul                     denetim                      kirilirsa dusen
 1 ad kaydi                     kayit hizmetine erisim      kayit akisinin izlenmesi     0
 2 posta ve sertifika kurulumu  kayitli ad                  seffaflik kaydinin izlenmesi 0
 3 ilk ileti                    hedef adres listesi         gosterge esigi               1
 4 kimlik bilgisi toplama       inandirici toplama noktasi  ikinci etmen                 3
 5 toplanan bilginin kullanimi  gecerli oturum              olagandisi oturum tespiti    6
zincir 5 adim, hepsinde denetim var; hic kirilmazsa dusen kalem 12
izleme varken en erken halka 1 (dusen 0), en gec halka 5 (dusen 6); erken kirma kazanci 6 kalem
kayit izleme yoksa en erken halka 3 (dusen 1) ve ortalama 11.29 gunluk pencere kullanilmaz
```

Karşılaştırma tablosu iki ölçütün farklı biçimde yanıldığını gösteriyor. Düzenleme uzaklığı eşiği
birden üçe çıkarken yakalanan altıdan yediye çıkıyor ve yanlış pozitif üçten beşe. Görsel benzerlik
tek başına yalnız beş taklit yakalıyor ama **hiç yanlış pozitif üretmiyor**. Birleşik ölçüt yedi
taklit yakalıyor ve üç yanlış pozitif üretiyor; uzaklık eşiği ikiyle aynı yakalamayı bir eksik
yanlış pozitifle veriyor. İki dar ölçütü birleştirmek, tek bir ölçütü gevşetmekten daha az yanlış
üretir — bu, eşik ayarının yerine geçen bir tasarım kararıdır.

Kaçan tek taklit iki ölçütün de sınırıdır. Korunan adı olduğu gibi içeren ve ona bir sözcük ekleyen
bir etiket, uzaklık cinsinden korunan addan uzaktır. Bunu yakalayacak ölçüt bir üçüncüsüdür:
korunan adın **alt dizi olarak** geçmesi. Bu ölçütün kendi yanlış pozitifi olacaktır ve bu ders onu
ölçmüyor; ölçtüğü şey, iki ölçütün birlikte de bir tanesini kaçırdığıdır.

Pencere satırı zaman tarafını veriyor. Yakalanan yedi taklidin kayıt günü ile ilk kullanım günü
arasında ortalama 11,29 gün var; en kısası dört, en uzunu on sekiz gün. Bu süre bir dedektörün
doğruluk ölçüsü değil, savunmanın **elindeki zamandır**: kayıt akışı izleniyorsa zincir birinci
halkada kırılabilir ve o anda hiçbir kalem düşmemiştir.

Pencerenin dağılımı ortalamadan daha çok şey söylüyor. En kısa pencere dört gündür ve tabloya
bakıldığında hangi kayda ait olduğu görünür: korunan etiketin farklı uzantıyla kaydedilmiş hali.
Kurması en ucuz olan taklit, kullanıma da en hızlı geçendir. En uzun pencere on sekiz gündür ve
aradaki oran dört buçuk kattır. Kayıt akışını haftada bir tarayan bir izleme, ortalamanın üzerinde
kalan kayıtları zamanında görür ve dört günlük pencereyi kaçırır; ölçüde belirleyici olan ortalama
değil, en kısa penceredir.

Zincir tablosu bunu kalem cinsinden yazıyor. Beş adımın hepsinde bir denetim var; zincir hiç
kırılmazsa düşen kalem on ikidir. Birinci halkada kırmak sıfır kalemle biter, beşinci halkada
kırmak altı kalemle — erken kırma kazancı altı kalemdir. Kayıt akışı izlenmiyorsa en erken
kırılabilen halka üçüncü adıma kayar: orada bir kalem düşmüştür ve ortalama on bir günlük pencere
hiç kullanılmamıştır. Yanlış pozitiflerin bedeli aynı tabloda üç kayıtlık elle incelemedir; bu, on
bir günlük pencerenin karşılığında ödenen ücrettir.

#### Özet

- 25 kayıtlık kurgu listede 8 taklit var. Düzenleme uzaklığı 0 olan 1 kayıt, korunan etiketin farklı
  uzantıyla kaydedilmiş halidir; uzantıdan bağımsız karşılaştırma yapmayan tarama bunu görmez.
- Uzaklık eşiği 1'de 6/8 yakalanıyor ve 3 yanlış pozitif çıkıyor; eşik 3'te yakalanan 7'de kalırken
  yanlış pozitif 5'e çıkıyor.
- Görsel normalizasyon 25 etiketin 4'ünü değiştiriyor ve tek başına 5 taklidi 0 yanlış pozitifle
  yakalıyor. Bunlardan biri ham uzaklığı 2 olan bir kayıttır.
- Birleşik ölçüt 7/8 yakalıyor ve 3 yanlış pozitif üretiyor: aynı yakalamayı uzaklık eşiği 2'den 1
  eksik yanlış pozitifle veriyor.
- Kaçan tek taklit, korunan adı olduğu gibi içerip sözcük ekleyen kayıttır (uzaklık 6). İki ölçüt de
  yazımın değişmesine bakar; burada yazım değişmemiştir.
- Yakalanan 7 taklidin izleme penceresi ortalama 11,29 gün (en kısa 4, en uzun 18). Kayıt izlemesi
  varsa zincir 1. halkada kırılır (0 kalem), yoksa en erken 3. halkada (1 kalem); erken kırma
  kazancı 6 kalem, bedeli 3 kayıtlık elle incelemedir.

#### Sonraki Adım

Bu dersin taklidi hedefi kendisine çağırıyordu: bir ad kaydediliyor ve hedefin ona gitmesi
bekleniyordu. Tersi de mümkündür — hedefin **zaten gittiği** bir yerin bozulması. Kurum içindeki
kullanıcıların bir bölümü her gün aynı dış kaynağa uğrar: ortak bir belge deposu, bir sektör
duyuru sayfası, bir betik ya da yazı tipi kaynağı. O kaynak kurumun denetiminde değildir ve tek bir
noktadır. Sonraki dersin sorusu budur: kaç kullanıcı aynı dış kaynağa gidiyor, bu paylaşılan
bağımlılık kaç zinciri aynı anda açıyor ve bir kaynak bütünlüğü denetimi bunların kaçını kırıyor.

### Su Kuyusu Saldırıları

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/su-kuyusu-saldirilari

Su kuyusu saldırısını paylaşılan bağımlılık olarak modellemek: altı iç uygulamanın gittiği sekiz dış kaynak, tek bir kaynağın kaç kullanıcıyı aynı anda ilgilendirdiği, altı adımlık zincirin kaynak başına hangi halkada kırıldığı, kaynak bütünlüğü karmasının kırdığı üç zincir ve sürüm sabitlemesinin yılda 48 günlük gecikme bedeli.

Önceki dersin taklidi hedefi kendisine çağırıyordu: bir ad kaydediliyor ve hedefin ona gitmesi
bekleniyordu. Tersi de mümkündür — hedefin **zaten gittiği** bir yerin bozulması. Kurum içindeki
kullanıcıların bir bölümü her gün aynı dış kaynağa uğrar: ortak bir betik kütüphanesi, bir yazı
tipi kaynağı, bir belge deposu, bir sektör duyuru sayfası. Bu kaynaklar kurumun denetiminde
değildir ve her biri tek bir noktadır.

Su kuyusu saldırısı bu yüzden hedefe değil, hedefin **bağımlılığına** yönelir. Dar tanımıyla su
kuyusu, kullanıcının **doğrudan gittiği** bir sayfanın bozulmasıdır — belge deposu ile duyuru
sayfası bu tanıma girer; uygulamanın gömüp çalıştırdığı betik ve yazı tipi kaynakları ise
**tedarik zinciri** saldırısıyla örtüşür. Bu ders ikisini tek bir ölçüde birleştirir, çünkü
sorduğu soru ikisinde de aynıdır: bir dış kaynak bozulduğunda kaç kullanıcı aynı anda ilgilenir
ve bu kullanıcıların zinciri hangi halkada kırılır? Kaynak türü burada belirleyicidir, çünkü
hangi denetimin uygulanabildiğini tür belirler. Sürüm sabitlenebilen bir kaynağın karması
hesaplanabilir; kullanıcının doğrudan gittiği bir dış sayfanın karması yoktur. Zincirin sonundaki
adım — drive-by indirme sonrası tutunma — bu kursun Teknik Saldırı Sınıfları konusunda ölçülür;
burada yalnız zincirin son halkası olarak geçer.

- **SM31.** Uygulamalar, kullanıcı sayıları ve dış kaynak listesi kurgusal bölgesel ölçüm ağına
  aittir. Gerçek bir kaynak çağrılmıyor; ölçülen şey `node` ile kurulan modeldir.
- **SM32.** Uygulamaların kullanıcı kümeleri ayrık sayıldı. Gerçekte bir kullanıcı birden çok
  uygulamayı kullanır; ayrıklık toplam kullanıcıyı olduğundan **büyük**, örtüşen kaynak paylaşımını
  olduğundan **küçük** gösterir.
- **SM33.** Bir kaynağa uygulanabilen denetimler modelde sabit yazıldı. Gerçekte bir kaynağın
  sürümü sabitlenebilir mi sorusunun cevabı sağlayıcıya bağlıdır ve zamanla değişir.
- **SM34.** Zincirin ikinci adımı — kaynağın bozulması — kurumun denetim alanının dışındadır ve bu
  yüzden hiçbir denetimle eşlenmedi. Sağlayıcının kendi savunması modellenmedi.
- **SM35.** Düşen kalem, o adımdan sonra erişilebilir hale gelen oturum, dosya ve uç kaleminin
  sayısıdır. Kalem türleri ayrı ağırlıklandırılmadı.
- **SM36.** Elle onay gecikmesi ve yıllık güncelleme sayısı kurgudur. İkisi de kaynak türüne göre
  büyük ölçüde değişir; sabit değer bedelin **yönünü** gösterir, büyüklüğünü değil.

#### Paylaşım Kaç Kullanıcı Demek

```js
// kaynak.mjs — ic uygulamalar, paylasilan dis kaynaklar ve su kuyusu zinciri; model
// [uygulama, gunluk kullanici]
export const UYGULAMA = [
  ['saha is emri uygulamasi', 180], ['abone portali', 1400], ['fatura uretim arayuzu', 60],
  ['sube uc panosu', 90], ['olcum izleme panosu', 240], ['ic duyuru sayfasi', 620],
];
export const kullanici = (ad) => UYGULAMA.find((u) => u[0] === ad)[1];
const [S, A, F, U, O, D] = UYGULAMA.map((u) => u[0]);
// denetim -> zincirin kactaki adimini kiriyor
export const DENETIM = { karma: 3, politika: 4, imza: 5, 'uc nokta': 6 };
// [dis kaynak, tur, kullanan uygulamalar, uygulanabilen denetimler, yillik guncelleme]
export const KAYNAK = [
  ['ortak betik kutuphanesi', 'betik', [S, A, F, U, O, D], ['karma', 'politika', 'uc nokta'], 12],
  ['yazi tipi kaynagi', 'yazi tipi', [A, O, D], ['karma', 'politika', 'uc nokta'], 2],
  ['grafik cizim kutuphanesi', 'betik', [F, O], ['karma', 'politika', 'uc nokta'], 6],
  ['harita karo hizmeti', 'gorsel', [S, O], ['politika', 'uc nokta'], 0],
  ['olcum arac indirmesi', 'ikili', [S, U], ['imza', 'uc nokta'], 4],
  ['takvim beslemesi', 'veri', [A, D], ['politika', 'uc nokta'], 0],
  ['ortak belge deposu', 'dis sayfa', [S, F, U, D], ['uc nokta'], 0],
  ['sektor duyuru sayfasi', 'dis sayfa', [F, D], ['uc nokta'], 0],
];
// [adim, onkosul, adim bitince dusen kalem]
export const ZINCIR = [
  ['paylasilan kaynagin belirlenmesi', 'dis kaynak listesinin disaridan gorulmesi', 0],
  ['kaynagin bozulmasi', 'kaynak saglayicisi tarafinda erisim', 0],
  ['teslim', 'istemcinin kaynagi cekmesi', 1],
  ['istemcide calisma', 'istemcinin kaynagi calistirmasi', 2],
  ['yerel indirme', 'kullanici onayi', 3],
  ['tutunma', 'calistirma izni', 6],
];
export const KUMUL = (() => { let s = 0; return ZINCIR.map((a) => (s += a[2])); })();
export const erisen = (k) => k[2].reduce((a, u) => a + kullanici(u), 0);
export function halkalar(k, karmaVar = true) {
  return k[3].filter((d) => karmaVar || d !== 'karma').map((d) => DENETIM[d]).sort((a, b) => a - b);
}
export const dusen = (h) => (h.length ? KUMUL[h[0] - 2] ?? 0 : KUMUL[ZINCIR.length - 1]);
```

```js
// kosum1.mjs — paylasilan dis kaynaklarin kullanici sayisi ve zincirin en erken kirilan halkasi
import { UYGULAMA, KAYNAK, ZINCIR, KUMUL, erisen, halkalar, dusen } from './kaynak.mjs';

const toplam = UYGULAMA.reduce((a, u) => a + u[1], 0);
console.log(`${UYGULAMA.length} ic uygulama, gunluk ${toplam} kullanici; ${KAYNAK.length} paylasilan dis kaynak`);
console.log(`zincir ${ZINCIR.length} adim, hic kirilmazsa dusen kalem ${KUMUL[ZINCIR.length - 1]}\n`);
console.log(`${'#'.padStart(2)} ${'adim'.padEnd(33)} ${'onkosul'.padEnd(42)} ${'dusen'.padStart(5)}`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(33)} ${a[1].padEnd(42)} ${String(KUMUL[i]).padStart(5)}`));
console.log(`\n${'dis kaynak'.padEnd(25)} ${'tur'.padEnd(10)} ${'uygulama'.padStart(8)} ${'kullanici'.padStart(9)} ` +
  `${'denetim'.padStart(7)} ${'en erken halka'.padStart(14)} ${'dusen'.padStart(5)}`);
const sirali = [...KAYNAK].sort((a, b) => erisen(b) - erisen(a));
for (const k of sirali) {
  const h = halkalar(k);
  console.log(`${k[0].padEnd(25)} ${k[1].padEnd(10)} ${String(k[2].length).padStart(8)} ${String(erisen(k)).padStart(9)} ` +
    `${String(h.length).padStart(7)} ${String(h[0]).padStart(14)} ${String(dusen(h)).padStart(5)}`);
}
const eslesme = KAYNAK.reduce((a, k) => a + erisen(k), 0);
console.log(`\ntoplam kullanici-kaynak eslesmesi ${eslesme}; en cok paylasilan kaynak ${sirali[0][0]} ` +
  `(${sirali[0][2].length}/${UYGULAMA.length} uygulama, ${erisen(sirali[0])} kullanici)`);
console.log(`tek bir kaynagin bozulmasi en fazla ${erisen(sirali[0])} kullaniciyi ayni anda ilgilendirir, ` +
  `bu toplam kullanicinin %${Math.round((erisen(sirali[0]) / toplam) * 100)}'idir`);
```

```
6 ic uygulama, gunluk 2590 kullanici; 8 paylasilan dis kaynak
zincir 6 adim, hic kirilmazsa dusen kalem 12

 # adim                              onkosul                                    dusen
 1 paylasilan kaynagin belirlenmesi  dis kaynak listesinin disaridan gorulmesi      0
 2 kaynagin bozulmasi                kaynak saglayicisi tarafinda erisim            0
 3 teslim                            istemcinin kaynagi cekmesi                     1
 4 istemcide calisma                 istemcinin kaynagi calistirmasi                3
 5 yerel indirme                     kullanici onayi                                6
 6 tutunma                           calistirma izni                               12

dis kaynak                tur        uygulama kullanici denetim en erken halka dusen
ortak betik kutuphanesi   betik             6      2590       3              3     0
yazi tipi kaynagi         yazi tipi         3      2260       3              3     0
takvim beslemesi          veri              2      2020       2              4     1
ortak belge deposu        dis sayfa         4       950       1              6     6
sektor duyuru sayfasi     dis sayfa         2       680       1              6     6
harita karo hizmeti       gorsel            2       420       2              4     1
grafik cizim kutuphanesi  betik             2       300       3              3     0
olcum arac indirmesi      ikili             2       270       2              5     3

toplam kullanici-kaynak eslesmesi 9490; en cok paylasilan kaynak ortak betik kutuphanesi (6/6 uygulama, 2590 kullanici)
tek bir kaynagin bozulmasi en fazla 2590 kullaniciyi ayni anda ilgilendirir, bu toplam kullanicinin %100'idir
```

Kaynak tablosunun ilk satırı ölçünün tamamını taşıyor. Ortak betik kütüphanesi altı uygulamanın
altısında da kullanılıyor ve 2.590 kullanıcının hepsine ulaşıyor — modeldeki toplam kullanıcının
yüzde yüzü. Bir tek dış kaynağın bozulması, kurumun içinde hiçbir şeye dokunmadan bütün
kullanıcıları aynı anda ilgilendirir. Kimlik avında hedef listesi kurulur; burada hedef listesi
zaten kuruludur ve onu kuran kurumun kendi bağımlılık seçimidir.

Kullanıcı sayısı ile uygulama sayısı aynı sıralamayı vermiyor. Takvim beslemesi yalnız iki
uygulamada kullanılıyor ama 2.020 kullanıcıya ulaşıyor; ortak belge deposu dört uygulamada
kullanılıyor ve 950 kullanıcıya. Paylaşımın ölçüsü kaç uygulamanın kullandığı değil, o
uygulamaların **kaç kişiye** hizmet ettiğidir. Bağımlılık envanterini uygulama sayısına göre
sıralayan bir çalışma yanlış üç kalemi öne çıkarır.

Son iki sütun zincirin nerede kırıldığını gösteriyor. Üç kaynakta en erken halka üçüncü adımdır ve
orada düşen kalem sıfırdır. İki dış sayfada en erken halka altıncı adımdır — zincirin son
adımı — ve oraya gelindiğinde altı kalem düşmüştür. Aradaki fark denetim sayısındadır: birinde üç
denetim uygulanabiliyor, ötekinde bir.

#### Bütünlük Denetiminin Kazancı ve Bedeli

```js
// kosum2.mjs — kaynak butunlugu denetiminin kirdigi zincir sayisi, kullanici agirlikli kazanc ve bedeli
import { UYGULAMA, KAYNAK, KUMUL, erisen, halkalar, dusen } from './kaynak.mjs';

const ONAY_GUN = 2; // kurgu: surum sabitlemede bir guncellemenin elle onay gecikmesi
console.log(`${'dis kaynak'.padEnd(25)} ${'kullanici'.padStart(9)} ${'karmasiz halka'.padStart(14)} ${'dusen'.padStart(5)} ` +
  `${'karmali halka'.padStart(13)} ${'dusen'.padStart(5)} ${'kazanc'.padStart(6)}`);
let kiran = 0, agirlikli = 0;
for (const k of [...KAYNAK].sort((a, b) => erisen(b) - erisen(a))) {
  const y = halkalar(k, false), v = halkalar(k, true), dy = dusen(y), dv = dusen(v);
  if (dy !== dv) { kiran++; agirlikli += (dy - dv) * erisen(k); }
  console.log(`${k[0].padEnd(25)} ${String(erisen(k)).padStart(9)} ${String(y[0]).padStart(14)} ${String(dy).padStart(5)} ` +
    `${String(v[0]).padStart(13)} ${String(dv).padStart(5)} ${String(dy - dv).padStart(6)}`);
}
const karmali = KAYNAK.filter((k) => k[3].includes('karma'));
const eslesme = KAYNAK.reduce((a, k) => a + erisen(k), 0);
console.log(`\nkaynak butunlugu karmasi ${kiran}/${KAYNAK.length} zinciri daha erken kiriyor; ` +
  `kapsadigi kullanici-kaynak eslesmesi ${karmali.reduce((a, k) => a + erisen(k), 0)}/${eslesme} (%${Math.round(karmali.reduce((a, k) => a + erisen(k), 0) / eslesme * 100)})`);
console.log(`kullanici agirlikli erken kirma kazanci ${agirlikli} kalem-kullanici`);
const gec = KAYNAK.filter((k) => halkalar(k)[0] === 6);
console.log(`en gec kirilan zincirler (halka 6, dusen ${KUMUL[4]}): ${gec.map((k) => `${k[0]} (${erisen(k)} kullanici)`).join('; ')}`);
console.log(`bu iki kaynakta karma uygulanamaz; ikisi de kurumun denetiminde olmayan dis sayfadir`);
const imzali = KAYNAK.filter((k) => k[3].includes('imza'));
const onay = [...karmali, ...imzali].reduce((a, k) => a + k[4], 0); // sabitlenen kaynaklarin yillik guncellemesi
console.log(`\nbedel: surum sabitlemesi gereken ${karmali.length + imzali.length} kaynak, yilda ${onay} elle onay, ` +
  `onay basina ${ONAY_GUN} gun gecikme = ${onay * ONAY_GUN} gun/yil kaynak eskimesi`);
console.log(`kapsam disi kalan ${KAYNAK.length - karmali.length - imzali.length} kaynak, ` +
  `${KAYNAK.filter((k) => !k[3].includes('karma') && !k[3].includes('imza')).reduce((a, k) => a + erisen(k), 0)} kullanici-kaynak eslesmesi`);
console.log(`toplam gunluk kullanici ${UYGULAMA.reduce((a, u) => a + u[1], 0)}; kapsam disi eslesme bunun ` +
  `${(KAYNAK.filter((k) => !k[3].includes('karma') && !k[3].includes('imza')).reduce((a, k) => a + erisen(k), 0) / UYGULAMA.reduce((a, u) => a + u[1], 0)).toFixed(2)} kati`);
```

```
dis kaynak                kullanici karmasiz halka dusen karmali halka dusen kazanc
ortak betik kutuphanesi        2590              4     1             3     0      1
yazi tipi kaynagi              2260              4     1             3     0      1
takvim beslemesi               2020              4     1             4     1      0
ortak belge deposu              950              6     6             6     6      0
sektor duyuru sayfasi           680              6     6             6     6      0
harita karo hizmeti             420              4     1             4     1      0
grafik cizim kutuphanesi        300              4     1             3     0      1
olcum arac indirmesi            270              5     3             5     3      0

kaynak butunlugu karmasi 3/8 zinciri daha erken kiriyor; kapsadigi kullanici-kaynak eslesmesi 5150/9490 (%54)
kullanici agirlikli erken kirma kazanci 5150 kalem-kullanici
en gec kirilan zincirler (halka 6, dusen 6): ortak belge deposu (950 kullanici); sektor duyuru sayfasi (680 kullanici)
bu iki kaynakta karma uygulanamaz; ikisi de kurumun denetiminde olmayan dis sayfadir

bedel: surum sabitlemesi gereken 4 kaynak, yilda 24 elle onay, onay basina 2 gun gecikme = 48 gun/yil kaynak eskimesi
kapsam disi kalan 4 kaynak, 4070 kullanici-kaynak eslesmesi
toplam gunluk kullanici 2590; kapsam disi eslesme bunun 1.57 kati
```

Karma sütunları kaynak bütünlüğü denetiminin ne yaptığını sayıyor: sekiz zincirin üçünü bir halka
daha erken kırıyor. Kazanç sütunu kaynak başına yalnız bir kalemdir, ama kapsadığı kullanıcı sayısı
büyüktür — kullanıcı ağırlıklı kazanç 5.150 kalem-kullanıcıdır ve toplam eşleşmenin yüzde elli
dördünü karşılar. Denetimin değeri kalem sayısında değil, o kalemin kaç kullanıcıda birden
düşmemesinde toplanıyor.

Kalan beş kaynakta karma hiçbir şey değiştirmiyor. İki dış sayfada bunun nedeni açıktır: kullanıcı
oraya doğrudan gidiyor ve çekilen şey sabit bir sürüm değil, o anki sayfadır. Bu iki kaynak zinciri
en geç kıran ikisidir — altıncı halka, altı kalem düşmüşken — ve birlikte 1.630 kullanıcıya
ulaşıyorlar. Bir kaynağın **paylaşılması** ile **denetlenebilmesi** arasında bir ilişki yoktur; en
çok paylaşılan kaynak en denetlenebilir olanıydı, en geç kırılan iki kaynak ise orta sıralarda
duruyor.

Bedel iki kalemde toplanıyor. Sürüm sabitlemesi gereken dört kaynak yılda yirmi dört elle onay
üretiyor; onay başına iki günlük gecikmeyle bu, yılda kırk sekiz gün boyunca kaynağın güncel
olmayan bir sürümde tutulması demektir. Bu gecikme kendi başına bir açıklık üretir: sağlayıcının
kapattığı bir sorun, onay tamamlanana kadar kurumda açık kalır. Denetimin bedeli burada bir işgücü
kalemi değil, **karşı yönde bir risk**tir.

Kapsam dışı kalan dört kaynak 4.070 kullanıcı-kaynak eşleşmesi taşıyor; bu, günlük toplam kullanıcı
sayısının 1,57 katıdır. Yani ortalama bir kullanıcı, hiçbir bütünlük denetimi bulunmayan bir buçuk
dış kaynağa her gün uğruyor. Zincirin bu kaynaklar üzerinden kırılması yalnız uç nokta korumasına
kalıyor ve orada düşen kalem altıdır.

#### Kırılamayan İlk İki Halka

Zincir tablosunun ilk iki adımının karşısında hiçbir denetim yok ve nedenleri farklıdır. Birinci
adım — paylaşılan kaynağın belirlenmesi — kurumun içinden görünmez, çünkü dış kaynak listesi
istemcinin çektiği her şeyde zaten yazılıdır; onu gizlemek diye bir seçenek yoktur. İkinci adım
kaynağın kendi tarafında geçer ve kurumun denetim alanının tamamen dışındadır.

Bu iki halka kırılamadığına göre geriye tek bir kaldıraç kalır: **kaç kaynağa bağımlı olunduğunu
azaltmak.** Tablo bunun ölçüsünü de veriyor. Ortak betik kütüphanesi kurum içine alınırsa 2.590
kullanıcılık eşleşme dış listeden düşer, ama kalem kurumun envanterine geçer ve güncel tutulması
kurumun işi olur. Kapsam dışı kalan dört kaynağın 4.070 eşleşmesi ise böyle taşınamaz: ikisi
kullanıcının doğrudan gittiği dış sayfadır ve içeri alınacak bir sürümleri yoktur.

Ölçünün kaydığı yer buradadır. İlk iki halka kırılamıyorsa kalan iş **tespittir**: hangi kaynağın
ne zaman değiştiğini gören bir kayıt, zinciri kırmaz ama üçüncü halkadaki denetimin ne zaman
devreye girdiğini gösterir. Bağımlılık envanteri bu yüzden bir belge değil, bir ölçüm kalemidir:
kaç kaynak, kaç kullanıcı, kaçında denetim var.

#### Özet

- 6 iç uygulama günde 2.590 kullanıcıya hizmet ediyor ve 8 dış kaynağı paylaşıyor. En çok paylaşılan
  kaynak 6 uygulamanın hepsinde kullanılıyor ve kullanıcıların %100'üne ulaşıyor.
- Kullanıcı sayısı ile uygulama sayısı aynı sıralamayı vermiyor: 2 uygulamada kullanılan bir kaynak
  2.020 kullanıcıya, 4 uygulamada kullanılan bir başkası 950 kullanıcıya ulaşıyor.
- Zincir 6 adım; hiç kırılmazsa düşen kalem 12'dir. 3 kaynakta en erken halka 3. adımdır (0 kalem),
  2 dış sayfada 6. adımdır (6 kalem).
- Kaynak bütünlüğü karması 8 zincirin 3'ünü bir halka erken kırıyor. Kullanıcı ağırlıklı kazanç
  5.150 kalem-kullanıcı, toplam eşleşmenin %54'ü.
- Karmanın uygulanamadığı 2 dış sayfa 1.630 kullanıcıya ulaşıyor ve zinciri en geç kıran ikisidir.
  Paylaşım derecesi ile denetlenebilirlik arasında bir ilişki çıkmıyor.
- Bedel: 4 kaynakta sürüm sabitlemesi, yılda 24 elle onay, 48 gün/yıl güncel olmayan sürüm. Kapsam
  dışı 4 kaynak 4.070 eşleşme taşıyor — günlük kullanıcı sayısının 1,57 katı.

#### Sonraki Adım

Altı ders boyunca ölçülen her denetim teknikti: bir yordam, bir eşik, bir kapı, bir karma. Oysa
zincirlerin çoğunda kırılabilen halka bir kişinin verdiği karara bağlıydı — geri arayıp aramamaya,
bir göstergeyi fark edip bildirmeye, bir kapıyı tutup tutmamaya. O kararın kendisi eğitilebilir bir
davranıştır ve eğitimin etkisi ölçülebilir. Sonraki dersin sorusu budur: bir farkındalık programı
iki ölçütte — bildirim oranı ve tıklama oranı — kaç puan kazandırıyor, bu kazanç kaç hafta sonra
eski değerine dönüyor ve programın kendi bedeli nedir. Konunun kapanış dersidir.

### Farkındalık Programları

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/farkindalik-programlari

Farkındalık programını iki ölçütle koşturmak: bildirim ve tıklama oranının eğitim sonrası haftalık seyri, kazancın kaçıncı haftada eski değerine döndüğü, ilk bildirime kadar tıklayan kişi sayısının on sekiz kat farkı ve dört pekiştirme aralığının saat başına getirisi.

Altı ders boyunca ölçülen her denetim teknikti: bir yordam, bir eşik, bir kapı, bir karma. Oysa
zincirlerin çoğunda kırılabilen halka bir kişinin verdiği karara bağlıydı — geri arayıp aramamaya,
bir göstergeyi fark edip bildirmeye, bir kapıyı tutup tutmamaya. Bu ders o kararı **eğitilebilir bir
davranış** olarak ele alır ve eğitimin etkisini iki ölçütle ölçer.

Ölçütlerin ikisi de orandır ve ters yönde okunur: bildirim oranı yükselmeli, tıklama oranı
düşmelidir. İkisi de bir programın hemen ardından iyileşir, sonra eski değerine döner. Bu dersin
asıl sorusu iyileşmenin büyüklüğü değil, **kalıcılığıdır**: kazanç kaçıncı haftada erir ve
pekiştirmenin bedeli neye eşittir? Üçüncü bir sayı iki oranı tek bir işletme büyüklüğüne bağlar —
ilk bildirim gelene kadar kaç alıcının iletiye tıklamış olduğu.

- **SM37.** Kişi sayısı, oranlar ve dakikalar kurgusal bölgesel ölçüm ağının saha ve abone
  hizmetleri ekiplerine aittir. Gerçek bir tatbikat koşulmuyor; ölçülen şey `node` ile kurulan
  modeldir.
- **SM38.** Erime üstel kabul edildi: kazancın sabit bir oranı her hafta korunur. Gerçekte erime
  düzgün değildir ve dönemsel olaylarla sıçrar; üstel biçim dönüş haftasını yaklaşık verir.
- **SM39.** Eğitim etkisi herkeste aynı sayıldı. Gerçekte etki kişiye ve göreve göre değişir;
  ortalamayla çalışmak dağılımın kuyruğunu — hiç bildirmeyen kesimi — gizler.
- **SM40.** İlk bildirime kadar işlenen alıcı sayısı beklenen değerdir ve bildirim oranının tersidir.
  Bildirimin savunmaya ulaşma ve işleme süresi modellenmedi; gerçekte bu süre sayıyı büyütür.
- **SM41.** Bildirim gelir gelmez kampanyanın kalan alıcılar için durdurulabildiği varsayıldı. Bu,
  bildirimi işleyen tarafın hazır olmasına bağlıdır ve her kurumda geçerli değildir.
- **SM42.** Ölçüm koşumlarının kendisi de davranışı etkiler. Bu geri besleme modellenmedi; ölçüm
  sıklığı sabit tutuldu.

#### İki Ölçütün Haftalık Seyri

```js
// program.mjs — farkindalik programinin iki olcutu, erime modeli ve zincir baglantisi; model
export const TEMEL = { bildirim: 8, tiklama: 31 };      // egitim oncesi yuzde, kurgu
export const ETKI = { bildirim: 34, tiklama: -22 };     // egitim haftasindaki puan degisimi
export const ERIME = { bildirim: 0.75, tiklama: 0.80 }; // kazancin haftalik kalan orani
export const KISI = 250, EGITIM_DK = 25, OLCUM_DK = 90; // kurgu: kisi sayisi ve dakika
// olcut degeri: temel + kazancin o haftaki kalani
export const deger = (o, gecenHafta) => TEMEL[o] + ETKI[o] * ERIME[o] ** gecenHafta;
export const kazanc = (o, gecenHafta) => Math.abs(ETKI[o]) * ERIME[o] ** gecenHafta;
// ilk bildirim gelene kadar islenen alici sayisi ve o sirada tiklamis olan kisi sayisi
export const ilkBildirim = (b) => 1 / (b / 100);
export const oncekiTiklama = (b, t) => ilkBildirim(b) * (t / 100);
// ders 02'deki ileti zinciri: adim bitince dusen kalem
export const ZINCIR_DUSEN = [0, 1, 1, 3, 6];
export const KUMUL = (() => { let s = 0; return ZINCIR_DUSEN.map((d) => (s += d)); })();
export function hafta(n, aralik) { // son egitimden bu yana gecen hafta
  return aralik ? n % aralik : n;
}
```

```js
// kosum1.mjs — tek egitimden sonra iki olcutun haftalik seyri ve eski degerine donus haftasi
import { TEMEL, ETKI, ERIME, KISI, deger, kazanc, ilkBildirim, oncekiTiklama } from './program.mjs';

console.log(`temel bildirim %${TEMEL.bildirim}, temel tiklama %${TEMEL.tiklama}; ` +
  `egitim etkisi ${ETKI.bildirim >= 0 ? '+' : ''}${ETKI.bildirim} ve ${ETKI.tiklama} puan`);
console.log(`kazancin haftalik kalan orani: bildirim ${ERIME.bildirim}, tiklama ${ERIME.tiklama}; kampanya alicisi ${KISI}\n`);
console.log(`${'hafta'.padStart(5)} ${'bildirim %'.padStart(10)} ${'kazanc'.padStart(6)} ${'tiklama %'.padStart(9)} ` +
  `${'kazanc'.padStart(6)} ${'ilk bildirime kadar alici'.padStart(24)} ${'o ana kadar tiklayan'.padStart(20)}`);
for (let n = 0; n <= 16; n += 2) {
  const b = deger('bildirim', n), t = deger('tiklama', n);
  console.log(`${String(n).padStart(5)} ${b.toFixed(1).padStart(10)} ${kazanc('bildirim', n).toFixed(1).padStart(6)} ` +
    `${t.toFixed(1).padStart(9)} ${kazanc('tiklama', n).toFixed(1).padStart(6)} ` +
    `${ilkBildirim(b).toFixed(1).padStart(24)} ${oncekiTiklama(b, t).toFixed(2).padStart(20)}`);
}
for (const o of ['bildirim', 'tiklama']) {
  let n = 0; while (kazanc(o, n) >= 1) n++;
  console.log(`\n${o}: kazanc ${n}. haftada 1 puanin altina iniyor (o hafta deger %${deger(o, n).toFixed(1)}, temel %${TEMEL[o]})`);
}
const b0 = deger('bildirim', 0), t0 = deger('tiklama', 0);
console.log(`\nhafta 0: ilk bildirime kadar ${ilkBildirim(b0).toFixed(1)} alici, ${oncekiTiklama(b0, t0).toFixed(2)} tiklama`);
console.log(`temel duzey: ilk bildirime kadar ${ilkBildirim(TEMEL.bildirim).toFixed(1)} alici, ` +
  `${oncekiTiklama(TEMEL.bildirim, TEMEL.tiklama).toFixed(2)} tiklama; oran ` +
  `${(oncekiTiklama(TEMEL.bildirim, TEMEL.tiklama) / oncekiTiklama(b0, t0)).toFixed(1)} kat`);
```

```
temel bildirim %8, temel tiklama %31; egitim etkisi +34 ve -22 puan
kazancin haftalik kalan orani: bildirim 0.75, tiklama 0.8; kampanya alicisi 250

hafta bildirim % kazanc tiklama % kazanc ilk bildirime kadar alici o ana kadar tiklayan
    0       42.0   34.0       9.0   22.0                      2.4                 0.21
    2       27.1   19.1      16.9   14.1                      3.7                 0.62
    4       18.8   10.8      22.0    9.0                      5.3                 1.17
    6       14.1    6.1      25.2    5.8                      7.1                 1.80
    8       11.4    3.4      27.3    3.7                      8.8                 2.39
   10        9.9    1.9      28.6    2.4                     10.1                 2.89
   12        9.1    1.1      29.5    1.5                     11.0                 3.25
   14        8.6    0.6      30.0    1.0                     11.6                 3.49
   16        8.3    0.3      30.4    0.6                     12.0                 3.64

bildirim: kazanc 13. haftada 1 puanin altina iniyor (o hafta deger %8.8, temel %8)

tiklama: kazanc 14. haftada 1 puanin altina iniyor (o hafta deger %30.0, temel %31)

hafta 0: ilk bildirime kadar 2.4 alici, 0.21 tiklama
temel duzey: ilk bildirime kadar 12.5 alici, 3.88 tiklama; oran 18.1 kat
```

Haftalık tablo iki ölçütün aynı yönde ama farklı hızda eridiğini gösteriyor. Bildirim oranı sıfırıncı
haftada yüzde kırk ikidir; on ikinci haftada yüzde dokuza iner ve on üçüncü haftada kazanç bir
puanın altına düşer. Tıklama oranı yüzde dokuzdan başlar ve on dördüncü haftada eski değerine döner.
İki ölçüt arasındaki bir haftalık fark erime katsayılarındandır; ölçünün taşıdığı sonuç ise ortaktır:
**tek bir eğitimin etkisi bir çeyrek dönemden kısa sürer.**

Erimenin hızı da düzgün dağılmıyor. Bildirim kazancı ilk iki haftada 34 puandan 19,1 puana iniyor —
kazancın yüzde kırk dördü iki hafta içinde gidiyor — ve kalan on bir haftada geri kalanı eriyor.
Programın etkisini ölçen bir çalışma eğitim haftasında ölçüm yaparsa, gerçekte iki hafta sonra
kalmayacak bir değeri raporlamış olur. Ölçümün ne zaman yapıldığı, ölçülen değerin kendisi kadar
belirleyicidir.

Son iki sütun oranları bir işletme sayısına çeviriyor. Bildirim oranı yüzde kırk ikiyken ilk bildirim
ortalama 2,4 alıcıdan sonra gelir ve o ana kadar tıklamış kişi sayısı 0,21'dir. Program hiç yokken
ilk bildirim 12,5 alıcı sonra gelir ve o ana kadar 3,88 kişi tıklamıştır. Aradaki oran **18,1
kattır**, oysa iki oranın kendi değişimi üç ile beş kat arasındadır. İki ölçüt aynı yönde
çalıştığında etkileri çarpılır: hem daha az kişi tıklar hem de tıklayanların sayısı daha erken
durdurulur.

Bu, iki ölçütten hangisinin daha önemli olduğu sorusunu da yanıtlıyor. Tıklama oranı zararın **hızını**
belirler, bildirim oranı ise zararın **süresini**. Yalnız tıklama oranını izleyen bir program,
kampanyanın ne zaman durduğunu hiç ölçmemiş olur.

#### Pekiştirmenin Getirisi

```js
// kosum2.mjs — pekistirme araligi karsilastirmasi, program bedeli ve zincirdeki karsiligi
import { TEMEL, KISI, EGITIM_DK, OLCUM_DK, KUMUL, deger, ilkBildirim, oncekiTiklama, hafta } from './program.mjs';

const DONEM = 26;
const ort = (v) => v.reduce((a, b) => a + b, 0) / v.length;
console.log(`${DONEM} haftalik donem, ${KISI} kisi\n`);
console.log(`${'pekistirme'.padEnd(18)} ${'egitim'.padStart(6)} ${'ort. bildirim %'.padStart(15)} ${'ort. tiklama %'.padStart(14)} ` +
  `${'ort. ilk bildirime kadar tiklama'.padStart(31)}`);
const sonuc = [];
for (const aralik of [0, 13, 6, 3]) {
  const b = [], t = [], x = [];
  for (let n = 0; n < DONEM; n++) {
    const h = hafta(n, aralik), bb = deger('bildirim', h), tt = deger('tiklama', h);
    b.push(bb); t.push(tt); x.push(oncekiTiklama(bb, tt));
  }
  const egitim = aralik ? Math.ceil(DONEM / aralik) : 1;
  sonuc.push({ aralik, egitim, b: ort(b), t: ort(t), x: ort(x) });
  console.log(`${(aralik ? `${aralik} haftada bir` : 'tek egitim').padEnd(18)} ${String(egitim).padStart(6)} ` +
    `${ort(b).toFixed(1).padStart(15)} ${ort(t).toFixed(1).padStart(14)} ${ort(x).toFixed(2).padStart(31)}`);
}
console.log(`${'program yok'.padEnd(18)} ${'0'.padStart(6)} ${TEMEL.bildirim.toFixed(1).padStart(15)} ` +
  `${TEMEL.tiklama.toFixed(1).padStart(14)} ${oncekiTiklama(TEMEL.bildirim, TEMEL.tiklama).toFixed(2).padStart(31)}`);

console.log(`\n${'pekistirme'.padEnd(18)} ${'egitim dk'.padStart(9)} ${'olcum dk'.padStart(8)} ${'toplam saat'.padStart(11)} ` +
  `${'temele gore tiklama dususu'.padStart(26)} ${'saat basina'.padStart(11)}`);
const taban = oncekiTiklama(TEMEL.bildirim, TEMEL.tiklama);
for (const s of sonuc) {
  const dk = s.egitim * KISI * EGITIM_DK, olcum = DONEM * OLCUM_DK, saat = (dk + olcum) / 60;
  console.log(`${(s.aralik ? `${s.aralik} haftada bir` : 'tek egitim').padEnd(18)} ${String(dk).padStart(9)} ` +
    `${String(olcum).padStart(8)} ${saat.toFixed(1).padStart(11)} ${(taban - s.x).toFixed(2).padStart(26)} ` +
    `${((taban - s.x) / saat).toFixed(4).padStart(11)}`);
}
console.log(`\nileti zincirinde (5 adim, hic kirilmazsa ${KUMUL[4]} kalem):`);
console.log(`  bildirim davranisi 3. halkayi kirar -> o ana kadar dusen kalem ${KUMUL[1]}`);
console.log(`  bildirim gelmezse siradaki denetim 4. halkadir -> dusen kalem ${KUMUL[2]}`);
console.log(`  en gec kirilabilen halka 5 -> dusen kalem ${KUMUL[3]}; erken kirma kazanci ${KUMUL[3] - KUMUL[1]} kalem`);
```

```
26 haftalik donem, 250 kisi

pekistirme         egitim ort. bildirim % ort. tiklama % ort. ilk bildirime kadar tiklama
tek egitim              1            13.2           26.8                            2.74
13 haftada bir          2            18.2           23.0                            1.77
6 haftada bir           5            27.5           17.0                            0.76
3 haftada bir           9            34.5           13.0                            0.40
program yok             0             8.0           31.0                            3.88

pekistirme         egitim dk olcum dk toplam saat temele gore tiklama dususu saat basina
tek egitim              6250     2340       143.2                       1.14      0.0079
13 haftada bir         12500     2340       247.3                       2.11      0.0085
6 haftada bir          31250     2340       559.8                       3.12      0.0056
3 haftada bir          56250     2340       976.5                       3.47      0.0036

ileti zincirinde (5 adim, hic kirilmazsa 11 kalem):
  bildirim davranisi 3. halkayi kirar -> o ana kadar dusen kalem 1
  bildirim gelmezse siradaki denetim 4. halkadir -> dusen kalem 2
  en gec kirilabilen halka 5 -> dusen kalem 5; erken kirma kazanci 4 kalem
```

Üst tablo mutlak sonucu veriyor ve beklenen yönde: pekiştirme sıklaştıkça ortalama bildirim oranı
yüzde 13,2'den 34,5'e çıkıyor, ortalama tıklama yüzde 26,8'den 13,0'e iniyor. Program hiç olmadığında
ilk bildirime kadar tıklayan kişi sayısı 3,88; üç haftada bir pekiştirmede 0,40. Yalnız bu tabloya
bakan bir karar, aralığı olabildiğince kısaltmak olur.

Alt tablo o kararı bozuyor. Harcanan saat başına düşen kazanç on üç haftada bir pekiştirmede en
yüksektir (0,0085) ve aralık kısaldıkça düşer: altı haftada bir 0,0056, üç haftada bir 0,0036. Üç
haftada bir pekiştirme, on üç haftada bir pekiştirmenin dört katı saat harcayıp kazancı yalnız 2,11'den
3,47'ye çıkarır. Eğrinin biçimi bunu açıklıyor — kazanç eğitim haftasında en büyüktür ve her
pekiştirme, kazancın **hâlâ erimemiş** olduğu bir noktaya bindirilir.

Bedelin dağılımı da okunmaya değer. Ölçüm dakikası dört satırda da aynıdır — yirmi altı hafta
boyunca 2.340 dakika — ve satırlar arasındaki bütün fark eğitim dakikasından gelir. Tek eğitimde
toplam 143,2 saatin 104,2 saati eğitimdir; üç haftada bir pekiştirmede toplam 976,5 saatin 937,5
saati. Ölçümün payı yüzde yirmi yediden yüzde dörde iner. Bu, ölçüm koşumlarının ucuz, eğitim
oturumlarının pahalı olduğu anlamına gelir; iki ölçüt sık ölçülebilir ama sık pekiştirilemez.

Zincir satırları programın karşılığını kalem cinsinden yazıyor. Bildirim davranışı beş adımlık ileti
zincirinin üçüncü halkasını kırar ve o noktada düşen kalem birdir. Bildirim gelmezse sıradaki denetim
dördüncü halkadır ve orada düşen kalem ikidir. En geç kırılabilen halka beşinci adımdır: beş kalem.
Erken kırma kazancı dört kalemdir ve bu, insan katmanının bu konuda ölçülen toplam katkısıdır.

#### Ölçütün Görmediği

Her iki ölçüt de bir ortalamadır ve ortalamanın gizlediği şey dağılımın kuyruğudur. Bildirim oranı
yüzde kırk ikiye çıktığında geriye yüzde elli sekiz kalır ve bu kesimin **kimlerden** oluştuğu
tabloda yoktur. Zincirin dördüncü halkasına — kimlik bilgisi girişine — ulaşmak için tek bir kişi
yeter; ölçüt yükselirken o kişinin davranışının değişip değişmediği ölçülmemiş olabilir.

İkinci sınır, ölçümün kendisinin bir eğitim olmasıdır. Haftalık koşan bir ölçüm programı, ölçtüğü
davranışı aynı zamanda besler; modeldeki erime bu geri beslemeyi içermez, dolayısıyla gerçek erime
modeldekinden yavaş olabilir. Dönüş haftasının on üç çıkması bir üst sınır değil, sabit bir
katsayının sonucudur.

Üçüncüsü kalıcılığın ölçüldüğü yerle ilgilidir. İlk dersteki geri arama yordamı, kişiden bağımsız
olarak dört sahte talebi durduruyordu ve bedeli 1.440 saniyelik ek doğrulamaydı; farkındalık
programı ise kişiye bağlıdır ve bedeli her dönem yeniden ödenir. İkisi aynı halkayı kırmaz: yordam
zincirin son adımında, bildirim davranışı üçüncü adımında çalışır. Bir kurum ikisinden birini
seçmez, ikisinin de kırdığı halkayı ayrı ayrı sayar — bu konunun yedi dersi boyunca ölçülen şey,
hangisinin daha iyi olduğu değil, her birinin **hangi halkada** ve **kaç kalemle** kırdığıdır.

#### Özet

- Tek bir eğitim bildirim oranını %8'den %42'ye çıkarıyor, tıklama oranını %31'den %9'a indiriyor.
  Bildirim kazancı 13. haftada, tıklama kazancı 14. haftada 1 puanın altına iniyor.
- İlk bildirime kadar tıklayan kişi sayısı eğitim haftasında 0,21, program hiç yokken 3,88'dir —
  18,1 kat fark. İki oranın kendi değişimi 3 ile 5 kat arasındayken etkileri çarpılıyor.
- Tıklama oranı zararın hızını, bildirim oranı süresini belirler. Yalnız tıklama oranını izleyen bir
  program kampanyanın ne zaman durduğunu ölçmemiş olur.
- 26 haftalık dönemde pekiştirme aralığı 13'ten 3 haftaya inince ortalama bildirim %18,2'den %34,5'e
  çıkıyor, ilk bildirime kadar tıklama 1,77'den 0,40'a iniyor.
- Saat başına kazanç 13 haftada bir pekiştirmede en yüksektir (0,0085) ve aralık kısaldıkça düşer.
  3 haftada bir pekiştirme 4 kat saat harcayıp kazancı 2,11'den 3,47'ye çıkarır.
- Bildirim davranışı ileti zincirinin 3. halkasını kırar (1 kalem); en geç kırılabilen halka 5'tir
  (5 kalem). Erken kırma kazancı 4 kalemdir.

#### Sonraki Adım

Bu konu insan katmanını yedi derste ölçtü ve her derste aynı üç sütunu doldurdu. Karar anında yedi
doğrulama kaleminden baskı altında biri kalıyordu; bir ileti kümesinde yönetici hedefli saldırılar
meşru iletilerden daha az gösterge taşıyordu; sesli aramada güçlü doğrulama kalemi sıfırdı; bir
binada sekiz yolun ikisinde hiçbir halka kırılmıyordu; taklit adayları on bir günlük bir pencere
kazandırıyordu; tek bir dış kaynak kullanıcıların tamamına ulaşıyordu; ve bir farkındalık programı
zincirin üçüncü halkasında dört kalemlik bir kazanç veriyordu.

Bütün bu ölçümlerin ortak bir sınırı var: hepsi **içeri girilmeden önceki** halkaları sayıyor.
Bir kez içeri girildikten sonra zincirin nasıl sürdüğü — yazılımın kendisinin açtığı halkalar —
hiç sayılmadı. Girdi doğrulamasının yapılmadığı bir alan, kullanıcının tarayıcısında çalışan bir
kalem, sınır denetimi olmayan bir kopyalama ya da eşiği bulunmayan bir kimlik denemesi kendi
zincirlerini kurar ve bu zincirlerin halkaları insan kararına hiç uğramaz. Sonraki konu **Teknik
Saldırı Sınıfları**, o halkaları sayar: her sınıf kaç adımdır, hangi savunma katmanı hangi adımı
kırar ve kaç adım hiçbir denetimin görmediği adımdır.

## Teknik Saldırı Sınıfları

Uygulama ve sistem katmanındaki saldırı sınıflarının adım–denetim eşlemesi olarak ölçülmesi: yaygın risk listelerinin okuma biçimi ve sıralamanın kuruma göre değişmesi, enjeksiyon, siteler arası betik çalıştırma, istek sahteciliği ve dizin geçişi sınıflarında hangi savunma katmanının hangi adımı kırdığı, arabellek taşmasının sınırlı dizi modelinde komşu kalemi bozması, kaba kuvvet, sözlük ve püskürtme biçimlerinin kilitleme ve hız sınırı karşısındaki maliyet farkı, tarayıcı üzerinden bulaşmanın önkoşul zinciri ve tersine mühendisliğin savunmadaki yeri.

### Web Uygulaması Riskleri

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/web-uygulamasi-riskleri

Yaygın risk listelerinin sıralama değil okuma biçimi olduğunun ölçülmesi: on kurgu kalemde genel sıralama ile kurum sıralaması arasında altı kalemin yer değiştirmesi, en büyük kaymanın dört sıra olması, dokuz zincirdeki otuz dokuz adımın yirmi ikisinin denetimsiz kalması, bir zincirin çalışma zamanında hiç kırılamaması ve savunmanın kırma sırasının kurum sırasıyla üç kalemde yalnız birinde örtüşmesi.

Önceki konu insan katmanını ölçtü: bahaneden iletiye, iletiden alan adına kadar zincirin ilk
halkaları bir kişinin verdiği karara dayanıyordu ve o karar kaç halkayı kırdığı sayılarak
ölçüldü. Bir kez içeri girildikten sonra ise zincir başka bir yerden devam eder — yazılımın
kendisinin açtığı halkalardan. Bu konu o halkaları sayar.

Sayıma başlamadan önce bir okuma sorunu var. Uygulama katmanındaki riskler için hazırlanmış
yaygın listeler vardır ve bu listeler çoğu kurumda bir yapılacaklar sırası gibi okunur. Bu
ders o okuma biçimini ölçer: liste neye göre sıralanıyor, sıralama bir kurumda neden
değişiyor ve listenin hiçbir kaleminin taşımadığı üçüncü bir sıra neden gerekiyor. Bu
dersteki ve bu konudaki hiçbir teknik, **yazılı yetki ve tanımlı kapsam** dışında bir sistem
üzerinde denenemez; denenmesi hem yasadışı hem meslek dışıdır.

#### Listenin Yapısı

Yaygın risk listeleri kalemlerini dört ölçütle sıralar: kalemin sahada **ne sıklıkta**
görüldüğü, bir saldırganın onu **ne kadar kolay** kullanabildiği, savunanın onu **ne kadar
kolay bulduğu** ve başarılı olduğunda ortaya çıkan **teknik etki**. Dördü de kaleme aittir;
hiçbiri kuruma ait değildir.

Dört ölçütten biri ters yönde çalışır. Savunanın kalemi kolay bulması riski **düşürür**,
çünkü kolay bulunan kalem düzeltilme şansı yüksek olan kalemdir. Bu, listenin sırasına
doğrudan giren ve en çok yanlış okunan ölçüttür: bir kalemin listede aşağıda olması onun
seyrek görüldüğü anlamına gelmez, çoğu kurumda **zaten bulunmuş** olduğu anlamına gelir.
Kendi envanterini çıkarmamış bir kurum için bu bilgi hiçbir şey ifade etmez.

Beşinci bir ölçüt kasten dışarıda bırakılır: **iş etkisi**. Bir kalemin bir kurumda ne
kaybettirdiği, o kurumun neyi sakladığına, hangi işi durdurulamaz saydığına ve mimarisinde o
kalemin karşılığının bulunup bulunmadığına bağlıdır. Liste bunu bilemez, bu yüzden hesaba
katmaz. Listenin sırası bu nedenle bir öneri değil, **bir başlangıç noktasıdır**.

**TS1:** aşağıdaki kalem kümesi bir **modeldir** — gerçek bir risk listesi, gerçek bir kurum
ve gerçek bir ölçüm değildir; ölçüt değerleri kurgudur. **TS2:** her kalem bir adım dizisidir;
`denetimli`, üzerinde bir denetim noktası bulunan adımların indeksidir. **TS3:** genel sıralama
dört ölçütün ortalamasıdır. **TS4:** kurum sıralaması aynı ölçütleri kullanır, teknik etkiyi
kendi ağırlıklarıyla toplar ve mimarisinde karşılığı olmayan kalemi maruziyetle ölçekler.
**TS5:** kırılabilen halka, üzerinde denetim noktası bulunan en küçük indeksli adımdır.

```js
// risk/kalem.mjs — kurgu risk kalemi kumesi (model): gercek bir risk listesi, gercek bir
// kurum ya da gercek bir olcum yok. Dort olcut 0..10 arasinda kurgu degerlerdir.
// yay: yayginlik, ist: istismar edilebilirlik, tes: savunanin tespit kolayligi,
// etk: teknik etki bileseni {g: gizlilik, b: butunluk, e: erisilebilirlik}
export const KALEM = [
  { ad: "erisim-denetimi",  yay: 9, ist: 7, tes: 4, etk: { g: 9, b: 8, e: 3 }, maruz: 1.0 },
  { ad: "enjeksiyon",       yay: 6, ist: 8, tes: 6, etk: { g: 9, b: 9, e: 5 }, maruz: 0.8 },
  { ad: "kimlik-yonetimi",  yay: 7, ist: 6, tes: 5, etk: { g: 8, b: 6, e: 4 }, maruz: 1.0 },
  { ad: "yapilandirma",     yay: 8, ist: 5, tes: 8, etk: { g: 6, b: 5, e: 6 }, maruz: 1.0 },
  { ad: "bakimsiz-bilesen", yay: 8, ist: 4, tes: 9, etk: { g: 7, b: 7, e: 6 }, maruz: 1.0 },
  { ad: "sifreleme-karari", yay: 5, ist: 3, tes: 3, etk: { g: 9, b: 4, e: 1 }, maruz: 0.3 },
  { ad: "kayit-eksikligi",  yay: 7, ist: 2, tes: 2, etk: { g: 3, b: 3, e: 2 }, maruz: 1.0 },
  { ad: "sunucu-istegi",    yay: 3, ist: 5, tes: 5, etk: { g: 7, b: 4, e: 3 }, maruz: 0.2 },
  { ad: "tasarim-kusuru",   yay: 5, ist: 6, tes: 2, etk: { g: 6, b: 8, e: 5 }, maruz: 0.9 },
  { ad: "butunluk-dogrulama", yay: 4, ist: 4, tes: 4, etk: { g: 4, b: 9, e: 4 }, maruz: 1.0 },
];

// TS2: her kalem bir adim dizisidir. adim = zincirin adim sayisi;
// denetimli = uzerinde bir denetim noktasi bulunan adim indeksleri (1 tabanli);
// bedel = zincir son adimda kirilirsa etkilenen kurgu kalem sayisi.
export const ZINCIR = {
  "erisim-denetimi":   { adim: 4, denetimli: [2, 4],       bedel: 240 },
  "enjeksiyon":        { adim: 6, denetimli: [2, 3, 5],    bedel: 480 },
  "kimlik-yonetimi":   { adim: 5, denetimli: [1, 3, 4],    bedel: 180 },
  "yapilandirma":      { adim: 3, denetimli: [1, 2, 3],    bedel: 120 },
  "bakimsiz-bilesen":  { adim: 5, denetimli: [1, 2],       bedel: 300 },
  "sifreleme-karari":  { adim: 4, denetimli: [4],          bedel: 360 },
  "kayit-eksikligi":   { adim: 0, denetimli: [],           bedel: 0 },
  "sunucu-istegi":     { adim: 5, denetimli: [3, 4],       bedel: 90 },
  "tasarim-kusuru":    { adim: 4, denetimli: [],           bedel: 200 },
  "butunluk-dogrulama": { adim: 3, denetimli: [2],         bedel: 150 },
};

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(""));
```

```js
// risk/sirala.mjs — ayni kalem kumesi uc ayri sirada: genel liste, kurum siralamasi,
// savunmanin kirma sirasi. Rastgelelik yok; her sayi kurgu olcut degerlerinden turetilir.
import { KALEM, ZINCIR, yaz } from "./kalem.mjs";

const genel = (k) => (k.yay + k.ist + (10 - k.tes) + (k.etk.g + k.etk.b + k.etk.e) / 3) / 4;

// Kurgu olcum agi icin butunluk ve erisilebilirlik agir, gizlilik daha hafiftir.
const W = { g: 0.1, b: 0.5, e: 0.4 };
const kurum = (k) => k.maruz * (k.yay + k.ist +
  (10 - k.tes) + (k.etk.g * W.g + k.etk.b * W.b + k.etk.e * W.e)) / 4;

const sirala = (f) => [...KALEM].sort((a, b) => f(b) - f(a)).map((k) => k.ad);
const G = sirala(genel), K = sirala(kurum);
const A = [-20, 8, 6, 8, 6, 8];

console.log(`${KALEM.length} kurgu risk kalemi, ayni dort olcut, iki agirlik kumesi\n`);
yaz(A, "kalem", "genel", "sira", "kurum", "sira", "kayma");
for (const ad of G) {
  const k = KALEM.find((x) => x.ad === ad);
  const g = G.indexOf(ad) + 1, u = K.indexOf(ad) + 1;
  yaz(A, ad, genel(k).toFixed(2), g, kurum(k).toFixed(2), u,
    u === g ? "-" : (u < g ? "+" : "") + (g - u));
}
console.log(`\nsira degistiren kalem: ${G.filter((ad, i) => K.indexOf(ad) !== i).length}` +
  `/${KALEM.length}; en buyuk kayma: ` +
  `${Math.max(...G.map((ad, i) => Math.abs(K.indexOf(ad) - i)))} sira; ilk ucluden ortak: ` +
  `${G.slice(0, 3).filter((ad) => K.slice(0, 3).includes(ad)).length}/3`);

const B = [-20, 7, 11, 14, 11];
console.log(`\nzincir sutunlari (kurum sirasina gore)`);
yaz(B, "kalem", "adim", "denetimli", "ilk kirilan", "gec bedel");
const zincirli = K.filter((ad) => ZINCIR[ad].adim > 0);
for (const ad of K) {
  const z = ZINCIR[ad];
  if (z.adim === 0) { yaz(B, ad, "-", "-", "zincir degil", "-"); continue; }
  yaz(B, ad, z.adim, z.denetimli.length,
    z.denetimli.length ? `${z.denetimli[0]}. adim` : "kirilamiyor", z.bedel);
}
const topla = (f) => zincirli.reduce((s, ad) => s + f(ZINCIR[ad]), 0);
console.log(`\n${zincirli.length} zincirde toplam ${topla((z) => z.adim)} adim, ` +
  `${topla((z) => z.denetimli.length)} adimda denetim var, ` +
  `${topla((z) => z.adim - z.denetimli.length)} adim denetimsiz`);
const ilk = (ad) => ZINCIR[ad].denetimli[0] ?? 0;
console.log(`ilk adimda kirilan: ${zincirli.filter((a) => ilk(a) === 1).length}; ` +
  `ucuncu adim ve sonrasi: ${zincirli.filter((a) => ilk(a) >= 3).length}; ` +
  `hic kirilamayan: ${zincirli.filter((a) => ilk(a) === 0).length}`);

// Savunmanin sirasi: once erken kirilabilen, esitlikte bedeli buyuk olan.
const kirma = zincirli.filter((a) => ilk(a) > 0)
  .sort((a, b) => ilk(a) - ilk(b) || ZINCIR[b].bedel - ZINCIR[a].bedel);
console.log(`\nkurum sirasinin ilk ucu : ${K.slice(0, 3).join(", ")}`);
console.log(`kirma sirasinin ilk ucu : ${kirma.slice(0, 3).join(", ")}`);
console.log(`ortak kalem: ${K.slice(0, 3).filter((a) => kirma.slice(0, 3).includes(a)).length}/3`);
```

```
10 kurgu risk kalemi, ayni dort olcut, iki agirlik kumesi

kalem                  genel  sira   kurum  sira   kayma
erisim-denetimi         7.17     1    7.03     1       -
enjeksiyon              6.42     2    5.08     6      -4
tasarim-kusuru          6.33     3    5.76     3       -
kimlik-yonetimi         6.00     4    5.85     2      +2
yapilandirma            5.17     5    5.13     4      +1
bakimsiz-bilesen        4.92     6    4.90     7      -1
sifreleme-karari        4.92     7    1.37     9      -2
kayit-eksikligi         4.92     8    4.90     8       -
butunluk-dogrulama      4.92     9    5.13     5      +4
sunucu-istegi           4.42    10    0.84    10       -

sira degistiren kalem: 6/10; en buyuk kayma: 4 sira; ilk ucluden ortak: 2/3

zincir sutunlari (kurum sirasina gore)
kalem                  adim  denetimli   ilk kirilan  gec bedel
erisim-denetimi           4          2       2. adim        240
kimlik-yonetimi           5          3       1. adim        180
tasarim-kusuru            4          0   kirilamiyor        200
yapilandirma              3          3       1. adim        120
butunluk-dogrulama        3          1       2. adim        150
enjeksiyon                6          3       2. adim        480
bakimsiz-bilesen          5          2       1. adim        300
kayit-eksikligi           -          -  zincir degil          -
sifreleme-karari          4          1       4. adim        360
sunucu-istegi             5          2       3. adim         90

9 zincirde toplam 39 adim, 17 adimda denetim var, 22 adim denetimsiz
ilk adimda kirilan: 3; ucuncu adim ve sonrasi: 2; hic kirilamayan: 1

kurum sirasinin ilk ucu : erisim-denetimi, kimlik-yonetimi, tasarim-kusuru
kirma sirasinin ilk ucu : bakimsiz-bilesen, kimlik-yonetimi, yapilandirma
ortak kalem: 1/3
```

#### Sıralama Kuruma Göre Değişir

İlk tablo aynı on kalemi iki kez sıralar. Ölçüt değerleri iki sıralamada da aynıdır;
değişen yalnız teknik etkinin nasıl toplandığı ve kalemin bu mimaride karşılığının olup
olmadığıdır. Sonuç: **on kalemden altısı yer değiştirdi** ve en büyük kayma dört sıradır.

İki uç örnek farkın nereden geldiğini gösterir. `enjeksiyon` genel sırada ikinciyken kurum
sırasında altıncıya düşer; kurgu ölçüm ağının uçlarının bir bölümünde bu kalemin karşılığı
yoktur ve maruziyet 0,8 ile ölçeklenir. `butunluk-dogrulama` ise dokuzuncudan beşinciye
çıkar: sayaç okumasının doğru olduğunun kanıtlanması bu ağın **asıl işidir** ve bütünlük
ağırlığı 0,5'tir. Genel listede bu kalem orta sıralardadır çünkü ortalama bir kurumda
bütünlük, gizlilik kadar ağır basmaz.

Maruziyetin listede en açık görünen etkisi `sifreleme-karari` kalemindedir: 4,92'den 1,37'ye,
yedinciden dokuzuncuya.
Bunun nedeni ağırlık değil **maruziyettir**; bu kurgu ağda ilgili yüzey dar tanımlanmıştır ve
skor 0,3 ile ölçeklenir. Maruziyet ağırlıktan daha sert bir çarpandır: ağırlık kalemi birkaç
sıra oynatır, maruziyet listeden düşürür.

Kaymaların yönü de bilgi taşır. Yukarı çıkan üç kalemin ikisi — `kimlik-yonetimi` ve
`butunluk-dogrulama` — bu ağın kendi işine dokunan kalemlerdir; aşağı inen üç kalemin
ikisinde neden maruziyet, birinde ağırlıktır. Bir kurum kendi sıralamasını çıkardığında
ürettiği asıl çıktı sıranın kendisi değil, **kaymanın nedenidir**: bir kalem mimaride yoksa
onu izlemeye ayrılan emek boşa gider, ağırlık yüzünden inmişse kalem hâlâ oradadır ve yalnız
sırası değişmiştir.

İlk üçlüde iki kalem ortaktır. Bu, listenin işe yaramadığı anlamına gelmez; listenin
**hangi kalemlerin var olduğunu** doğru söylediği, **hangisinin önce geleceğini** söylemediği
anlamına gelir. Liste bir envanterdir; sıra kurumun kendi ölçümüdür.

#### Zincir Sütunları

İkinci tablo her kalemi bu kursun üç sütunuyla anar. Dokuz zincirde toplam **39 adım**
vardır; bunların 17'sinde bir denetim noktası bulunur, **22 adım denetimsizdir**. Denetimsiz
adım sayısı yüzeyin değil, savunmanın ölçüsüdür: her denetimsiz adım, zincirin o noktadan
sorunsuz geçtiği bir yerdir.

Üç zincir ilk adımda kırılabiliyor. Bunlar en ucuz üç kalemdir: zincir başlamadan biter ve
geç kırma bedeli hiç ödenmez. Buna karşılık `sifreleme-karari` ancak **dördüncü adımda**
kırılabiliyor ve o noktaya kadar 360 kurgu kalem etkilenmiş oluyor. Aynı kalem kurum
sırasında dokuzuncudur — yani düşük öncelikli sayılan bir kalem, en pahalı ikinci geç kırma
bedelini taşıyor.

Tablonun iki satırı ölçünün sınırını gösterir. `tasarim-kusuru` dört adımlıktır ve
**hiçbir adımında denetim noktası yoktur**: bu zincir çalışma zamanında kırılamaz, çünkü
denetim noktası zincirin dışındadır — tasarım anındadır. Böyle bir kalemde ölçü kırmadan
**tespite** kayar: zincir tamamlanacaktır, sorulacak tek soru ne kadar geç görüleceğidir.

`kayit-eksikligi` satırı ise bir zincir bile değildir. Bu kalem bir saldırı adım dizisi
tanımlamaz; öteki zincirlerin **görülmemesini** tanımlar. Aynı listede iki farklı türden
kalem yan yana durur ve tek bir sıralama ikisini de aynı ölçekte gösterir. Listeyi bir
yapılacaklar sırası gibi okumanın en somut sorunu budur.

#### Savunmanın Üçüncü Sırası

Son üç satır dersin sonucudur. Kurum sıralaması riski büyükten küçüğe verir; savunmanın
sırası ise **en erken kırılabilen halkaya** göredir. İki sıranın ilk üçlüsünde yalnız bir
ortak kalem vardır.

`bakimsiz-bilesen` kurum sırasında yedincidir ama kırma sırasında birincidir: zinciri birinci
adımda kırılıyor ve geç kırma bedeli 300 ile üçüncü en yüksek değer. Yani düşük öncelikli
görünen bir kalem, en ucuz ve en getirili ilk hamledir. Tersine `erisim-denetimi` her iki
sıralamada da birincidir ama zinciri ancak ikinci adımda kırılabiliyor; ilk hamle olmaya
listedeki yeri değil, halkasının yeri karar verir.

Buradan çıkan kural bu konunun geri kalanını yönetir: bir risk kalemini önceliklendirmek üç
ayrı sorunun cevabını gerektirir — kalem bu mimaride var mı, etkisi bu kurumda ne kadar ağır
ve zinciri **kaçıncı adımda** kırılabiliyor. Liste yalnız birincinin envanterini verir.

Üçüncü sorunun cevabı listeden okunamaz, çünkü liste kalemleri tanımlarken adımlarını
yazmaz. Bu konunun geri kalan sekiz dersi tam da o eksik sütunu doldurur: her sınıfın adım
dizisi önkoşullarıyla yazılır, savunma katmanları o adımlarla eşlenir ve kırılabilen halka
bir indeks olarak çıkar.

#### Özet

- Yaygın risk listeleri kalemleri yaygınlık, istismar edilebilirliği, tespit kolaylığı ve
  teknik etki ile sıralar; iş etkisini kasten dışarıda bırakır. Liste bir sıra önerisi değil,
  bir envanterdir.
- Aynı on kalem kurum ağırlıkları ve maruziyetle yeniden sıralandığında 6 kalem yer değiştirdi,
  en büyük kayma 4 sıra oldu ve ilk üçlüden yalnız 2 kalem ortak kaldı.
- Maruziyet ağırlıktan sert bir çarpandır: bir kalem 4,92'den 1,37'ye düşerek listenin altına
  indi; ağırlık değişimi kalemleri en çok dört sıra oynattı.
- Dokuz zincirde 39 adımın 17'sinde denetim noktası var, 22 adım denetimsiz. Üç zincir birinci
  adımda kırılıyor; bir zincir çalışma zamanında hiç kırılamıyor ve orada ölçü tespite kayıyor.
- Kurum sırasının ilk üçlüsü ile kırma sırasının ilk üçlüsü yalnız 1 kalemde örtüşüyor;
  yedinci sıradaki bir kalem birinci adımda kırıldığı için ilk hamle oluyor.

#### Sonraki Adım

Bu ders kalemleri saydı ama hiçbirinin içini açmadı. On kalemin en yüksek geç kırma bedelini
taşıyan zinciri altı adımlıktı ve üç adımında denetim noktası vardı — hangi üçünde olduğu ve
o denetimlerin **hangi adımı** kestiği yazılmadı. Sonraki ders o zinciri açar: enjeksiyon
sınıfının altı adımı tek tek önkoşullarıyla yazılır, aynı girdi kümesi beş savunma katmanından
geçirilir ve her katmanın kırdığı adım sayılır. Ölçülecek şey girdinin kendisi değil, girdinin
hangi katmanda durduğu ve durmadığında zincirin kaçıncı adımına kadar ilerlediğidir.

### Enjeksiyon Saldırıları

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/enjeksiyon-saldirilari

Enjeksiyon sınıfının altı adımlık zincir olarak ölçülmesi: altı savunma katmanının hangi adımı kırdığı, on iki çağrı yerinin yetmiş iki adım bileşiminden kırk ikisinde denetim bulunmaması, kâğıt üzerindeki üç katmanlı kuruluşun yalnız bir çağrı yerinde tam olması, yüz doksan iki girdi-yer bileşiminden altısının altı adımı tamamlaması ve bu altısının iki çağrı yerinde toplanması.

Önceki ders on risk kalemini üç sütunla andı ve en yüksek geç kırma bedelini enjeksiyon
sınıfına verdi: altı adımlık bir zincir, üç adımında denetim noktası, kırılmadığında 480
kurgu kalem. Bu ders o satırın içini açar. Altı adımın her biri **önkoşuluyla** yazılır,
altı savunma katmanı adımlara eşlenir ve aynı girdi kümesi kurgu ölçüm ağının on iki çağrı
yerinden geçirilir.

Ölçümün tamamı biçimsel özellikler üzerinde yürür. Hiçbir girdi değeri yazılmaz, hiçbir
sorgu metni kurulmaz ve hiçbir düzeltme örneği verilmez. Girdiler yalnız dört ikili
özellikle tanımlanır: alan sözleşmesine uyuyor mu, o bağlamın **ayırıcı karakter sınıfını**
taşıyor mu, bağlam bir geri dönüş üretiyor mu, uzunluğu büyük mü. Ölçülen şey girdinin
kendisi değil, girdinin **hangi adımda durduğudur**.

#### Zincirin Altı Adımı

Enjeksiyon tek bir an değildir; altı adımın hepsinin sırayla tutmasını gerektirir.

1. **Giriş.** Değer bir uçtan sisteme girer. Önkoşul: uç dışarıdan erişilebilir ve alan bu
   değeri kabul ediyor.
2. **Birleştirme.** Değer, bir yorumlayıcıya verilecek metnin **içine** yazılır. Önkoşul:
   çağrı yeri değeri ayrı bir işlenen olarak geçirmiyor.
3. **Ayrıştırma.** Yorumlayıcı, değerin bir bölümünü veri değil **sözdizimi** olarak okur.
   Önkoşul: değer o bağlamın ayırıcı karakter sınıfını taşıyor ve o sınıf kaçırılmamış.
4. **Yetki.** Değişmiş ifade, çağıran kimliğin yetkisiyle çalışır. Önkoşul: o kimlik
   hedeflenen kalemlere erişebiliyor.
5. **Geri dönüş.** Sonuç çağırana ulaşır. Önkoşul: yanıt gövdesi ya da hata metni ayrıntı
   taşıyor ve bağlam bir geri dönüş üretiyor.
6. **Çıkış.** Elde edilen kalemler dışarıya taşınır. Önkoşul: çıkış hacmi ve hedefi üzerinde
   bir sınır yok.

Adımların hiçbirinin **nasıl** yapıldığı yazılmadı; her biri neye ihtiyaç duyduğuyla
yazıldı. Savunmanın işi de tam olarak budur: bir adımın önkoşulunu ortadan kaldırmak.

**TS6:** adım dizisi ve `bedel` alanı bir modeldir; `bedel`, zincir o adımı kırılmadan
geçerse etkilenen kurgu kalem sayısıdır. **TS7:** her katman tek bir adımı kırar; koşullu
katman yalnız belirli girdi sınıfında kırar. **TS8:** adım 3 ancak girdi ayırıcı sınıfı
taşıyorsa, adım 5 ancak bağlam bir geri dönüş üretiyorsa tutar. **TS9:** aynı girdi her çağrı
yerinden ayrı geçirilir; bir yerde kırılan zincir başka bir yerde kırılmış sayılmaz.

```js
// enj/zincir.mjs — enjeksiyon sinifinin adim dizisi ve savunma katmanlari (model).
// Gercek bir sistem, gercek bir uc ve gercek bir girdi degeri yok; girdiler yalnizca
// bicimsel ozellikleriyle tanimlanir.
export const ADIM = [
  { n: 1, ad: "giris",       bedel: 0 },
  { n: 2, ad: "birlestirme", bedel: 0 },
  { n: 3, ad: "ayristirma",  bedel: 40 },
  { n: 4, ad: "yetki",       bedel: 120 },
  { n: 5, ad: "geri-donus",  bedel: 300 },
  { n: 6, ad: "cikis",       bedel: 480 },
];

export const KATMAN = [
  { ad: "alan-sozlesmesi",  kirar: 1, kosul: (g) => !g.sozlesme, mesru: 3 },
  { ad: "ayri-islenen",     kirar: 2, kosul: () => true,         mesru: 0 },
  { ad: "baglam-kacirma",   kirar: 3, kosul: () => true,         mesru: 1 },
  { ad: "en-az-yetki",      kirar: 4, kosul: () => true,         mesru: 6 },
  { ad: "sade-yanit",       kirar: 5, kosul: () => true,         mesru: 4 },
  { ad: "cikis-siniri",     kirar: 6, kosul: () => true,         mesru: 9 },
];

export const ONKOSUL = { 3: (g) => g.ayirici, 5: (g) => g.okuma };

// 16 kurgu girdi: dort ikili ozelligin butun bilesimleri. Hicbirinin degeri yazilmaz.
export const GIRDI = [];
for (const sozlesme of [true, false])
  for (const ayirici of [true, false])
    for (const okuma of [true, false])
      for (const uzun of [true, false])
        GIRDI.push({ no: GIRDI.length + 1, sozlesme, ayirici, okuma, uzun });

export const sinif = (g) => !g.sozlesme ? "sozlesme-disi"
  : g.ayirici ? "ayirici-tasiyan" : g.uzun ? "uzun-ama-uyumlu" : "duz-uyumlu";

// Kurgu olcum aginin 12 cagri yeri ve her birinde gercekten dagitilmis katmanlar.
export const CAGRI = [
  ["abone-portali.arama",     ["alan-sozlesmesi", "ayri-islenen", "baglam-kacirma", "sade-yanit"]],
  ["abone-portali.fatura",    ["alan-sozlesmesi", "ayri-islenen", "sade-yanit"]],
  ["abone-portali.itiraz",    ["alan-sozlesmesi", "ayri-islenen", "baglam-kacirma"]],
  ["toplayici.okuma-yaz",     ["ayri-islenen", "en-az-yetki"]],
  ["toplayici.toplu-aktarim", ["ayri-islenen", "en-az-yetki", "cikis-siniri"]],
  ["dogrulayici.esik",        ["alan-sozlesmesi", "ayri-islenen"]],
  ["dogrulayici.arsiv-ara",   ["alan-sozlesmesi"]],
  ["fatura-uretimi.donem",    ["ayri-islenen", "sade-yanit", "cikis-siniri"]],
  ["fatura-uretimi.rapor",    ["baglam-kacirma", "sade-yanit"]],
  ["is-emri.olustur",         ["alan-sozlesmesi", "ayri-islenen", "en-az-yetki"]],
  ["is-emri.saha-notu",       []],
  ["sube-ucu.sorgu",          ["alan-sozlesmesi", "ayri-islenen", "baglam-kacirma", "en-az-yetki"]],
];

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(""));
```

```js
// enj/olcum.mjs — ayni 16 girdi butun cagri yerlerinden gecirilir: her adimda zincir
// bir denetimle mi kirildi, yoksa onkosul mu tutmadi. Rastgelelik yok.
import { ADIM, KATMAN, ONKOSUL, GIRDI, sinif, CAGRI, yaz } from "./zincir.mjs";

const bedel = (n) => ADIM[n - 2]?.bedel ?? 0;   // n. adimda kirilirsa birikmis kalem

function yurut(girdi, dagitilan) {
  for (const a of ADIM) {
    const k = KATMAN.find((x) => x.kirar === a.n && dagitilan.includes(x.ad) && x.kosul(girdi));
    if (k) return { durak: a.n, neden: "denetim", bedel: bedel(a.n) };
    if (ONKOSUL[a.n] && !ONKOSUL[a.n](girdi))
      return { durak: a.n, neden: "onkosul", bedel: bedel(a.n) };
  }
  return { durak: 7, neden: "tamamlandi", bedel: ADIM[5].bedel };
}

console.log(`${ADIM.length} adimlik zincir, ${KATMAN.length} katman, ` +
  `${CAGRI.length} cagri yeri, ${GIRDI.length} kurgu girdi\n`);

const A = [-17, 9, 22, 13, 12];
console.log("1. katman-adim eslemesi");
yaz(A, "katman", "kirdigi", "kosul", "mesru bedel", "cagri yeri");
for (const k of KATMAN)
  yaz(A, k.ad, `${k.kirar}. adim`,
    k.kosul({ sozlesme: true }) ? "kosulsuz" : "girdi sinifina bagli",
    k.mesru, CAGRI.filter(([, d]) => d.includes(k.ad)).length);

const B = [-26, 8, 14, 13, 13];
console.log("\n2. cagri yeri basina zincir");
yaz(B, "cagri yeri", "katman", "ilk kirilan", "denetimsiz", "tamamlayan");
let denetimsiz = 0;
for (const [ad, d] of CAGRI) {
  const kirilan = ADIM.filter((a) => KATMAN.some((x) => x.kirar === a.n && d.includes(x.ad)));
  const kosulsuz = kirilan.filter((a) => KATMAN.find((x) => x.kirar === a.n).kosul({ sozlesme: true }));
  const tamam = GIRDI.filter((g) => yurut(g, d).durak === 7).length;
  denetimsiz += ADIM.length - kirilan.length;
  yaz(B, ad, d.length, kosulsuz.length ? `${kosulsuz[0].n}. adim` : "yok",
    ADIM.length - kirilan.length, `${tamam}/${GIRDI.length}`);
}
console.log(`${CAGRI.length * ADIM.length} adim-yer bilesiminin ${denetimsiz} tanesinde denetim yok`);
const KAGIT = ["ayri-islenen", "baglam-kacirma", "sade-yanit"];
console.log(`kagit uzerindeki kurulus (${KAGIT.join(" + ")}) tam olan yer: ` +
  `${CAGRI.filter(([, d]) => KAGIT.every((k) => d.includes(k))).length}/${CAGRI.length}`);

const C = [-17, 7, 15, 15, 13, 12];
console.log("\n3. girdi sinifi basina duraklar (16 girdi x 12 yer)");
yaz(C, "girdi sinifi", "girdi", "denetim durdu", "onkosul durdu", "tamamlandi", "bedel");
for (const s of [...new Set(GIRDI.map(sinif))]) {
  const kume = GIRDI.filter((g) => sinif(g) === s);
  const r = kume.flatMap((g) => CAGRI.map(([, d]) => yurut(g, d)));
  yaz(C, s, kume.length, r.filter((x) => x.neden === "denetim").length,
    r.filter((x) => x.neden === "onkosul").length,
    r.filter((x) => x.neden === "tamamlandi").length, r.reduce((t, x) => t + x.bedel, 0));
}
const hepsi = GIRDI.flatMap((g) => CAGRI.map(([ad, d]) => ({ ad, ...yurut(g, d) })));
const tam = hepsi.filter((x) => x.neden === "tamamlandi");
console.log(`${hepsi.length} bilesimin ${tam.length} tanesi alti adimi tamamladi, ` +
  `hepsi su iki yerde: ${[...new Set(tam.map((x) => x.ad))].join(", ")}`);

const D = [-14, 17, 16, 13];
console.log("\n4. gec kirmanin bedeli");
yaz(D, "kirilan adim", "birikmis kalem", "kiran katman", "mesru bedel");
for (const a of ADIM) {
  const k = KATMAN.find((x) => x.kirar === a.n);
  yaz(D, `${a.n}. adim`, bedel(a.n), k.ad, k.mesru);
}
console.log(`hic kirilmazsa ${ADIM[5].bedel} kalem; alti katmanin toplam mesru bedeli ` +
  `${KATMAN.reduce((t, k) => t + k.mesru, 0)} kalem/gun, ilk iki adimi kiran ikisininki ` +
  `${KATMAN.slice(0, 2).reduce((t, k) => t + k.mesru, 0)}`);
```

```
6 adimlik zincir, 6 katman, 12 cagri yeri, 16 kurgu girdi

1. katman-adim eslemesi
katman             kirdigi                 kosul  mesru bedel  cagri yeri
alan-sozlesmesi    1. adim  girdi sinifina bagli            3           7
ayri-islenen       2. adim              kosulsuz            0           9
baglam-kacirma     3. adim              kosulsuz            1           4
en-az-yetki        4. adim              kosulsuz            6           4
sade-yanit         5. adim              kosulsuz            4           4
cikis-siniri       6. adim              kosulsuz            9           2

2. cagri yeri basina zincir
cagri yeri                  katman   ilk kirilan   denetimsiz   tamamlayan
abone-portali.arama              4       2. adim            2         0/16
abone-portali.fatura             3       2. adim            3         0/16
abone-portali.itiraz             3       2. adim            3         0/16
toplayici.okuma-yaz              2       2. adim            4         0/16
toplayici.toplu-aktarim          3       2. adim            3         0/16
dogrulayici.esik                 2       2. adim            4         0/16
dogrulayici.arsiv-ara            1           yok            5         2/16
fatura-uretimi.donem             3       2. adim            3         0/16
fatura-uretimi.rapor             2       3. adim            4         0/16
is-emri.olustur                  3       2. adim            3         0/16
is-emri.saha-notu                0           yok            6         4/16
sube-ucu.sorgu                   4       2. adim            2         0/16
72 adim-yer bilesiminin 42 tanesinde denetim yok
kagit uzerindeki kurulus (ayri-islenen + baglam-kacirma + sade-yanit) tam olan yer: 1/12

3. girdi sinifi basina duraklar (16 girdi x 12 yer)
girdi sinifi       girdi  denetim durdu  onkosul durdu   tamamlandi       bedel
ayirici-tasiyan        4             40              4            4        2400
uzun-ama-uyumlu        2             20              4            0           0
duz-uyumlu             2             20              4            0           0
sozlesme-disi          8             88              6            2        1200
192 bilesimin 6 tanesi alti adimi tamamladi, hepsi su iki yerde: dogrulayici.arsiv-ara, is-emri.saha-notu

4. gec kirmanin bedeli
kirilan adim     birikmis kalem    kiran katman  mesru bedel
1. adim                       0 alan-sozlesmesi            3
2. adim                       0    ayri-islenen            0
3. adim                       0  baglam-kacirma            1
4. adim                      40     en-az-yetki            6
5. adim                     120      sade-yanit            4
6. adim                     300    cikis-siniri            9
hic kirilmazsa 480 kalem; alti katmanin toplam mesru bedeli 23 kalem/gun, ilk iki adimi kiran ikisininki 3
```

#### Katmanın Koşulu

Birinci tablo altı katmanı tek bir sütunla ayırır: **koşul**. Beş katman koşulsuzdur —
dağıtıldıkları yerde her girdi için aynı adımı kırarlar. Bir tanesi koşulludur: alan
sözleşmesi yalnız sözleşmeyi ihlal eden girdide zinciri kırar. Sözleşmeye uyan ve ayırıcı
sınıfı taşıyan bir girdi için sözleşme katmanı **hiçbir adım kırmaz**.

Bu ayrım pratikte en sık yanlış okunan noktadır. Sözleşme doğrulaması bir enjeksiyon savunması
gibi anılır; ölçüldüğünde görülen şey, onun yalnız biçimsel olarak dışarıda kalan girdileri
durdurduğudur. Meşru bir abone adının içindeki ayırıcı karakter sınıfı da, o alanın
sözleşmesine uyar.

İkinci ayrım maliyet sütunundadır. İkinci adımı kıran katmanın meşru işe bedeli **sıfırdır**:
değeri ayrı bir işlenen olarak geçirmek hiçbir meşru isteği reddetmez. Altıncı adımı kıran
çıkış sınırının bedeli 9 kalem/gündür. Altı katmanın toplam bedeli 23 iken, ilk iki adımı
kıran ikisinin toplam bedeli 3'tür. **Erken kırmak yalnız daha az kalem kaybettirmez; kırmanın
kendisi de daha ucuzdur.**

#### Çağrı Yeri Başına Kırılma

İkinci tablo dersin asıl ölçümüdür. Sınıf tektir, zincir tektir — ama savunma çağrı yeri
başına dağıtılır ve on iki yerde on iki farklı sonuç çıkar.

On iki yerin dokuzunda zincir **ikinci adımda** kırılıyor ve tek bir katman bunu yapıyor.
Bir yerde ilk kırılma üçüncü adıma kayıyor. **İki yerde koşulsuz hiçbir katman yok**: orada
zincir yalnız girdinin önkoşulları tutmadığında duruyor, savunma yüzünden değil. On iki çağrı
yeri ile altı adımın kurduğu 72 bileşimin **42'sinde hiçbir denetim yok**.

Denetimsiz bileşimlerin dağılımı da tek düze değildir. Dört katman on iki yerin dördünde ya
da daha azında bulunuyor; en yaygın katman dokuz yerde. Sayı, kapsamın **katman başına**
ölçülmesi gerektiğini gösterir: bir katmanın var olması onun her yerde var olduğu anlamına
gelmez ve zincir en zayıf çağrı yerinden yürür.

Son satır kâğıt ile sahanın farkını verir. Bir önceki ders enjeksiyon zincirini "üç adımında
denetim var" diye kaydetmişti; o kayıt, üç katmanın her yerde bulunduğunu varsayar. Ölçüm o
kuruluşun **12 çağrı yerinin yalnız 1'inde** tam olduğunu söylüyor. Sistem düzeyinde yazılan
her savunma iddiası, çağrı yeri başına sayılmadan doğrulanmış sayılmaz.

#### Girdi Sınıfı ve Durak

Üçüncü tablo 16 girdiyi dört sınıfa ayırır ve 192 girdi-yer bileşiminin nerede durduğunu
sayar. İki sütun ayrı tutulur: zinciri **bir denetim** mi durdurdu, yoksa girdinin
**önkoşulu** mu tutmadı.

Ayırıcı sınıfı taşımayan girdiler üçüncü adımda kendiliğinden duruyor — hiçbir savunma iş
yapmadan. Bu, `duz-uyumlu` ve `uzun-ama-uyumlu` sınıflarının bedel sütununu sıfır yapan
şeydir. Bir savunmanın "hiçbir sorun görülmedi" demesi, çoğu zaman zincirin o girdi için
zaten önkoşulsuz olduğu anlamına gelir.

Ayırıcı sınıfı taşıyan dört girdi ise 48 bileşimin 40'ında bir denetimle durduruluyor,
4'ünde önkoşul tutmuyor ve 4'ünde zincir tamamlanıyor. Aynı dört girdi, dağıtımı eksik iki
yerde 2.400 kalemlik bedeli tek başına taşıyor.

Toplam 192 bileşimin yalnız **6'sı** altı adımı tamamlıyor ve altısı da aynı iki çağrı
yerinde. Bu iki yerin taşıdığı bedel 2.400 ve 1.200 kalemdir. Risk kalemin kendisine değil,
kalemin **kaç yerde denetimsiz** olduğuna bağlıdır: sınıf on iki yerde de aynıdır, sayı iki
yerde toplanır.

#### Geç Kırmanın Bedeli

Dördüncü tablo bedeli adım adım verir. İlk üç adımda kırılan zincirin bedeli sıfırdır:
ayrıştırma gerçekleşmemiştir. Dördüncü adımda kırılırsa 40, beşincide 120, altıncıda 300
kurgu kalem etkilenmiştir; hiç kırılmazsa 480.

Sıfır bedelli üç adımın anlamı, o adımlarda kırmanın **karşılıksız** olduğu değildir. Orada
kırmak bir olayın hiç oluşmamasını sağlar; kayda düşen tek şey reddedilmiş bir istektir.
Dördüncü adımdan sonra kırmak ise her zaman bir olay kaydı, bir inceleme ve bir kapsam
sorusu üretir — bedel sütununun yazmadığı ikinci maliyet budur.

Bedelin sıçraması eşit değildir. Üçüncü adımdan dördüncüye geçiş 0'dan 40'a çıkar; beşinciden
altıncıya geçiş 120'den 300'e. **Zincirin sonuna doğru her adım bir öncekinden pahalıdır**,
çünkü her adım bir öncekinin elde ettiğini çoğaltır. En az yetki ile çıkış sınırı bu yüzden
"geç" savunmalardır: işe yararlar, ama devreye girdiklerinde kaybın bir bölümü olmuştur.

#### Özet

- Enjeksiyon sınıfı altı adımlık bir zincirdir ve her adım bir önkoşula bağlıdır: erişilebilir
  uç, birleştiren çağrı yeri, ayırıcı sınıfı taşıyan değer, geniş yetki, ayrıntılı geri dönüş,
  sınırsız çıkış.
- Altı katmandan beşi koşulsuz kırar, biri koşulludur: alan sözleşmesi yalnız sözleşme dışı
  girdide kırar ve sözleşmeye uyup ayırıcı sınıfı taşıyan girdi için hiçbir adım kırmaz.
- İkinci adımı kıran katmanın meşru işe bedeli 0, altıncı adımı kıranınki 9 kalem/gündür;
  altı katmanın toplamı 23, ilk iki adımı kıran ikisinin toplamı 3'tür.
- On iki çağrı yerinin 9'unda zincir ikinci adımda kırılıyor, 1'inde üçüncüde, 2'sinde hiçbir
  koşulsuz katman yok. 72 adım-yer bileşiminin 42'sinde denetim bulunmuyor ve kâğıt üzerindeki
  üç katmanlı kuruluş 12 yerin yalnız 1'inde tam.
- 192 girdi-yer bileşiminin 6'sı altı adımı tamamlıyor ve altısı da aynı iki çağrı yerinde;
  bedel dördüncü adımdan itibaren 40, 120, 300 ve kırılmazsa 480 kalemdir.

#### Sonraki Adım

Bu dersin zincirinde değer bir yorumlayıcının metnine yazılıyordu ve yorumlayıcı sunucunun
içindeydi. Aynı adım dizisi, yorumlayıcı **kullanıcının tarayıcısında** olduğunda başka bir
biçim alır: değer sunucudan geçer, bir sayfaya yerleşir ve ayrıştırma başka bir makinede
gerçekleşir. Sonraki ders bu kaymayı ölçer — üç ayrı biçimin adım sayıları neden farklıdır,
bir biçimde değer sunucuya hiç uğramadığında sunucu tarafındaki katmanların kırdığı adım
sayısı kaça iner ve o durumda ölçünün kırmadan tespite kayması ne anlama gelir.

### Siteler Arası Betik Çalıştırma

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/siteler-arasi-betik-calistirma

Üç biçimin ayrı adım dizisi olarak ölçülmesi: yansıyan beş, saklı altı, belge nesnesi tabanlı dört adım; sunucu tarafındaki üç katmanın belge nesnesi tabanlı biçimde kırdığı adım sayısının sıfır olması, sekiz sayfada yirmi dört bileşimin üçünde hiçbir halkanın kırılamaması, yalnız son adımda kırılan yedi bileşimin günlük yüz doksan oturumluk bedeli ve tarayıcı tarafındaki tek katmanın üç biçimi birden kapatması.

Önceki dersin zincirinde yorumlayıcı sunucunun içindeydi ve altı adımın üçü sunucuda
geçiyordu. Bu ders aynı adım dizisini yorumlayıcı **kullanıcının tarayıcısında** olduğunda
ölçer. Değişen tek şey ayrıştırmanın nerede yapıldığıdır; sonuç, zincirin uzunluğunun ve
kırılabilen halkanın üç ayrı biçimde üç ayrı yere düşmesidir.

Üç biçim ayrılır: değerin aynı yanıtta geri döndüğü **yansıyan** biçim, değerin önce depoya
yazılıp sonra her görüntüleyene sunulduğu **saklı** biçim ve değerin sunucuya hiç uğramadığı
**belge nesnesi tabanlı** biçim. Ölçüm boyunca hiçbir betik gövdesi, hiçbir değer ve hiçbir
sayfa kaynağı yazılmaz; biçimler yalnız adım dizileriyle anılır.

#### Üç Adım Dizisi

**Yansıyan biçim, beş adım.** (1) Değer bir istek alanında uca ulaşır — önkoşul: uç o alanı
yanıtına geri yazıyor. (2) Değer, yanıtta kod olarak okunacak bir konuma yerleşir — önkoşul:
o konumun bağlamına göre kodlama yapılmıyor. (3) Bağlantı kurbana ulaşır ve kurban onu kendi
oturumuyla açar — önkoşul: bir teslim kanalı var. (4) Tarayıcı yerleşen değeri çalıştırır —
önkoşul: sayfanın içerik politikası bu kaynağa izin veriyor. (5) Çalışan kod oturum kalemine
erişip dışarı taşır — önkoşul: çerez betiğe açık.

**Saklı biçim, altı adım.** Yansıyan biçimin ilk adımı ikiye ayrılır: değer önce bir yazma
ucundan **depoya** girer, sonra bir görüntüleme yolunda yanıta yerleşir. Karşılığında üçüncü
adımın önkoşulu **ortadan kalkar**: kimseyi bir bağlantıya yönlendirmek gerekmez, sayfayı
kendi işi için açan herkes zinciri kendisi tamamlar. Zincir bir adım uzar ve teslim halkası
bedavaya gelir.

**Belge nesnesi tabanlı biçim, dört adım.** (1) Değer istemci tarafında bir kaynaktan okunur
— önkoşul: adres parçası ya da yerel depolama gibi sunucuya gitmeyen bir kaynak kullanılıyor.
(2) İstemci betiği değeri, kod olarak yorumlanan bir hedefe yazar — önkoşul: hedef seçimi
sabit değil. (3) Tarayıcı çalıştırır. (4) Erişim ve çıkış. Bu dizide **sunucuda geçen adım
yoktur**; sunucu isteği görmez, kaydına düşmez, yanıtını değiştirmez.

Üç dizinin ortak noktası son iki adımdır: çalışma ve çıkış. Bu, savunmanın niçin iki ayrı
yerde durabildiğini açıklar — biri değerin yanıta yerleşmesini, öteki tarayıcının onu
çalıştırmasını engeller. Ayrıldıkları nokta ise başlangıçtır: yansıyan ve saklı biçim
sunucudan geçer, üçüncüsü geçmez.

**TS10:** her biçim ayrı bir adım dizisidir. **TS11:** her katman her biçimde belirli bir adımı
kırar; kırmadığı biçimde değeri yoktur. **TS12:** bağlantı başına teslimde bedel kurgu 12
kişidir, görüntüleme başına teslimde sayfanın günlük görüntüleme sayısıdır. **TS13:** ilk
kırılan halka, o sayfada dağıtılmış katmanların kırdığı en küçük adım indeksidir.

```js
// xss/bicim.mjs — siteler arasi betik calistirmanin uc bicimi, adim dizileri ve katmanlar
// (model). Gercek bir sayfa, gercek bir deger ve hicbir betik govdesi yok.
export const BICIM = {
  yansiyan: { adim: ["giris", "yerlesme", "teslim", "calisma", "cikis"],
    taraf: ["sunucu", "sunucu", "kurban", "tarayici", "tarayici"], teslim: "baglanti basina" },
  sakli: { adim: ["yazma", "depolama", "yerlesme", "goruntuleme", "calisma", "cikis"],
    taraf: ["sunucu", "sunucu", "sunucu", "kurban", "tarayici", "tarayici"],
    teslim: "goruntuleme basina" },
  belgeNesnesi: { adim: ["istemci-kaynagi", "hedefe-yazma", "calisma", "cikis"],
    taraf: ["tarayici", "tarayici", "tarayici", "tarayici"], teslim: "baglanti basina" },
};

// kirar[bicim] = 1 tabanli adim indeksi ya da 0 (o bicimde hicbir adimi kirmaz).
export const KATMAN = [
  { ad: "girdi-sozlesmesi", yer: "sunucu",
    kirar: { yansiyan: 1, sakli: 1, belgeNesnesi: 0 }, mesru: 3 },
  { ad: "depo-temizleme", yer: "sunucu",
    kirar: { yansiyan: 0, sakli: 2, belgeNesnesi: 0 }, mesru: 2 },
  { ad: "cikti-kodlama", yer: "sunucu",
    kirar: { yansiyan: 2, sakli: 3, belgeNesnesi: 0 }, mesru: 0 },
  { ad: "icerik-politikasi", yer: "tarayici",
    kirar: { yansiyan: 4, sakli: 5, belgeNesnesi: 3 }, mesru: 7 },
  { ad: "istemci-hedef-secimi", yer: "istemci-kodu",
    kirar: { yansiyan: 0, sakli: 0, belgeNesnesi: 2 }, mesru: 1 },
  { ad: "cerez-bayragi", yer: "tarayici",
    kirar: { yansiyan: 5, sakli: 6, belgeNesnesi: 4 }, mesru: 4 },
];

export const BAGLANTI = 12;

// Kurgu olcum aginin sekiz sayfasi: dagitilmis katmanlar ve gunluk goruntuleme sayisi.
export const SAYFA = [
  ["abone-portali.arama", ["girdi-sozlesmesi", "cikti-kodlama", "icerik-politikasi", "cerez-bayragi"], 210],
  ["abone-portali.itiraz", ["girdi-sozlesmesi", "depo-temizleme", "cikti-kodlama", "cerez-bayragi"], 90],
  ["abone-portali.fatura", ["cikti-kodlama", "icerik-politikasi", "cerez-bayragi"], 340],
  ["saha-uygulamasi.is-emri", ["girdi-sozlesmesi", "cikti-kodlama", "cerez-bayragi"], 160],
  ["saha-uygulamasi.saha-notu", ["cerez-bayragi"], 75],
  ["sube-ucu.pano", ["cikti-kodlama", "icerik-politikasi"], 40],
  ["sube-ucu.rapor-baglantisi", ["istemci-hedef-secimi", "cerez-bayragi"], 55],
  ["yonetim.olcum-arama", [], 20],
];

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(""));
```

```js
// xss/olcum.mjs — uc bicim sekiz sayfada kosturulur: ilk kirilan halka, sunucu tarafinin
// kirdigi adim ve kirilmadiginda etkilenen oturum sayisi. Rastgelelik yok.
import { BICIM, KATMAN, SAYFA, BAGLANTI, yaz } from "./bicim.mjs";

const adlar = Object.keys(BICIM);
const AD = { yansiyan: "yansiyan", sakli: "sakli", belgeNesnesi: "belge nesnesi" };
const ilkKirilan = (b, d) => Math.min(...KATMAN
  .filter((k) => d.includes(k.ad) && k.kirar[b] > 0).map((k) => k.kirar[b]), Infinity);
const bedel = (b, gor) => (b === "sakli" ? gor : BAGLANTI);

console.log(`${adlar.length} bicim, ${KATMAN.length} katman, ${SAYFA.length} kurgu sayfa\n`);

const A = [-16, 7, 10, 12, 20];
console.log("1. bicim basina zincir");
yaz(A, "bicim", "adim", "sunucuda", "kirabilen", "teslim");
for (const b of adlar)
  yaz(A, AD[b], BICIM[b].adim.length, BICIM[b].taraf.filter((t) => t === "sunucu").length,
    KATMAN.filter((k) => k.kirar[b] > 0).length, BICIM[b].teslim);

const B = [-22, -14, 10, 8, 15];
console.log("\n2. katman-adim eslemesi");
yaz(B, "katman", "yer", "yansiyan", "sakli", "belge nesnesi");
for (const k of KATMAN)
  yaz(B, k.ad, k.yer, k.kirar.yansiyan || "-", k.kirar.sakli || "-", k.kirar.belgeNesnesi || "-");
const sunucu = KATMAN.filter((k) => k.yer === "sunucu");
console.log(`sunucu tarafindaki ${sunucu.length} katmanin belge nesnesi tabanli bicimde ` +
  `kirdigi adim sayisi: ${sunucu.filter((k) => k.kirar.belgeNesnesi > 0).length}`);

const C = [-26, 7, 12, 12, 15];
console.log("\n3. sayfa basina ilk kirilan halka");
yaz(C, "sayfa", "katman", "yansiyan", "sakli", "belge nesnesi");
let acik = 0, oturum = 0;
for (const [ad, d, gor] of SAYFA) {
  const h = adlar.map((b) => ilkKirilan(b, d));
  h.forEach((v, i) => { if (v === Infinity) { acik++; oturum += bedel(adlar[i], gor); } });
  yaz(C, ad, d.length, ...h.map((v) => (v === Infinity ? "kirilmiyor" : `${v}. adim`)));
}
console.log(`${SAYFA.length * adlar.length} sayfa-bicim bilesiminin ${acik} tanesinde hicbir ` +
  `halka kirilmiyor; bu bilesimlerin gunluk bedeli ${oturum} kurgu oturum`);
const gec = SAYFA.flatMap(([, d, gor]) => adlar.filter((b) =>
  ilkKirilan(b, d) === BICIM[b].adim.length).map((b) => bedel(b, gor)));
console.log(`yalnizca son adimda kirilan bilesim: ${gec.length}, gunluk bedeli ` +
  `${gec.reduce((a, x) => a + x, 0)} kurgu oturum`);

const D = [-22, 10, 8, 15, 9, 15];
console.log("\n4. tek katman butun sayfalarda olsaydi");
yaz(D, "tek katman", "yansiyan", "sakli", "belge nesnesi", "mesru", "kalan oturum");
for (const k of KATMAN) {
  const top = SAYFA.reduce((t, [, , gor]) => t + adlar.reduce((s, b) =>
    s + (k.kirar[b] > 0 ? 0 : bedel(b, gor)), 0), 0);
  yaz(D, k.ad, k.kirar.yansiyan || "-", k.kirar.sakli || "-", k.kirar.belgeNesnesi || "-",
    k.mesru, top);
}
const hepsiAcik = SAYFA.reduce((t, [, , gor]) => t + adlar.reduce((s, b) => s + bedel(b, gor), 0), 0);
console.log(`hicbir katman yokken gunluk bedel: ${hepsiAcik} kurgu oturum`);
```

```
3 bicim, 6 katman, 8 kurgu sayfa

1. bicim basina zincir
bicim              adim  sunucuda   kirabilen              teslim
yansiyan              5         2           4     baglanti basina
sakli                 6         3           5  goruntuleme basina
belge nesnesi         4         0           3     baglanti basina

2. katman-adim eslemesi
katman                yer             yansiyan   sakli  belge nesnesi
girdi-sozlesmesi      sunucu                 1       1              -
depo-temizleme        sunucu                 -       2              -
cikti-kodlama         sunucu                 2       3              -
icerik-politikasi     tarayici               4       5              3
istemci-hedef-secimi  istemci-kodu           -       -              2
cerez-bayragi         tarayici               5       6              4
sunucu tarafindaki 3 katmanin belge nesnesi tabanli bicimde kirdigi adim sayisi: 0

3. sayfa basina ilk kirilan halka
sayfa                      katman    yansiyan       sakli  belge nesnesi
abone-portali.arama             4     1. adim     1. adim        3. adim
abone-portali.itiraz            4     1. adim     1. adim        4. adim
abone-portali.fatura            3     2. adim     3. adim        3. adim
saha-uygulamasi.is-emri         3     1. adim     1. adim        4. adim
saha-uygulamasi.saha-notu       1     5. adim     6. adim        4. adim
sube-ucu.pano                   2     2. adim     3. adim        3. adim
sube-ucu.rapor-baglantisi       2     5. adim     6. adim        2. adim
yonetim.olcum-arama             0  kirilmiyor  kirilmiyor     kirilmiyor
24 sayfa-bicim bilesiminin 3 tanesinde hicbir halka kirilmiyor; bu bilesimlerin gunluk bedeli 44 kurgu oturum
yalnizca son adimda kirilan bilesim: 7, gunluk bedeli 190 kurgu oturum

4. tek katman butun sayfalarda olsaydi
tek katman              yansiyan   sakli  belge nesnesi    mesru   kalan oturum
girdi-sozlesmesi               1       1              -        3             96
depo-temizleme                 -       2              -        2            192
cikti-kodlama                  2       3              -        0             96
icerik-politikasi              4       5              3        7              0
istemci-hedef-secimi           -       -              2        1           1086
cerez-bayragi                  5       6              4        4              0
hicbir katman yokken gunluk bedel: 1182 kurgu oturum
```

#### Sunucunun Görmediği Zincir

İkinci tablonun son satırı bu dersin ana bulgusudur: sunucu tarafındaki üç katmanın belge
nesnesi tabanlı biçimde kırdığı adım sayısı **sıfırdır**. Girdi sözleşmesi bir istek görmez,
depo temizleme bir yazma görmez, çıktı kodlaması yanıtın içine yazılan bir değer görmez.
Değer sunucuya hiç uğramaz.

Bunun ikinci bir sonucu vardır ve ilkinden ağırdır: sunucu bu zincirin **hiçbir adımını
kaydetmez**. Kırılamayan bir zincirde ölçü tespite kayar; burada tespit de sunucu tarafında
yapılamaz, çünkü bakılacak bir kayıt satırı yoktur. Bu biçimin görülebileceği tek yerler
tarayıcı davranışını raporlayan bir politika ihlali bildirimi ve istemci kodunun kendi
kaydıdır.

Aynı satır bir katman sınıfını da öne çıkarır: `istemci-hedef-secimi` yalnız bu biçimde
değer taşır ve tek başına **ikinci adımı** kırar. Sunucuyu sertleştirmekle ilgili hiçbir
karar bu adımı etkilemez.

Bu, ölçünün nereye taşındığını da belirler. Bir savunma raporu sunucu tarafındaki üç katmanı
sayarak "üç katmanlı koruma" yazabilir ve bu, iki biçim için doğru olur. Üçüncü biçim için
sayı üçtür ama kırdığı adım sıfırdır — ve rapor bu ikisini ayırmadığı sürece fark
görünmez. Katman saymak yerine **kırılan adımı** saymanın gerekçesi bu satırdır.

#### Zincir Uzunluğu ve Teslim

Birinci tablo üç biçimi yan yana koyar: 5, 6 ve 4 adım. En uzun zincir en güvenli olan
değildir. Saklı biçim altı adımdır ve bir adım fazlası **saldıranın lehinedir**: dördüncü
adım bir teslim çabası gerektirmez, sayfayı kendi işi için açan herkes o adımı tamamlar.

Kırabilen katman sayısı da aynı yönde okunur: yansıyan biçimi dört katman, saklı biçimi beş,
belge nesnesi tabanlı biçimi üç katman kırabiliyor. Saklı biçim en çok katmanın gördüğü
biçimdir çünkü en çok adımı sunucudan geçer; en az katmanın gördüğü biçim ise sunucudan hiç
geçmeyendir. **Bir zincirin görülebilirliği uzunluğuyla değil, savunmanın bulunduğu tarafta
kaç adım geçirdiğiyle ölçülür.**

Teslim sütunu bedelin de biriminin farklı olduğunu söyler. Yansıyan ve belge nesnesi tabanlı
biçimlerde bedel bağlantı başınadır — kurgu 12 kişi. Saklı biçimde bedel görüntüleme
başınadır ve sayfaya göre 20 ile 340 arasında değişir. Aynı sınıf, aynı sayfa, farklı biçim:
**geç kırmanın bedeli yirmi sekiz katına kadar çıkar.**

#### Sayfa Başına Kırılma

Üçüncü tablo dağıtımı ölçer. Sekiz sayfa ve üç biçimin kurduğu 24 bileşimin **3'ünde** hiçbir
halka kırılmıyor; üçü de tek bir sayfada toplanıyor. O sayfada hiçbir katman dağıtılmamış
durumda ve günlük bedeli 44 kurgu oturum.

Daha ince olan sonuç yedi bileşimdedir: oralarda zincir kırılıyor, ama **yalnız son adımda**.
Çerez bayrağı taşıyan ama başka hiçbir katmanı olmayan bir sayfada kod çalışır, sayfa
değişir, istekler gider — kırılan tek halka en sondaki erişimdir. Bu yedi bileşimin günlük
bedeli 190 oturumdur ve savunma raporunda "korunuyor" diye görünürler.

Tablonun sol sütunu bu sonucun nedenini verir. Dört katmanı olan iki sayfada zincir birinci
adımda kırılıyor; üç katmanı olan sayfalarda ikinci ya da üçüncü adımda; tek katmanı olan
sayfada beşinci ve altıncı adımda. Katman sayısı ile kırılan halkanın indeksi bu kümede
birlikte hareket ediyor, ama birebir değil: üç katmanlı `abone-portali.fatura` ikinci adımda
kırarken, iki katmanlı `sube-ucu.pano` da ikinci adımda kırıyor. Belirleyici olan sayı değil,
katmanların **hangi adımlara** düştüğüdür.

`sube-ucu.rapor-baglantisi` satırı iki katmanın yön farkını gösterir. Belge nesnesi tabanlı
biçimde zincir **ikinci adımda** kırılıyor, çünkü istemci hedef seçimi oradadır; yansıyan ve
saklı biçimlerde ise ancak beşinci ve altıncı adımda. Aynı sayfa, aynı iki katman, biçime
göre üç farklı halka.

#### Tek Katmanın Kapsamı

Dördüncü tablo her katmanı tek başına, bütün sayfalarda varsayar ve geriye kalan günlük
bedeli sayar. Hiçbir katman yokken bedel 1.182 kurgu oturumdur.

İki satır sıfır veriyor: içerik politikası ve çerez bayrağı üç biçimi de kırıyor, çünkü
ikisi de **tarayıcı tarafındadır** ve üç biçim de orada birleşir. Meşru işe bedelleri 7 ve
4'tür — altı katmanın en pahalıları.

Depo temizlemenin satırı ise tek biçime bağlı bir katmanın sınırını verir: saklı biçimi
ikinci adımda kırar, öteki iki biçimde hiçbir şey yapmaz ve geriye 192 oturum bırakır — altı
satırın en yükseği değil, ama yalnız tek bir biçime bağlı iki katmandan biri.

Çıktı kodlamasının meşru işe bedeli **sıfırdır** ve yansıyan ile saklı biçimi ikinci ve
üçüncü adımda kırar; ama belge nesnesi tabanlı biçimde hiçbir şey yapmaz ve geriye 96 oturum
bırakır. En ucuz katman erken kırar ama üç biçimin birini hiç görmez; üç biçimi birden
kapsayan katman ise en pahalı olanıdır. **Kapsam ile erkenlik aynı katmanda birleşmiyor** — bu,
iki katmanın da gerekmesinin ölçülmüş nedenidir.

#### Özet

- Üç biçim üç ayrı zincirdir: yansıyan 5, saklı 6, belge nesnesi tabanlı 4 adım. Saklı biçimin
  fazladan adımı saldıranın lehinedir, çünkü teslim halkasının önkoşulunu ortadan kaldırır.
- Sunucu tarafındaki 3 katmanın belge nesnesi tabanlı biçimde kırdığı adım sayısı 0'dır ve o
  zincirin hiçbir adımı sunucu kaydına düşmez; orada ölçü kırmadan tespite kayar, tespit de
  yalnız tarayıcı tarafında yapılabilir.
- Bedelin birimi biçime göre değişir: bağlantı başına 12 kurgu kişi, görüntüleme başına 20 ile
  340 arası. Aynı sayfada geç kırmanın bedeli biçime göre yirmi sekiz katına kadar çıkar.
- Sekiz sayfa ve üç biçimin 24 bileşiminin 3'ünde hiçbir halka kırılmıyor (günlük 44 oturum),
  7'sinde yalnız son adımda kırılıyor (günlük 190 oturum).
- Tarayıcı tarafındaki iki katmanın her biri tek başına üç biçimi de kapatıyor ve kalan bedeli
  0'a indiriyor; meşru bedelleri 7 ve 4. Bedeli 0 olan çıktı kodlaması erken kırıyor ama
  bir biçimi hiç görmediği için geriye 96 oturum bırakıyor.

#### Sonraki Adım

Bu dersin üç biçiminde de kod kurbanın tarayıcısında çalışıyordu ve son adımda oturum
kalemine erişiyordu. Aynı tarayıcının yapabileceği daha sessiz bir şey daha vardır: hiçbir
kod çalıştırmadan, yalnız bir isteği **kurbanın kimliğiyle** göndermek. Sonraki ders bu
sınıfı ölçer — isteğin kurbanın tarayıcısı üzerinden gittiği yön ile sunucunun kendi
kimliğiyle gittiği yön ayrı zincirler olarak yazılır, her yönün kaç adımı olduğu, hangi
katmanın hangi adımı kırdığı ve iki yönün geç kırma bedellerinin neden aynı birimle
ölçülemediği sayılır.

### İstek Sahteciliği

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/istek-sahteciligi

İ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.

Ö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 — ikisi savunanın kendi
altyapısında, ikisi ağda, 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.

```js
// 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(""));
```

```js
// 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 yalnız 2'dir. `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; meşru bedeli 2 olan
  bir katmanın 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ığı.

### Dizin Geçişi

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/dizin-gecisi

Dizin geçişinin beş adımlık zincir ve erişilebilir kalem sayımı olarak ölçülmesi: otuz kalemlik kurgu envanterde kök denetiminin kalemi on ikiye ve duyarlılığı yediye indirmesi, dar süreç kimliğinin bölme içinde hiçbir kalemi çıkarmaması, tanıtıcı eşlemesinin zinciri ikinci adımda kırıp on kalem bırakması ve hiçbir adımı kırmayan bölmenin duyarlılığı kırk birden yirmiye düşürmesi.

Önceki dersin sunucu yönünde istek dışarıdan gelen bir **adrese** gidiyordu. 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
sunmak istediği kök dizine ekler ve sonucu okur. Dizin geçişi bu zincirdir.

Bu dersin ölçüsü öncekilerden bir noktada ayrılır. Geç kırmanın bedeli burada bir işlem ya da
oturum sayısı değil, **okunabilir kalem sayısıdır** — ve o sayı zincirin nerede kırıldığına
değil, kırılmadığında sürecin gördüğü envanterin büyüklüğüne bağlıdır. Bu yüzden ölçümün
merkezinde bir kurgu dosya envanteri durur. Hiçbir yol dizgesi üretilmez; kalemler yalnız
konum ve izin özellikleriyle tanımlanır.

#### Zincirin Beş Adımı

1. **Ad istekten gelir.** Önkoşul: uç, sunulacak kalemin adını istek alanından alıyor.
2. **Ad yola birleştirilir.** Önkoşul: ad bir tanıtıcıya eşlenmiyor, doğrudan yolun bir
   bileşeni olarak kullanılıyor.
3. **Birleştirilen yol kökün dışına düşer.** Önkoşul: yol normalleştirildikten sonra kökün
   altında kalıp kalmadığına bakan bir denetim yok.
4. **Süreç kimliği o kalemi okuyabilir.** Önkoşul: sürecin çalıştığı kimliğin dosya izinleri o
   kalemi kapsıyor.
5. **İçerik yanıta yazılır.** Önkoşul: yanıt gövdesi kalemin içeriğini olduğu gibi taşıyor.

Üçüncü adım bu sınıfın adını taşıyan adımdır, ama tek başına bir şey vermez. Kökün dışına
düşen bir yol, dördüncü adım tutmadıkça bir okuma üretmez. **Sınıfın bedelini belirleyen şey
üçüncü adım değil, dördüncü adımın kapsadığı envanterdir.**

İkinci adım da kendi başına bir karardır ve çoğu tartışmada atlanır. Bir uç, sunacağı kalemi
istekten gelen adla değil, önceden belirlenmiş bir tanıtıcı kümesinden seçerek de
belirleyebilir. O zaman istekten gelen değer bir yol bileşeni olmaz; bir anahtar olur ve
anahtar kümenin dışındaysa istek karşılıksız kalır. Bu karar zincirin en erken kırılabilen
noktasıdır ve envanteri kökten değil, **listeden** tanımlar.

**TS18:** adım dizisi bir modeldir. **TS19:** her katman tek bir adımı kırar; bölme hiçbir adımı
kırmaz, yalnız envanteri daraltır. **TS20:** envanter 30 kurgu kalemdir ve her kalem konum, izin
ve duyarlılık ağırlığıyla tanımlanır. **TS21:** erişilebilir küme, dağıtılan katmanların
envanteri daralttığı sonuçtur.

```js
// dg/envanter.mjs — kurgu bir dosya envanteri ve dizin gecisi zinciri (model).
// Gercek bir dosya sistemi, gercek bir yol ve hicbir gecis dizgesi yok; kalemler yalnizca
// konum ve izin ozellikleriyle tanimlanir.
export const ADIM = ["ad-istekten", "yola-birlestirme", "kok-disina-cikma",
  "surecin-okumasi", "yanita-yazma"];

export const KATMAN = [
  { ad: "tanitici-eslemesi", kirar: 2, mesru: 6 },
  { ad: "kok-denetimi",      kirar: 3, mesru: 1 },
  { ad: "dar-surec-kimligi", kirar: 4, mesru: 4 },
  { ad: "cikti-siniri",      kirar: 5, mesru: 3 },
  { ad: "bolme",             kirar: 0, mesru: 9 },
];

// kok = uygulamanin sunmak istedigi kok altinda mi, bolme = surecin bolmesi icinde mi,
// sahip = kalemin sahibi, ortak = herkese okunur mu, duyar = kurgu duyarlilik agirligi.
const K = (ad, kok, bolme, sahip, ortak, duyar) => ({ ad, kok, bolme, sahip, ortak, duyar });
export const KALEM = [
  K("fatura/2026-01.belge", 1, 1, "uygulama", 0, 1), K("fatura/2026-02.belge", 1, 1, "uygulama", 0, 1),
  K("fatura/2026-03.belge", 1, 1, "uygulama", 0, 1), K("rapor/donem-ozeti.belge", 1, 1, "uygulama", 0, 1),
  K("rapor/sayac-dokum.belge", 1, 1, "uygulama", 0, 1), K("sablon/bildirim.metin", 1, 1, "uygulama", 0, 0),
  K("sablon/fatura.metin", 1, 1, "uygulama", 0, 0), K("saha/foto-1.imge", 1, 1, "uygulama", 0, 0),
  K("saha/foto-2.imge", 1, 1, "uygulama", 0, 0), K("saha/foto-3.imge", 1, 1, "uygulama", 0, 0),
  K("indirme/dokum.arsiv", 1, 1, "uygulama", 0, 1), K("indirme/gecmis.arsiv", 1, 1, "uygulama", 0, 1),
  K("uygulama/ayar.yapilandirma", 0, 1, "uygulama", 0, 3),
  K("uygulama/veritabani.baglanti", 0, 1, "uygulama", 0, 3),
  K("uygulama/imza.anahtar", 0, 1, "uygulama", 0, 3),
  K("uygulama/gunluk/erisim.kayit", 0, 1, "uygulama", 0, 2),
  K("uygulama/gunluk/hata.kayit", 0, 1, "uygulama", 0, 2),
  K("uygulama/surum.metin", 0, 1, "uygulama", 1, 0),
  K("ortak/zaman-dilimi.tablo", 0, 1, "sistem", 1, 0),
  K("ortak/kod-sayfasi.tablo", 0, 1, "sistem", 1, 0),
  K("sistem/kullanici-listesi.kayit", 0, 0, "sistem", 1, 2),
  K("sistem/agirlik-tablosu.kayit", 0, 0, "sistem", 1, 1),
  K("sistem/ag-ayari.yapilandirma", 0, 0, "sistem", 1, 2),
  K("sistem/servis-tanimi.birim", 0, 0, "sistem", 1, 1),
  K("sistem/gizli/kimlik.deposu", 0, 0, "sistem", 0, 3),
  K("sistem/gizli/anahtar.deposu", 0, 0, "sistem", 0, 3),
  K("komsu/toplayici-ayar.yapilandirma", 0, 0, "komsu", 0, 3),
  K("komsu/dogrulayici-ayar.yapilandirma", 0, 0, "komsu", 0, 3),
  K("komsu/fatura-sablonu.metin", 0, 0, "komsu", 0, 1),
  K("komsu/gunluk-arsiv.kayit", 0, 0, "komsu", 0, 2),
];

// Tanitici eslemesi: uc, ad yerine sabit bir tanitici kumesinden secim yapar.
export const ESLEME = KALEM.filter((k) => k.kok && !k.ad.startsWith("indirme/"));

export const UC = [
  ["abone-portali.fatura-indir", ["tanitici-eslemesi", "kok-denetimi", "dar-surec-kimligi"]],
  ["abone-portali.rapor-goster", ["kok-denetimi", "dar-surec-kimligi", "cikti-siniri"]],
  ["saha-uygulamasi.foto-getir", ["kok-denetimi", "bolme"]],
  ["fatura-uretimi.sablon-oku", ["tanitici-eslemesi"]],
  ["rapor.dokum-indir", ["dar-surec-kimligi"]],
  ["yonetim.kayit-goruntule", []],
];

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(""));
```

```js
// dg/olcum.mjs — erisilebilir kalem sayimi: her katman kumesi icin envanterin ne kadari
// okunabilir kaliyor. Rastgelelik yok; hicbir yol dizgesi uretilmez.
import { ADIM, KATMAN, KALEM, ESLEME, UC, yaz } from "./envanter.mjs";

function erisilebilir(d) {
  if (d.includes("tanitici-eslemesi")) return ESLEME;             // 2. adim kirildi
  let k = d.includes("bolme") ? KALEM.filter((x) => x.bolme) : KALEM;
  if (d.includes("kok-denetimi")) k = k.filter((x) => x.kok);      // 3. adim kirildi
  if (d.includes("dar-surec-kimligi"))                             // 4. adim kirildi
    k = k.filter((x) => x.sahip === "uygulama" || x.ortak);
  return k;
}
const duyar = (k) => k.reduce((t, x) => t + x.duyar, 0);
const ilkKirilan = (d) => Math.min(...KATMAN
  .filter((x) => d.includes(x.ad) && x.kirar > 0).map((x) => x.kirar), Infinity);

console.log(`${ADIM.length} adimlik zincir, ${KATMAN.length} katman, ` +
  `${KALEM.length} kalemlik kurgu envanter (kok alti ${KALEM.filter((k) => k.kok).length}, ` +
  `bolme ici ${KALEM.filter((k) => k.bolme).length}, toplam duyarlilik ${duyar(KALEM)})\n`);

const A = [-20, 9, 10, 12];
console.log("1. katman-adim eslemesi");
yaz(A, "katman", "kirdigi", "mesru", "dagitim");
for (const k of KATMAN)
  yaz(A, k.ad, k.kirar ? `${k.kirar}. adim` : "yok", k.mesru,
    UC.filter(([, d]) => d.includes(k.ad)).length);

const B = [-42, 8, 12, 13];
console.log("\n2. sekiz kurulus (tanitici eslemesi disinda)");
yaz(B, "kurulus", "kalem", "duyarlilik", "ilk kirilan");
const UCLU = ["kok-denetimi", "dar-surec-kimligi", "bolme"];
for (let m = 0; m < 8; m++) {
  const d = UCLU.filter((_, i) => m & (1 << i));
  const k = erisilebilir(d);
  const h = ilkKirilan(d);
  yaz(B, d.length ? d.join(" + ") : "hicbiri", k.length, duyar(k),
    h === Infinity ? "kirilmiyor" : `${h}. adim`);
}
const es = erisilebilir(["tanitici-eslemesi"]);
console.log(`tanitici eslemesi tek basina: ${es.length} kalem, duyarlilik ${duyar(es)}, ` +
  `2. adimda kirar; mesru bedeli her yeni kalemin eslemeye eklenmesidir`);

const C = [-30, 8, 13, 9, 12, 10];
console.log("\n3. uc basina zincir");
yaz(C, "uc", "katman", "ilk kirilan", "kalem", "duyarlilik", "kok disi");
for (const [ad, d] of UC) {
  const k = erisilebilir(d), h = ilkKirilan(d);
  yaz(C, ad, d.length, h === Infinity ? "kirilmiyor" : `${h}. adim`, k.length, duyar(k),
    k.filter((x) => !x.kok).length);
}
const acik = UC.filter(([, d]) => ilkKirilan(d) === Infinity);
console.log(`hicbir halkasi kirilmayan uc: ${acik.length}; bu uclarda okunabilir kalem ` +
  `${erisilebilir([]).length}, duyarlilik ${duyar(erisilebilir([]))}`);

const D = [-20, 12, 14, 14];
console.log("\n4. bolmenin ayri yeri");
yaz(D, "kurulus", "kirdigi adim", "kalem", "duyarlilik");
for (const [ad, d] of [["hicbiri", []], ["yalniz bolme", ["bolme"]],
  ["yalniz kok-denetimi", ["kok-denetimi"]], ["bolme + kok-denetimi", ["bolme", "kok-denetimi"]]]) {
  const k = erisilebilir(d), h = ilkKirilan(d);
  yaz(D, ad, h === Infinity ? "yok" : `${h}. adim`, k.length, duyar(k));
}
console.log(`bolme hicbir adimi kirmaz ama envanteri ${KALEM.length} kalemden ` +
  `${KALEM.filter((k) => k.bolme).length} kaleme, duyarliligi ${duyar(KALEM)}'den ` +
  `${duyar(KALEM.filter((k) => k.bolme))}'e indirir`);
```

```
5 adimlik zincir, 5 katman, 30 kalemlik kurgu envanter (kok alti 12, bolme ici 20, toplam duyarlilik 41)

1. katman-adim eslemesi
katman                kirdigi     mesru     dagitim
tanitici-eslemesi     2. adim         6           2
kok-denetimi          3. adim         1           3
dar-surec-kimligi     4. adim         4           3
cikti-siniri          5. adim         3           1
bolme                     yok         9           1

2. sekiz kurulus (tanitici eslemesi disinda)
kurulus                                      kalem  duyarlilik  ilk kirilan
hicbiri                                         30          41   kirilmiyor
kok-denetimi                                    12           7      3. adim
dar-surec-kimligi                               24          26      4. adim
kok-denetimi + dar-surec-kimligi                12           7      3. adim
bolme                                           20          20   kirilmiyor
kok-denetimi + bolme                            12           7      3. adim
dar-surec-kimligi + bolme                       20          20      4. adim
kok-denetimi + dar-surec-kimligi + bolme        12           7      3. adim
tanitici eslemesi tek basina: 10 kalem, duyarlilik 5, 2. adimda kirar; mesru bedeli her yeni kalemin eslemeye eklenmesidir

3. uc basina zincir
uc                              katman  ilk kirilan    kalem  duyarlilik  kok disi
abone-portali.fatura-indir           3      2. adim       10           5         0
abone-portali.rapor-goster           3      3. adim       12           7         0
saha-uygulamasi.foto-getir           2      3. adim       12           7         0
fatura-uretimi.sablon-oku            1      2. adim       10           5         0
rapor.dokum-indir                    1      4. adim       24          26        12
yonetim.kayit-goruntule              0   kirilmiyor       30          41        18
hicbir halkasi kirilmayan uc: 1; bu uclarda okunabilir kalem 30, duyarlilik 41

4. bolmenin ayri yeri
kurulus             kirdigi adim         kalem    duyarlilik
hicbiri                      yok            30            41
yalniz bolme                 yok            20            20
yalniz kok-denetimi      3. adim            12             7
bolme + kok-denetimi     3. adim            12             7
bolme hicbir adimi kirmaz ama envanteri 30 kalemden 20 kaleme, duyarliligi 41'den 20'e indirir
```

#### Envanterin Daralması

İkinci çıktı üç katmanın bütün bileşimlerini dener. Hiçbir katman yokken 30 kalemin tamamı
okunabilir ve toplam duyarlılık 41'dir; kök denetimi tek başına bunu **12 kaleme ve 7
duyarlılığa** indirir. Kalem sayısı %60 azalırken duyarlılık %83 azalır: kökün dışındaki 18
kalem, envanterin duyarlılığının orantısızca büyük bölümünü taşır.

Dar süreç kimliği tek başına 24 kalem ve 26 duyarlılık bırakır. Kök denetiminden belirgin
biçimde zayıftır, çünkü yalnız **sahipliğe** bakar: uygulamanın kendi kalemleri ve herkese
okunur sistem kalemleri elenmez. Uygulamanın kendi yapılandırma, bağlantı ve anahtar
kalemleri kök dışındadır ve süreç kimliği daralsa bile okunur kalır.

Duyarlılık sütununun kalem sütunundan hızlı düşmesi bu ölçümün en kullanışlı yanıdır. Kalem
saymak envanterin **büyüklüğünü** verir, duyarlılık toplamı ise **ne kaybedildiğini**. Bir
savunma kararı yalnız kalem sayısıyla değerlendirilirse, otuz kalemden yirmisini kapatan bir
katman iyi görünür; duyarlılık sütunu o yirmi kalemin toplam ağırlığın ne kadarını taşıdığını
söyler ve iki sütun aynı yönde hareket etmeyebilir.

Bileşimler ikinci bir şey söyler: kök denetimi bulunduğu her satırda sonucu **12/7'ye sabitler**.
Ona eklenen hiçbir katman sayıyı değiştirmez. Kırılabilen en erken halka sonucu belirlediğinde,
sonraki katmanların envanter üzerindeki katkısı sıfırdır — bu, dördüncü ve beşinci katmanların
gereksiz olduğu anlamına gelmez, kök denetiminin bir uçtan kalkması hâlinde devreye
gireceklerini gösterir.

Tanıtıcı eşlemesi zinciri daha erken kırar: **ikinci adımda**, ad hiç yola çevrilmeden. Geriye
10 kalem ve 5 duyarlılık kalır — kök denetiminden de dar bir küme, çünkü kök altındaki iki
arşiv kalemi eşlemede yer almaz. Bedeli ise başka türdendir: her yeni kalem eşlemeye elle
eklenmelidir; meşru işe bedeli 6 ile kök denetiminin altı katıdır.

#### Bölmenin Ayrı Yeri

Dördüncü çıktı bu dersin ayrımını yapar. Bölme **hiçbir adımı kırmaz**: ad yine istekten
gelir, yine yola birleştirilir, yine kökün dışına düşer, yine okunur ve yine yanıta yazılır.
Zincirin beş adımı da tamamlanır.

Yaptığı şey ölçünün öteki tarafındadır: envanteri 30 kalemden 20'ye, duyarlılığı 41'den 20'ye
indirir. Bir savunma sütununda "kırılan halka" satırı boş kalır, "geç kırmanın bedeli" satırı
yarıya iner. **Zinciri kırmayan bir katman ölçüm dışı değildir; bedeli azaltan katmandır.**

Bu ayrım bu kursun üç sütununun neden ayrı tutulduğunu gösterir. Kırılabilen halka sütunu ile
geç kırmanın bedeli sütunu bağımsız değişebilir: bir katman birincisini iyileştirmeden
ikincisini yarıya indirebilir, bir başkası birincisini iyileştirip ikincisine hiç
dokunmayabilir. Tek sütunla yapılan bir değerlendirme bu iki katmandan birini her zaman
görmez.

Bölme ile dar süreç kimliğinin birlikte kullanıldığı satır ikinci bir bulgu verir: ikisi
birlikte, bölme tek başınayla **aynı sonucu** üretir. Bölmenin içindeki 20 kalemin tamamı zaten
uygulamanın kendi kalemleri ya da herkese okunur kalemlerdir; dar kimlik orada hiçbir kalemi
çıkarmaz. İki katman aynı kümeyi daralttığında ikincisinin katkısı sayıya yansımaz.

#### Uç Başına Kırılma

Üçüncü çıktı altı ucu ölçer. Dört uçta zincir ikinci ya da üçüncü adımda kırılıyor ve
okunabilir kümede kök dışı kalem sayısı **sıfırdır**. Bir uçta zincir dördüncü adımda
kırılıyor ve geriye 24 kalem kalıyor; bunların 12'si kök dışıdır. Bir uçta hiçbir halka
kırılmıyor: 30 kalem, 41 duyarlılık, 18 kök dışı kalem.

İki uç arasındaki fark tek bir katmandır. `rapor.dokum-indir` yalnız dar süreç kimliğini
taşıyor; kök denetimi eklenseydi okunabilir kalem 24'ten 12'ye, duyarlılık 26'dan 7'ye inerdi
ve bunun meşru işe bedeli **1** olurdu. Aynı ölçümde meşru bedeli 9 olan bölme, duyarlılığı
26'dan yalnız 20'ye indirirdi.

Bu karşılaştırma bu dersin pratik sonucudur: en ucuz katman kök denetimidir ve en çok daraltan
katmanın hemen ardında durur — bedeli 1 ile 12 kalem bırakır, ikinci adımda kıran ve bedeli 6 olan
tanıtıcı eşlemesi 10. Bölme ve dar kimlik onun yerine geçmez; onun bir uçta
unutulduğu durumda kalan bedeli sınırlar.

Çıktı sınırının yeri de aynı tabloda okunur. Beşinci adımı kıran bu katman altı uçtan yalnız
birinde dağıtılmış ve bulunduğu uçta zincir zaten üçüncü adımda kırılıyor; yani bu koşumda
hiçbir sayıyı değiştirmiyor. Değeri, kendisinden önceki üç katmanın hepsinin aynı anda
eksik olduğu bir uçta ortaya çıkar — ve tabloda öyle bir uç vardır, ama orada çıktı sınırı da
yoktur. **Katmanların dağıtımı birbirini tamamlayacak biçimde değil, birbirini tekrarlayacak
biçimde yapılmış**; ölçüm bunu tek bakışta göstermez, ancak katman kümeleri uç uç
karşılaştırıldığında görünür.

#### Özet

- Dizin geçişi beş adımlık bir zincirdir ve sınıfın adını taşıyan üçüncü adım tek başına bir
  okuma üretmez; bedeli belirleyen şey dördüncü adımın kapsadığı envanterdir.
- 30 kalemlik kurgu envanterde kök denetimi tek başına okunabilir kalemi 12'ye, duyarlılığı
  7'ye indirir; kalem sayısı %60, duyarlılık %83 azalır.
- Dar süreç kimliği 24 kalem ve 26 duyarlılık bırakır; uygulamanın kök dışındaki kendi
  yapılandırma ve anahtar kalemleri sahiplik ölçütüyle elenmez.
- Tanıtıcı eşlemesi zinciri en erken noktada — ikinci adımda — kırar ve 10 kalem bırakır, ama
  meşru işe bedeli 6 ile kök denetiminin altı katıdır.
- Bölme hiçbir adımı kırmaz; envanteri 30'dan 20 kaleme, duyarlılığı 41'den 20'ye indirir.
  Dar süreç kimliğiyle birlikte kullanıldığında ikinci katman hiçbir kalem çıkarmaz.
- Altı uçtan 1'inde hiçbir halka kırılmıyor (30 kalem, 41 duyarlılık); bir uçta tek bir
  katmanın eklenmesi duyarlılığı 26'dan 7'ye indirirdi ve meşru işe bedeli 1 olurdu.

#### Sonraki Adım

Buraya kadarki dört sınıfın ortak noktası, değerin bir **yorumlayıcıya** verilmesiydi: bir
sorgu ayrıştırıcısına, bir sayfa çözümleyicisine, bir adres çözücüye, bir yol birleştiricisine.
Beşincisinde yorumlayıcı yoktur. Bir değer bellekte, kendisi için ayrılmış alandan büyük olduğu
için komşu alana taşar ve komşu alandaki kalem başka bir şey olur. Sonraki ders bu sınıfı
mantık düzeyinde ölçer: sınırlı bir dizi modelinde taşmanın hangi komşu alanı bozduğu, sınır
denetiminin kaç durumu yakaladığı, hangi dil sınıfının bu adımı ortadan kaldırdığı ve hangi
derleyici ile işletim sistemi denetiminin hangi adımı kırdığı sayılır.

### Arabellek Taşması

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/arabellek-tasmasi

Arabellek taşmasının sınırlı dizi modelinde ölçülmesi: otuz iki baytlık bir bölgede on bir kopyalama uzunluğunun otuz üç komşu alan bozması, koruma değerinin on bir durumun dördünde bozulması, bozulan dönüş etiketinin iki durumun hiçbirinde geçerli kalmaması, sınır denetiminin on bir durumun dokuzunu yakalaması ve altı bileşenin birinde hiçbir halkanın kırılamaması.

Buraya kadarki dört sınıfın ortak noktası, bir değerin bir **yorumlayıcıya** verilmesiydi.
Beşincisinde yorumlayıcı yoktur. Bir değer, kendisi için ayrılmış alandan uzun olduğu için
komşu alana yazılır ve komşu alandaki kalem başka bir şey olur.

Bu ders sınıfı **mantık düzeyinde** ele alır. Ölçülen şey bir taşmanın nasıl yapılacağı değil,
bir bölgede alanların bitişik durmasının hangi sonucu doğurduğu ve hangi denetimin hangi adımı
kestiğidir. Bölge, alan düzeni ve kopyalama bu derste kendi yazılan bir **veri yapısı
modelidir**; gerçek bir bellek düzeni, gerçek bir adres ve hiçbir makine kodu geçmez.

#### Bitişikliğin Sonucu

Bir bölge içindeki alanlar birbirine bitişik durur: her alanın başlangıcı bir öncekinin
bitişidir. Bir alana onun boyundan uzun bir değer yazılırsa, fazla baytlar **bir sonraki
alanın baytlarıdır**. Kopyalama işlemi bunu bilmez; ona verilen tek şey bir başlangıç ve bir
uzunluktur. Sınır denetimi, kopyalamanın hedef alanın boyunu aşıp aşmadığına bakan ve aşıyorsa
işlemi hiç yapmayan adımdır.

Aşağıdaki bölgede yedi alan vardır ve sıraları anlamlıdır: sayaç okuması, tarife kodu ve
yetki bayrağı veri alanlarıdır; koruma değeri bilinen ve sabit bir kalemdir; dönüş etiketi ise
işlevin hangi devam noktasına döneceğini adlandırır. **Bu bir modeldir**: gerçek bir çağrı
kaydının düzeni değil, bitişikliğin sonucunu ölçmek için yazılmış bir dizidir.

**TS22:** bölge sabit boyutludur ve alanlar bitişiktir. **TS23:** sınır denetimi olmayan
kopyalama hedef alanın uzunluğunu değil istenen uzunluğu yazar; bölgenin sonundan taşan bayt
ayrıca sayılır. **TS24:** adım dizisi beş adımdır ve her denetim tek bir adımı kırar.
**TS25:** kopyalanan değer tek bir bayt değeridir; içeriği seçilmemiştir.

```js
// at/bolge.mjs — sinirli dizi modeli: sabit boyutlu bir bolge ve icindeki adlandirilmis
// alanlar. Gercek bir bellek duzeni, gercek bir adres ve hicbir makine kodu yok; bu bir
// veri yapisi modelidir.
export const ALAN = [
  ["ad", 0, 12], ["sayac", 12, 4], ["tarife", 16, 4], ["yetki-bayragi", 20, 1],
  ["dolgu", 21, 3], ["koruma-degeri", 24, 4], ["donus-etiketi", 28, 4],
];
export const BOYUT = 32;
export const GECERLI_ETIKET = [7, 9, 11];   // kurgu: yalnizca bu uc etiket cagrilabilir
export const DOLGU_BAYT = 65;               // kopyalanan degerin tek bir bayt degeri

export function tazeBolge() {
  const b = new Uint8Array(BOYUT);
  b.set([79, 76, 67, 85, 77, 45, 48, 49], 0);   // ad alani: kurgu bir sayac kimligi
  b.set([0, 0, 4, 210], 12);                     // sayac okumasi
  b.set([0, 0, 0, 3], 16);                       // tarife kodu
  b[20] = 0;                                     // yetki bayragi kapali
  b.set([222, 173, 190, 239], 24);               // koruma degeri: sabit ve bilinen
  b.set([0, 0, 0, 7], 28);                       // donus etiketi: gecerli
  return b;
}

export function kopyala(b, alanAdi, uzunluk, sinirDenetimi) {
  const [, bas, boy] = ALAN.find((a) => a[0] === alanAdi);
  if (sinirDenetimi && uzunluk > boy) return { yazilan: 0, tasan: 0, reddedildi: true };
  const yazilacak = Math.min(uzunluk, BOYUT - bas);
  for (let i = 0; i < yazilacak; i++) b[bas + i] = DOLGU_BAYT;
  return { yazilan: yazilacak, tasan: Math.max(0, uzunluk - (BOYUT - bas)), reddedildi: false };
}

export const bozulan = (b) => {
  const t = tazeBolge();
  return ALAN.filter(([, bas, boy]) => {
    for (let i = bas; i < bas + boy; i++) if (b[i] !== t[i]) return true;
    return false;
  }).map(([ad]) => ad);
};

export const etiket = (b) => b[28] * 16777216 + b[29] * 65536 + b[30] * 256 + b[31];
export const korumaBozuk = (b) => bozulan(b).includes("koruma-degeri");

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(""));
```

```js
// at/olcum.mjs — ayni uzunluk kumesi iki kurulusta kosturulur: sinir denetimi olmadan ve
// sinir denetimiyle. Bozulan komsu alanlar sayilir. Rastgelelik yok.
import { ALAN, BOYUT, GECERLI_ETIKET, tazeBolge, kopyala, bozulan, etiket,
  korumaBozuk, yaz } from "./bolge.mjs";

const UZUNLUK = [8, 12, 13, 16, 20, 21, 24, 25, 28, 32, 36];
const adBoyu = ALAN.find((a) => a[0] === "ad")[2];

console.log(`bolge ${BOYUT} bayt, ${ALAN.length} alan; hedef alan "ad" ${adBoyu} bayt`);
console.log(`alan duzeni: ${ALAN.map(([a, b, u]) => `${a}[${b}..${b + u - 1}]`).join(" ")}\n`);

const A = [-9, 9, 8, 9, 16, 10, 10];
console.log("1. sinir denetimi olmadan");
yaz(A, "uzunluk", "yazilan", "tasan", "bozulan", "en uzak bozulan", "koruma", "etiket");
let toplamKomsu = 0, korumaGoren = 0, etiketBozuk = 0, gecerliOlan = 0;
for (const u of UZUNLUK) {
  const b = tazeBolge();
  const r = kopyala(b, "ad", u, false);
  const komsu = bozulan(b).filter((a) => a !== "ad");
  toplamKomsu += komsu.length;
  if (korumaBozuk(b)) korumaGoren++;
  const e = etiket(b);
  if (komsu.includes("donus-etiketi")) {
    etiketBozuk++;
    if (GECERLI_ETIKET.includes(e)) gecerliOlan++;
  }
  yaz(A, u, r.yazilan, r.tasan, komsu.length, komsu.at(-1) ?? "-",
    korumaBozuk(b) ? "bozuldu" : "saglam",
    komsu.includes("donus-etiketi") ? (GECERLI_ETIKET.includes(e) ? "gecerli" : "gecersiz") : "saglam");
}
console.log(`\n${UZUNLUK.length} uzunlukta toplam ${toplamKomsu} komsu alan bozuldu; ` +
  `${UZUNLUK.filter((u) => u > adBoyu).length} uzunluk alan boyunu asiyor`);
console.log(`koruma degerinin bozuldugu durum: ${korumaGoren}/${UZUNLUK.length}; ` +
  `donus etiketinin bozuldugu durum: ${etiketBozuk}, bunlarin ${gecerliOlan} tanesinde ` +
  `etiket gecerli kaldi`);

const B = [-9, 12, 12, 16];
console.log("\n2. sinir denetimiyle ayni kume");
yaz(B, "uzunluk", "sonuc", "bozulan", "yakalanan");
let yakalanan = 0, gecen = 0;
for (const u of UZUNLUK) {
  const b = tazeBolge();
  const r = kopyala(b, "ad", u, true);
  if (r.reddedildi) yakalanan++; else gecen++;
  yaz(B, u, r.reddedildi ? "reddedildi" : "yazildi",
    bozulan(b).filter((a) => a !== "ad").length, r.reddedildi ? "evet" : "hayir");
}
console.log(`sinir denetimi ${UZUNLUK.length} durumun ${yakalanan} tanesini yakaladi, ` +
  `${gecen} tanesi alan icinde kaldigi icin gecti; bozulan komsu alan: 0`);

const ADIM = [
  ["sinir-denetimsiz-kopyalama", "dil ya da cagri uzunlugu denetlemiyor"],
  ["uzunluk-disaridan", "kopyalanacak uzunluk bir girdi alanindan geliyor"],
  ["komsu-alan-bozulmasi", "hedefin komsusunda anlamli bir kalem var"],
  ["karari-belirleyen-alan", "bozulan alan bir bayrak, sayac ya da devam kaydi"],
  ["istenen-dala-gidis", "bozulmus deger gecerli bir dal adi olarak kabul ediliyor"],
];
const DENETIM = [
  ["sinir-denetimli-dil", 1, "dil sinifi", 0],
  ["girdi-uzunluk-sozlesmesi", 2, "uygulama", 2],
  ["derleyici-sinir-denetimi", 3, "derleyici", 5],
  ["koruma-degeri-denetimi", 4, "derleyici", 3],
  ["calistirilamaz-veri-alani", 5, "isletim sistemi", 1],
  ["rastgele-yerlesim", 5, "isletim sistemi", 1],
];
const C = [-27, 9, 18, 8];
console.log("\n3. adim dizisi ve adim-denetim eslemesi");
ADIM.forEach(([a, o], i) => console.log(`  ${i + 1}. ${a.padEnd(28)}onkosul: ${o}`));
yaz(C, "denetim", "kirdigi", "katman", "mesru");
for (const [ad, n, kat, m] of DENETIM) yaz(C, ad, `${n}. adim`, kat, m);

const BILESEN = [
  ["toplayici.surucu", "sinir-denetimsiz", ["derleyici-sinir-denetimi", "koruma-degeri-denetimi",
    "calistirilamaz-veri-alani", "rastgele-yerlesim"]],
  ["toplayici.cozumleyici", "sinir-denetimsiz", ["koruma-degeri-denetimi", "rastgele-yerlesim"]],
  ["sube-ucu.protokol-katmani", "sinir-denetimsiz", ["girdi-uzunluk-sozlesmesi",
    "calistirilamaz-veri-alani"]],
  ["saha-cihazi.gomulu-yazilim", "sinir-denetimsiz", []],
  ["dogrulayici.servis", "sinir-denetimli", []],
  ["fatura-uretimi.servis", "sinir-denetimli", []],
];
const D = [-30, -18, 9, 14, 12];
console.log("\n4. bilesen basina zincir");
yaz(D, "bilesen", "dil sinifi", "denetim", "ilk kirilan", "denetimsiz");
for (const [ad, dil, d] of BILESEN) {
  const kume = dil === "sinir-denetimli" ? ["sinir-denetimli-dil", ...d] : d;
  const kirar = DENETIM.filter(([a]) => kume.includes(a)).map(([, n]) => n);
  const h = kirar.length ? Math.min(...kirar) : 0;
  yaz(D, ad, dil, kume.length, h ? `${h}. adim` : "kirilmiyor",
    ADIM.length - new Set(kirar).size);
}
const acik = BILESEN.filter(([, dil, d]) =>
  dil !== "sinir-denetimli" && d.length === 0).length;
console.log(`hicbir halkasi kirilmayan bilesen: ${acik}; sinir denetimli dil sinifinda ` +
  `zincir birinci adimda kirildigi icin kalan dort adim hic olusmuyor`);
```

```
bolge 32 bayt, 7 alan; hedef alan "ad" 12 bayt
alan duzeni: ad[0..11] sayac[12..15] tarife[16..19] yetki-bayragi[20..20] dolgu[21..23] koruma-degeri[24..27] donus-etiketi[28..31]

1. sinir denetimi olmadan
uzunluk    yazilan   tasan  bozulan en uzak bozulan    koruma    etiket
8                8       0        0               -    saglam    saglam
12              12       0        0               -    saglam    saglam
13              13       0        1           sayac    saglam    saglam
16              16       0        1           sayac    saglam    saglam
20              20       0        2          tarife    saglam    saglam
21              21       0        3   yetki-bayragi    saglam    saglam
24              24       0        4           dolgu    saglam    saglam
25              25       0        5   koruma-degeri   bozuldu    saglam
28              28       0        5   koruma-degeri   bozuldu    saglam
32              32       0        6   donus-etiketi   bozuldu  gecersiz
36              32       4        6   donus-etiketi   bozuldu  gecersiz

11 uzunlukta toplam 33 komsu alan bozuldu; 9 uzunluk alan boyunu asiyor
koruma degerinin bozuldugu durum: 4/11; donus etiketinin bozuldugu durum: 2, bunlarin 0 tanesinde etiket gecerli kaldi

2. sinir denetimiyle ayni kume
uzunluk         sonuc     bozulan       yakalanan
8             yazildi           0           hayir
12            yazildi           0           hayir
13         reddedildi           0            evet
16         reddedildi           0            evet
20         reddedildi           0            evet
21         reddedildi           0            evet
24         reddedildi           0            evet
25         reddedildi           0            evet
28         reddedildi           0            evet
32         reddedildi           0            evet
36         reddedildi           0            evet
sinir denetimi 11 durumun 9 tanesini yakaladi, 2 tanesi alan icinde kaldigi icin gecti; bozulan komsu alan: 0

3. adim dizisi ve adim-denetim eslemesi
  1. sinir-denetimsiz-kopyalama  onkosul: dil ya da cagri uzunlugu denetlemiyor
  2. uzunluk-disaridan           onkosul: kopyalanacak uzunluk bir girdi alanindan geliyor
  3. komsu-alan-bozulmasi        onkosul: hedefin komsusunda anlamli bir kalem var
  4. karari-belirleyen-alan      onkosul: bozulan alan bir bayrak, sayac ya da devam kaydi
  5. istenen-dala-gidis          onkosul: bozulmus deger gecerli bir dal adi olarak kabul ediliyor
denetim                      kirdigi            katman   mesru
sinir-denetimli-dil          1. adim        dil sinifi       0
girdi-uzunluk-sozlesmesi     2. adim          uygulama       2
derleyici-sinir-denetimi     3. adim         derleyici       5
koruma-degeri-denetimi       4. adim         derleyici       3
calistirilamaz-veri-alani    5. adim   isletim sistemi       1
rastgele-yerlesim            5. adim   isletim sistemi       1

4. bilesen basina zincir
bilesen                       dil sinifi          denetim   ilk kirilan  denetimsiz
toplayici.surucu              sinir-denetimsiz          4       3. adim           2
toplayici.cozumleyici         sinir-denetimsiz          2       4. adim           3
sube-ucu.protokol-katmani     sinir-denetimsiz          2       2. adim           3
saha-cihazi.gomulu-yazilim    sinir-denetimsiz          0    kirilmiyor           5
dogrulayici.servis            sinir-denetimli           1       1. adim           4
fatura-uretimi.servis         sinir-denetimli           1       1. adim           4
hicbir halkasi kirilmayan bilesen: 1; sinir denetimli dil sinifinda zincir birinci adimda kirildigi icin kalan dort adim hic olusmuyor
```

#### Bozulmanın Sırası

Birinci çıktı on bir uzunluğu tek tek yürütür ve bozulan komşu alanları sayar. Sonuç
kademelidir: 13 bayt bir alanı bozar, 20 bayt ikisini, 21 bayt üçünü, 25 bayt beşini, 32 bayt
altısını. Toplam 33 komşu alan bozulması vardır ve on bir uzunluğun dokuzu hedef alanın
boyunu aşar.

Sıra rastgele değildir; **alanların bölgedeki dizilişiyle birebir aynıdır**. Bir baytlık bir
aşım en yakın komşuya dokunur, on iki baytlık bir aşım dört komşuya. Bir taşmanın hangi kalemi
bozacağını belirleyen tek şey, o kalemin hedefe olan uzaklığıdır. Bu, savunmanın neden alan
düzenine bakmak zorunda olduğunu açıklar: aynı taşma, farklı bir dizilişte farklı bir kalemi
bozar.

Üç alan ayrı sonuç doğurur. `yetki-bayragi` bir karar alanıdır: bozulduğunda bir dal başka bir
yöne gider. `koruma-degeri` bilinen ve sabit bir kalemdir; bozulduğu anda süreç bunu dönüşten
önce görebilir — on bir durumun **4'ünde** bozuldu. `donus-etiketi` işlevin nereye döneceğini
adlandırır ve iki durumda bozuldu.

Son satır bu dersin en önemli sayısıdır: dönüş etiketinin bozulduğu **iki durumun hiçbirinde**
etiket geçerli kalmadı. Kopyalanan değer tek bir bayt değeriydi ve seçilmemişti; bozulma
gerçekleşti ama sonuç geçerli bir dal adı vermedi. **Bozulma ile denetim akışını yönlendirmek
aynı şey değildir**; ikincisi için gereken adım bu derste ele alınmaz ve alınmayacaktır.
Zincirin beşinci adımı bu yüzden ayrı bir adım olarak yazılır.

#### Sınır Denetiminin Yakaladığı

İkinci çıktı aynı on bir uzunluğu sınır denetimiyle koşturur. Dokuz durum reddedilir, iki durum
geçer — ve geçen ikisi hedef alanın boyunu aşmayan uzunluklardır. Bozulan komşu alan sayısı
**sıfırdır**.

Bu tablonun anlattığı şey, sınır denetiminin karmaşık bir çıkarım yapmadığıdır. Tek bir
karşılaştırma yapar: istenen uzunluk hedef alanın boyundan büyük mü. Bu karşılaştırmanın
maliyeti, zincirin geri kalanının kırılması için gereken denetimlerin yanında ölçülemeyecek
kadar küçüktür.

Buradan çıkan sonuç, üçüncü çıktının birinci satırıdır. Sınır denetimini **dilin kendisi**
yapıyorsa zincir birinci adımda kırılır: sınır denetimi olmayan bir kopyalama diye bir şey
yoktur, sonraki dört adımın önkoşulu hiç oluşmaz ve meşru işe bedeli 0'dır. Dil sınıfının bu
sınıfı ortadan kaldırması, bir denetim eklemesi değil, **birinci adımın önkoşulunu tanımdan
kaldırmasıdır**.

#### Denetimler Hangi Adımı Kırar

Üçüncü çıktı beş adımı ve altı denetimi eşler. Denetimler üç ayrı katmandan gelir ve her biri
farklı bir adıma düşer.

Uygulama katmanındaki uzunluk sözleşmesi **ikinci adımı** kırar: kopyalanacak uzunluk artık
dışarıdan gelmez. Derleyicinin eklediği sınır denetimi **üçüncü adımı** kırar: kopyalama
bölgenin dışına yazamaz. Derleyicinin eklediği koruma değeri denetimi **dördüncü adımı** kırar:
bozulma olur ama dönüşten önce görülür ve süreç durur. İşletim sistemi denetimleri **beşinci
adıma** düşer.

Meşru işe bedelleri farklıdır: dil sınıfı 0, uzunluk sözleşmesi 2, koruma değeri 3, işletim
sistemi denetimleri 1'er, derleyici sınır denetimi 5. En pahalı denetim en erken kıranlardan
biri değildir — **erkenlik ile ucuzluk bu sınıfta birlikte gitmez.**

Dördüncü çıktı altı bileşeni ölçer. İki bileşen sınır denetimli dil sınıfındadır ve zincir
birinci adımda kırılır. Sınır denetimsiz dört bileşenden biri üçüncü, biri dördüncü, biri
ikinci adımda kırılıyor. Biri — gömülü yazılım — **hiçbir adımda kırılmıyor**: beş adımın beşi
de denetimsiz. Derleyici ve işletim sistemi denetimlerinin bulunmadığı bir çalışma ortamında
bu sınıfın tek savunması uygulamanın kendi uzunluk sözleşmesidir ve orada da yoktur.

#### Özet

- Bir bölgede alanlar bitişik durur; hedef alanın boyunu aşan bir kopyalama fazla baytları
  komşu alanların baytlarına yazar. Bozulan alanların sırası, alanların dizilişiyle birebir aynıdır.
- 32 baytlık bölgede 11 uzunluk toplam 33 komşu alan bozdu; 9 uzunluk hedef alanın boyunu aştı.
  Koruma değeri 4 durumda bozuldu, dönüş etiketi 2 durumda.
- Dönüş etiketinin bozulduğu 2 durumun hiçbirinde etiket geçerli kalmadı. Bozulma ile denetim
  akışını yönlendirmek aynı şey değildir ve zincirin beşinci adımı bu yüzden ayrıdır.
- Aynı 11 uzunlukta sınır denetimi 9 durumu reddetti, 2'si alan içinde kaldığı için geçti ve
  bozulan komşu alan sayısı 0 oldu. Denetim tek bir karşılaştırmadan ibarettir.
- Sınır denetimli dil sınıfı zinciri birinci adımda kırar ve meşru işe bedeli 0'dır: sonraki
  dört adımın önkoşulu hiç oluşmaz. Uzunluk sözleşmesi 2., derleyici sınır denetimi 3., koruma
  değeri 4., işletim sistemi denetimleri 5. adımı kırar.
- Altı bileşenden 2'sinde zincir 1. adımda, 3'ünde 2., 3. ya da 4. adımda kırılıyor; 1'inde beş
  adımın beşi de denetimsiz.

#### Sonraki Adım

Bu dersin zincirinde bir alanın sınırı yoktu ve savunma o sınırı koymakla ilgiliydi. Bir sonraki
sınıfta sınır zaten vardır ve saldıran onu **aşmaya değil, altında kalmaya** çalışır: her hesap
için birkaç deneme, her denemede geçerli bir istek. Sonraki ders üç parola saldırısı biçimini
maliyet ve eşik ekseninde ayırır — kilitlemenin kaç biçimi durdurduğu, hesap başına birkaç
deneme yapan bir biçimin kilitlemeyi neden hiç tetiklemediği, hız sınırının kaçıncı denemede
devreye girdiği ve her eşiğin kaç doğru kullanıcıyı dışarıda bıraktığı sayılır.

### Parola Saldırıları

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/parola-saldirilari

Üç parola saldırısı biçiminin maliyet ve eşik ekseninde ayrılması: dört yüz kurgu hesapta kaba kuvvetin yüz doksan, sözlüğün yüz seksen, püskürtmenin on sekiz hesabı düşürmesi, hesap kilitlemenin üç biçimin ikisini durdurup düşen hesabı yüzde seksen yedi azaltması, püskürtmenin hesap başına üç deneme ile kilitleme eşiğini hiç tetiklememesi ve üç biçimi de gören iki eşiğin toplam meşru bedelinin dört olması.

Önceki dersin zincirinde bir alanın sınırı yoktu ve savunma o sınırı koymakla ilgiliydi. Bu
dersin sınıfında sınır zaten vardır: bir kimlik denemesi kabul edilir ya da edilmez, deneme
sayısı sayılır ve bir eşiğe bağlanır. Saldıran sınırı aşmaya değil, **altında kalmaya** çalışır.

Üç biçim ayrılır. **Kaba kuvvet** tek bir hesaba çok sayıda aday dener. **Sözlük** aynı şeyi
daha kısa ve daha olası bir aday dizisiyle yapar. **Püskürtme** ise tersine döner: çok sayıda
hesaba, her birine yalnız birkaç aday dener. Üçü de aynı zinciri kullanır, ama eşik karşısındaki
davranışları farklıdır ve bu ders o farkı sayar. Hiçbir parola, aday listesi ya da deneme
betiği yazılmaz; her hesabın parolası yalnız **sıralı bir aday dizisinde kaçıncı sırada olduğu**
sayısıyla temsil edilir.

#### Zincirin Altı Adımı

1. **Geçerli kullanıcı adı kümesi.** Önkoşul: hesap adları biliniyor ya da öğrenilebiliyor.
2. **Deneme kanalı açık.** Önkoşul: uç kimlik denemesi kabul ediyor.
3. **Deneme bütçesi eşiğin altında kalıyor.** Önkoşul: kullanılan ölçekte sayan bir eşik bu
   hızı görmüyor.
4. **Doğru eşleşme bulunuyor.** Önkoşul: parola, bütçenin kapsadığı aday aralığında.
5. **İkinci etmen istenmiyor.** Önkoşul: hesapta ikinci bir doğrulama etmeni tanımlı değil.
6. **Oturum kuruluyor ve kullanılıyor.** Önkoşul: oturum davranışı üzerinde bir denetim yok.

Üçüncü adım bu dersin ölçtüğü adımdır ve tek bir eşiğe değil, eşiğin **ölçeğine** bağlıdır.
Aynı eşik değeri, hesap başına sayıldığında bir biçimi durdurur, kaynak başına sayıldığında
başkasını.

Beşinci ve altıncı adımlar ölçümün dışında tutulur ama zincirin parçasıdır. İkinci bir
doğrulama etmeni tanımlıysa dördüncü adım tamamlansa bile zincir beşinci adımda kırılır:
doğru parola bulunmuştur ve hiçbir işe yaramaz. Oturum davranışı üzerindeki bir denetim ise
altıncı adımı kırar; orada zincir tamamlanmıştır ve ölçü tespite kaymıştır. Bu iki adım,
üçüncü adımın hiç kırılamadığı durumlarda geriye kalan tek savunmadır — ve bu dersin bütün
sayıları onlar yokmuş gibi hesaplanır, çünkü ölçülen şey eşiğin kendisidir.

**TS26:** hesap kümesi kurgudur; `sira`, parolanın sıralı aday dizisindeki yeridir. **TS27:** üç
eşik üç ayrı ölçekte sayar. **TS28:** üç biçim yalnızca iki sayıyla ayrılır — kaç hesaba
dokunduğu ve hesap başına kaç deneme yaptığı. **TS29:** süre, hız sınırının izin verdiği azami
hızda hesaplanır.

```js
// ps/model.mjs — parola saldirisi maliyet modeli. Hicbir parola, sozluk ya da deneme
// betigi yok; her hesabin parolasi yalnizca "sirali bir aday dizisinde kacinci sirada
// oldugu" sayisiyla temsil edilir.
export const HESAP_SAYISI = 400;

// Kendi yazilan uretec; tohum gorunur, kosumdan kosuma ayni sonucu verir.
function uretec(tohum) {
  let s = tohum >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296;
}

export const KOVA = [[24, 1, 5], [60, 6, 500], [96, 501, 50000], [40, 50001, 5000000]];

export function hesaplar(tohum = 20260802) {
  const r = uretec(tohum);
  const h = [];
  for (const [adet, alt, ust] of KOVA)
    for (let i = 0; i < adet; i++) h.push({ sira: alt + Math.floor(r() * (ust - alt + 1)) });
  while (h.length < HESAP_SAYISI) h.push({ sira: Infinity });
  return h;
}

// mesru = kurgu gunluk yanlis kalma (dogru kullanicinin engellenmesi).
export const ESIK = [
  { ad: "hesap-kilitleme", olcek: "hesap", limit: 5, mesru: 30 },
  { ad: "kaynak-hiz-siniri", olcek: "kaynak", limit: 60, mesru: 4 },
  { ad: "genel-oran-esigi", olcek: "sistem", limit: 200, mesru: 0 },
];

export const BICIM = [
  { ad: "kaba-kuvvet", hesap: 1, butce: 1000000 },
  { ad: "sozluk", hesap: 1, butce: 50000 },
  { ad: "puskurtme", hesap: HESAP_SAYISI, butce: 3 },
];

export const sure = (deneme) => {
  const dk = deneme / ESIK[1].limit;
  return dk < 1 ? `${(dk * 60).toFixed(0)} sn` : dk < 60 ? `${dk.toFixed(0)} dk`
    : dk < 1440 ? `${(dk / 60).toFixed(1)} sa`
    : `${(dk / 1440).toFixed(1)} gun`;
};

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(""));
```

```js
// ps/olcum.mjs — uc bicim uc esik altinda kosturulur: hesap basina kac deneme, hangi esik
// kacinci denemede devreye giriyor, kac hesap dusuyor ve ne kadar surede. Rastgelelik
// uretecten gelir, tohum gorunurdur; kosumdan kosuma ayni sonuc cikar.
import { HESAP_SAYISI, hesaplar, ESIK, BICIM, sure, yaz } from "./model.mjs";

const H = hesaplar();
const kova = (h) => h.sira <= 5 ? "ilk 5" : h.sira <= 500 ? "ilk 500"
  : h.sira <= 50000 ? "ilk 50.000" : h.sira <= 5000000 ? "ilk 5.000.000" : "butce disi";
const KOVALAR = ["ilk 5", "ilk 500", "ilk 50.000", "ilk 5.000.000", "butce disi"];

console.log(`${HESAP_SAYISI} kurgu hesap, ${BICIM.length} bicim, ${ESIK.length} esik\n`);

const A = [-16, 9, 9];
console.log("1. hesaplarin aday dizisindeki dagilimi");
yaz(A, "kova", "hesap", "pay");
for (const k of KOVALAR) {
  const n = H.filter((h) => kova(h) === k).length;
  yaz(A, k, n, `%${((n / HESAP_SAYISI) * 100).toFixed(1)}`);
}

// Bir esik bicimi gorur mu: hesap olcegi hesap basina, kaynak ve sistem olcegi toplam
// deneme uzerinden sayar.
const gorur = (b, e) => (e.olcek === "hesap" ? b.butce : b.hesap * b.butce) > e.limit;

const B = [-13, 8, 15, 16, 16, 20];
console.log("\n2. bicim basina esik davranisi");
yaz(B, "bicim", "hesap", "hesap basina", "toplam deneme", "kilitleme", "ilk goren esik");
for (const b of BICIM) {
  const goren = ESIK.filter((e) => gorur(b, e));
  yaz(B, b.ad, b.hesap, b.butce, b.hesap * b.butce,
    gorur(b, ESIK[0]) ? `${ESIK[0].limit}. denemede` : "tetiklenmiyor",
    goren.length ? goren[0].ad : "yok");
}

// Her bicim her hesabi sirayla hedef alsaydi kac hesap duserdi.
const dusen = (b, kilitVar) => {
  const butce = kilitVar ? Math.min(b.butce, ESIK[0].limit) : b.butce;
  return H.filter((h) => h.sira <= butce).length;
};

const C = [-13, 14, 15, 20, 8, 20];
console.log("\n3. hedef alinan hesaplardan kaci duser");
yaz(C, "bicim", "kilitleme yok", "kilitleme var", "kilitlemenin farki", "fark", "hesap basina sure");
for (const b of BICIM) {
  const y = dusen(b, false), v = dusen(b, true);
  yaz(C, b.ad, `${y}/${HESAP_SAYISI}`, `${v}/${HESAP_SAYISI}`, y - v,
    `%${(((y - v) / Math.max(y, 1)) * 100).toFixed(0)}`, sure(b.butce));
}
console.log(`kilitlemenin dusen hesap sayisini azalttigi bicim: ` +
  `${BICIM.filter((b) => dusen(b, false) > dusen(b, true)).length}/${BICIM.length}`);

const p = BICIM[2];
const D = [-18, 10, 10, 18];
console.log("\n4. puskurtmeyi hangi esik gorur");
yaz(D, "esik", "olcek", "limit", "gorur mu");
for (const e of ESIK)
  yaz(D, e.ad, e.olcek, e.limit, gorur(p, e) ? `${e.limit}. denemede` : "gormuyor");
console.log(`puskurtme hesap basina ${p.butce} deneme yapar; kilitleme esigi ${ESIK[0].limit} ` +
  `oldugu icin hicbir hesapta tetiklenmez. Toplam ${p.hesap * p.butce} deneme oran esigini ` +
  `${(p.hesap * p.butce / ESIK[2].limit).toFixed(1)} kat asar, suresi ${sure(p.hesap * p.butce)}`);

const E = [-18, 9, 12, 34];
console.log("\n5. esiklerin mesru bedeli");
yaz(E, "esik", "mesru", "goren bicim", "gordugu bicimler");
for (const e of ESIK) {
  const g = BICIM.filter((b) => gorur(b, e));
  yaz(E, e.ad, e.mesru, `${g.length}/${BICIM.length}`, g.map((b) => b.ad).join(",") || "-");
}
console.log(`toplam mesru bedel ${ESIK.reduce((t, e) => t + e.mesru, 0)} kurgu kalem/gun; ` +
  `uc bicimi de goren iki esigin toplam bedeli ${ESIK[1].mesru + ESIK[2].mesru}`);
```

```
400 kurgu hesap, 3 bicim, 3 esik

1. hesaplarin aday dizisindeki dagilimi
kova                hesap      pay
ilk 5                  24     %6.0
ilk 500                60    %15.0
ilk 50.000             96    %24.0
ilk 5.000.000          40    %10.0
butce disi            180    %45.0

2. bicim basina esik davranisi
bicim           hesap   hesap basina   toplam deneme       kilitleme      ilk goren esik
kaba-kuvvet         1        1000000         1000000     5. denemede     hesap-kilitleme
sozluk              1          50000           50000     5. denemede     hesap-kilitleme
puskurtme         400              3            1200   tetiklenmiyor   kaynak-hiz-siniri

3. hedef alinan hesaplardan kaci duser
bicim         kilitleme yok  kilitleme var  kilitlemenin farki    fark   hesap basina sure
kaba-kuvvet         190/400         24/400                 166     %87            11.6 gun
sozluk              180/400         24/400                 156     %87             13.9 sa
puskurtme            18/400         18/400                   0      %0                3 sn
kilitlemenin dusen hesap sayisini azalttigi bicim: 2/3

4. puskurtmeyi hangi esik gorur
esik                   olcek     limit          gorur mu
hesap-kilitleme        hesap         5          gormuyor
kaynak-hiz-siniri     kaynak        60      60. denemede
genel-oran-esigi      sistem       200     200. denemede
puskurtme hesap basina 3 deneme yapar; kilitleme esigi 5 oldugu icin hicbir hesapta tetiklenmez. Toplam 1200 deneme oran esigini 6.0 kat asar, suresi 20 dk

5. esiklerin mesru bedeli
esik                  mesru goren bicim                  gordugu bicimler
hesap-kilitleme          30         2/3                kaba-kuvvet,sozluk
kaynak-hiz-siniri         4         3/3      kaba-kuvvet,sozluk,puskurtme
genel-oran-esigi          0         3/3      kaba-kuvvet,sozluk,puskurtme
toplam mesru bedel 34 kurgu kalem/gun; uc bicimi de goren iki esigin toplam bedeli 4
```

#### İki Sayı, Üç Biçim

İkinci çıktı üç biçimi yalnız iki sayıyla ayırır: kaç hesaba dokunuyor, hesap başına kaç
deneme yapıyor. Kaba kuvvet 1 hesap ve 1.000.000 deneme; sözlük 1 hesap ve 50.000; püskürtme
400 hesap ve **3** deneme.

Toplam deneme sayısı sıralamayı tersine çevirmez ama yanıltıcıdır: püskürtmenin toplamı
1.200'dür ve kaba kuvvetin binde 1,2'sidir. Buna karşılık kaba kuvvet tek bir hesabı
hedefler, püskürtme dört yüzünü. **Bir saldırı biçimini toplam deneme sayısıyla anmak, hangi
eşiğin onu göreceğini söylemez.**

Kilitleme sütunu farkı doğrudan verir. Kaba kuvvet ve sözlük beşinci denemede kilitlemeye
takılır; püskürtme hiç takılmaz. Nedeni tek bir karşılaştırmadır: kilitleme **hesap başına**
sayar ve püskürtmenin hesap başına deneme sayısı eşiğin altındadır. Eşiği 5'ten 3'e indirmek
de yetmez; püskürtme bütçesini 2'ye indirir ve yine altta kalır. **Hesap ölçeğinde sayan bir
eşik, hesap ölçeğinde küçük kalan bir biçimi tanım gereği görmez.**

#### Kaç Hesap Düşüyor

Üçüncü çıktı her biçimin bütün hesapları sırayla hedef alması durumunu ölçer. Kilitleme
yokken kaba kuvvet 400 hesabın 190'ını, sözlük 180'ini, püskürtme 18'ini düşürür. Kilitleme
varken üç biçimin de hesap başına bütçesi 5'e iner: kaba kuvvet ve sözlük **24 hesaba** düşer,
püskürtme **18'de kalır**.

Kilitlemenin farkı ilk iki biçimde 166 ve 156 hesaptır — düşen hesap sayısının **%87'si**.
Püskürtmede fark sıfırdır. Bu iki sayının yan yana durması bu dersin sonucudur: aynı eşik, iki
biçimde savunmanın en güçlü kalemi, üçüncüde hiçbir şeydir.

Kilitleme altında üç biçimin de aynı sayıya yaklaşması ayrıca dikkat çekicidir: 24, 24 ve 18.
Hesap başına bütçe beşe indiğinde biçimler arasındaki bütün fark silinir, çünkü fark bütçenin
kendisinden geliyordu. Kilitleme bir saldırı biçimini değil, **bütçeyi** hedefler; bu yüzden
bütçesi zaten küçük olan biçim üzerinde hiçbir etkisi olmaz.

Süre sütunu maliyetin öteki yüzünü verir. Hız sınırının izin verdiği azami hızda kaba kuvvet
tek bir hesap için **11,6 gün**, sözlük **13,9 saat**, püskürtme **3 saniye** sürer. Püskürtme
yalnız kilitlemeden kaçmakla kalmaz; on sekiz hesabı, kaba kuvvetin bir hesap için harcadığı
sürenin milyonda üçünde düşürür.

Sürenin kendisi de bir savunma değildir, bir **bütçe kısıtıdır**. On bir günlük bir koşum
boyunca hiçbir eşik devreye girmese bile, o süre boyunca denemenin sürdürülebilir olması
gerekir: bağlantının açık kalması, kaynağın engellenmemesi, hesabın silinmemesi. Hız
sınırının asıl işlevi bu bütçeyi büyütmektir; düşen hesap sayısını doğrudan azaltmaz, düşme
için gereken süreyi uzatır ve bu süre boyunca tespitin çalışması için yer açar.

Birinci çıktı bu farkın nereden geldiğini söyler. Hesapların %6'sı ilk beş adayın içindedir,
%45'i hiçbir bütçede bulunamaz. Bütçeyi 50.000'den 1.000.000'a çıkarmak düşen hesabı 180'den
yalnız 190'a taşır — **yirmi kat bütçe, on hesap**. Aday dizisinin başındaki birkaç kalem, geri
kalan her şeyden fazlasını verir; püskürtmenin dayandığı gözlem budur.

#### Eşiğin Ölçeği ve Bedeli

Dördüncü çıktı püskürtmeyi üç eşiğe ayrı ayrı sorar. Hesap ölçeğinde sayan eşik görmez.
Kaynak ölçeğinde sayan eşik 60. denemede, sistem ölçeğinde sayan eşik 200. denemede görür.
Toplam 1.200 deneme oran eşiğini altı kat aşar ve azami hızda 20 dakika sürer.

Bu, ölçünün nereye taşındığını gösterir: püskürtme karşısında zincir üçüncü adımda
kırılmayabilir, ama **görülür**. Kırılamayan halkada ölçü tespite kayar ve tespitin birimi
denemedir: eşiğin altında kaç deneme geçtiği, alarm çalana kadar kaç hesabın denendiği.

Beşinci çıktı bedeli yazar. Hesap kilitlemenin meşru işe bedeli günde 30 kurgu kalemdir ve üç
biçimin ikisini görür. Kaynak hız sınırının bedeli 4'tür ve üçünü de görür. Oran eşiğinin
bedeli **0'dır** ve üçünü de görür — çünkü hiçbir isteği reddetmez, yalnız sayar ve bildirir.

Üç eşiğin toplam bedeli 34, üç biçimi de gören iki eşiğin toplam bedeli **4'tür**. Kapsamı en
geniş iki kalem, bedelin sekizde birini taşır. Bu, kilitlemenin gereksiz olduğu anlamına
gelmez: kilitleme düşen hesabı 190'dan 24'e indiren tek kalemdir. Anlamı, kapsamın ve bedelin
**aynı kalemde toplanmadığıdır** — ve bir savunma kümesi ikisini ayrı ayrı yazmadan
değerlendirilemez.

Bedeli sıfır olan eşiğin ayrı bir yeri vardır ve bu kursun ölçüsünde adı konmalıdır: o eşik
hiçbir halkayı **kırmaz**. Hiçbir isteği reddetmediği için üçüncü adımın önkoşulunu ortadan
kaldırmaz; yalnız sayar. Bir savunma listesinde onu "üç biçimi de gören eşik" diye yazmak
doğrudur, "üç biçimi de durduran eşik" diye yazmak değildir. İki cümle arasındaki fark, bu
kursun kırılan halka ile tespit arasında koyduğu ayrımın tam kendisidir: sayan bir kalem
zinciri kısaltmaz, yalnız zincirin görüldüğü noktayı öne çeker.

#### Özet

- Üç biçim yalnız iki sayıyla ayrılır: kaç hesaba dokunduğu ve hesap başına kaç deneme
  yaptığı. Kaba kuvvet 1 hesap/1.000.000 deneme, sözlük 1/50.000, püskürtme 400/3.
- Hesap kilitleme kaba kuvvet ve sözlüğü beşinci denemede durdurur; püskürtmeyi hiç görmez,
  çünkü hesap ölçeğinde sayar ve püskürtmenin hesap başına bütçesi eşiğin altındadır.
- Kilitleme düşen hesabı 190'dan ve 180'den 24'e indirir (%87 azalma), püskürtmede farkı 0'dır.
- Azami hızda kaba kuvvet tek hesap için 11,6 gün, sözlük 13,9 saat, püskürtme 18 hesap için
  3 saniye sürer. Bütçeyi 50.000'den 1.000.000'a çıkarmak düşen hesabı yalnız 10 artırır.
- Püskürtmeyi kaynak ölçeğinde sayan eşik 60., sistem ölçeğinde sayan eşik 200. denemede görür;
  toplam 1.200 deneme oran eşiğini 6 kat aşar. Kırılamayan halkada ölçü tespite kayar.
- Üç eşiğin toplam meşru bedeli 34 kurgu kalem/gündür; üç biçimi de gören iki eşiğin toplamı
  4'tür. Kapsam ile bedel aynı kalemde toplanmaz ve bedeli sıfır olan eşik hiçbir halkayı
  kırmaz, yalnız sayar.

#### Sonraki Adım

Buraya kadarki altı sınıfta zincir her zaman saldıranın bir isteğiyle başladı: bir alan
dolduruldu, bir bağlantı gönderildi, bir deneme yapıldı. Bir sonraki sınıfta ilk adımı kurban
atar ve yaptığı şey olağandır — bir sayfayı açar. Sonraki ders bu sınıfı **önkoşul zinciri**
olarak sayar: kaç koşulun aynı anda tutması gerektiği, koşullardan biri düştüğünde geriye kaç
bileşimin kaldığı ve hangi tarayıcı ile ağ denetiminin kaç koşulu birden kırdığı ölçülür.

### Drive-by İndirmeler

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/surukle-birak-indirmeleri

Tarayıcı üzerinden bulaşmanın önkoşul zinciri olarak sayılması: altı yüz kurgu uç noktada altı koşulun altısının aynı anda yalnız yirmi ikisinde tutması, dördüncü koşula kadar tutan yetmiş üç uçta kalemin diske yazılmış olması, tek başına en etkili savunmanın kalanı bire indirmesi, iki koşulu birden kıran savunmanın kapsam darlığı yüzünden en zayıf kalması ve iki savunmanın dokuz meşru bedelle sağladığı sonuca yedi savunmanın elli beş bedelle ulaşması.

Buraya kadarki yedi sınıfta zincir her zaman saldıranın bir isteğiyle başladı: bir alan
dolduruldu, bir bağlantı gönderildi, bir deneme yapıldı. Bu sınıfta ilk adımı **kurban** atar
ve yaptığı şey olağandır — bir sayfayı açar.

Drive-by indirme tek bir adımın adı değildir; birbirinden bağımsız birkaç koşulun aynı
anda tutmasının adıdır. Bu yüzden bu ders zinciri bir **VE dizisi** olarak sayar: altı koşulun
altısı da tutmazsa hiçbir şey olmaz. Ölçüm bir kurgu uç nokta filosu üzerinde yürür; hiçbir
bulaşma adımı, hiçbir sayfa ve hiçbir bileşen adı yazılmaz.

#### Altı Koşul

1. **Sayfaya ulaşma.** Kullanıcı, üzerinde saldıranın denetimindeki içerik bulunan bir sayfayı
   açar. Önkoşul: o sayfaya bir yol var.
2. **Üçüncü taraf içerik.** Sayfa, kendi kökeninin dışından içerik yükleyebiliyor. Önkoşul:
   kaynak kısıtı yok.
3. **Açık kalmış bileşen.** Yükleyici bileşende düzeltilmemiş bir kalem var. Önkoşul: tarayıcı
   ya da eklenti güncel değil.
4. **Onaysız yazma.** Bir kalem kullanıcı onayı olmadan diske yazılabiliyor. Önkoşul: indirme
   kendiliğinden tamamlanıyor.
5. **Çalıştırılabilirlik.** Yazılan kalem çalıştırılabiliyor. Önkoşul: uygulama izin listesi yok.
6. **Korumanın görmemesi.** Uç nokta koruması kalemi durdurmuyor. Önkoşul: imza ya da davranış
   karşılığı yok.

Bir VE zinciri savunma için elverişlidir: **tek bir koşulu düşürmek yeter**. Zorluk koşulun
seçiminde değil, savunmanın filonun ne kadarına ulaştığındadır. Bu ders o iki sayıyı — kırılan
koşul ve kapsam — birlikte ölçer.

Koşulların hepsi aynı tarafa ait de değildir. Birinci ve ikinci koşul ağ ile sayfanın kendi
yapılandırmasına, üçüncü ve beşinci koşul uç noktanın yazılım durumuna, dördüncü koşul
tarayıcının davranışına, altıncı koşul koruma yazılımına aittir. Bu dağılım bir kurumda bu
sınıfın neden tek bir ekibin sorumluluğuna verilemeyeceğini gösterir: altı koşul dört ayrı
yönetim alanına dağılmıştır ve hiçbiri ötekinin sayısını göremez.

**TS30:** zincir bir VE dizisidir; `oran`, kurgu filoda o koşulun tuttuğu uç noktaların
payıdır. **TS31:** her savunma bir ya da iki koşulu kırar; `kapsam`, dağıtıldığı uç noktaların
payıdır. **TS32:** dördüncü koşuldan sonra kalem diske yazılmış sayılır; erken kırmanın sınırı
üçüncü koşuldur.

```js
// sb/filo.mjs — tarayici uzerinden bulasmanin onkosul zinciri (model). Gercek bir sayfa,
// gercek bir bilesen ve hicbir bulasma adimi yok; her uc nokta yalnizca kosullarin ve
// savunmalarin durumunu tasiyan bir bit vektorudur.
export const UC_SAYISI = 600;

export const KOSUL = [
  { ad: "sayfaya-ulasma",       oran: 0.60 },
  { ad: "ucuncu-taraf-icerik",  oran: 0.75 },
  { ad: "acik-kalmis-bilesen",  oran: 0.40 },
  { ad: "onaysiz-yazma",        oran: 0.60 },
  { ad: "calistirilabilirlik",  oran: 0.80 },
  { ad: "korumanin-gormemesi",  oran: 0.35 },
];

export const SAVUNMA = [
  { ad: "ad-cozumleme-suzgeci", kirar: [0], kapsam: 0.85, mesru: 5 },
  { ad: "icerik-politikasi",    kirar: [1], kapsam: 0.60, mesru: 7 },
  { ad: "otomatik-guncelleme",  kirar: [2], kapsam: 0.75, mesru: 3 },
  { ad: "indirme-onayi",        kirar: [3], kapsam: 0.80, mesru: 9 },
  { ad: "uygulama-izin-listesi", kirar: [4], kapsam: 0.45, mesru: 14 },
  { ad: "uc-nokta-koruma",      kirar: [5], kapsam: 0.90, mesru: 6 },
  { ad: "tarayici-yalitimi",    kirar: [2, 4], kapsam: 0.30, mesru: 11 },
];

function uretec(tohum) {
  let s = tohum >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296;
}

// Filo bir kez uretilir; tohum gorunur, kosumdan kosuma ayni sonuc cikar.
export function filo(tohum = 20260803) {
  const r = uretec(tohum);
  const f = [];
  for (let i = 0; i < UC_SAYISI; i++) {
    const k = KOSUL.map((x) => r() < x.oran);
    const s = SAVUNMA.map((x) => r() < x.kapsam);
    f.push({ k, s });
  }
  return f;
}

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(""));
```

```js
// sb/olcum.mjs — alti kosulun kac uc noktada ayni anda tuttugu ve her savunmanin bu sayiyi
// nereye indirdigi. Rastgelelik uretecten gelir, tohum gorunurdur.
import { UC_SAYISI, KOSUL, SAVUNMA, filo, yaz } from "./filo.mjs";

const F = filo();
// Bir uc noktada n. kosul, dagitilan savunmalardan biri onu kirmiyorsa tutar.
const tutar = (u, i, kume) => u.k[i] &&
  !SAVUNMA.some((s, j) => kume.includes(s.ad) && u.s[j] && s.kirar.includes(i));
const tamZincir = (u, kume) => KOSUL.every((_, i) => tutar(u, i, kume));
const nKosul = (u, kume, n) => KOSUL.slice(0, n).every((_, i) => tutar(u, i, kume));
const say = (kume, f) => F.filter((u) => f(u, kume)).length;

console.log(`${UC_SAYISI} kurgu uc nokta, ${KOSUL.length} kosul, ${SAVUNMA.length} savunma\n`);

const A = [-22, 10, 10, 14];
console.log("1. kosul basina tutan uc nokta");
yaz(A, "kosul", "hedef oran", "tutan uc", "buraya kadar");
for (const [i, k] of KOSUL.entries())
  yaz(A, k.ad, k.oran.toFixed(2), F.filter((u) => u.k[i]).length,
    say([], (u) => nKosul(u, [], i + 1)));
const taban = say([], tamZincir);
console.log(`alti kosulun altisi da ${taban} uc noktada tutuyor ` +
  `(%${((taban / UC_SAYISI) * 100).toFixed(1)}); dorduncu kosula kadar tutan ` +
  `${say([], (u) => nKosul(u, [], 4))} uc noktada kalem diske yazilmis olur`);

const B = [-22, 12, 12, 14, 10];
console.log("\n2. tek savunma dagitildiginda");
yaz(B, "savunma", "kirdigi", "kapsam", "kalan uc", "mesru");
for (const s of SAVUNMA)
  yaz(B, s.ad, s.kirar.map((i) => i + 1).join(","), s.kapsam.toFixed(2),
    say([s.ad], tamZincir), s.mesru);
console.log(`hicbir savunma yokken kalan uc: ${taban}`);

const C = [-22, 12, 12, 18, 12];
console.log("\n3. en cok azaltandan baslayarak birikimli");
yaz(C, "eklenen savunma", "kalan uc", "azalma", "birikimli mesru", "kalan %");
let kume = [], mesru = 0;
while (kume.length < SAVUNMA.length) {
  const aday = SAVUNMA.filter((s) => !kume.includes(s.ad))
    .map((s) => ({ s, kalan: say([...kume, s.ad], tamZincir) }))
    .sort((a, b) => a.kalan - b.kalan || a.s.mesru - b.s.mesru)[0];
  const once = say(kume, tamZincir);
  kume.push(aday.s.ad); mesru += aday.s.mesru;
  yaz(C, aday.s.ad, aday.kalan, once - aday.kalan, mesru,
    `%${((aday.kalan / taban) * 100).toFixed(1)}`);
}

const SONUC = ["iz yok", "iz yok", "iz yok", "kalem diske yazildi",
  "kalem calisti", "koruma gormedi"];
const D = [-8, 18, 18, -24];
console.log("\n4. gec kirmanin bedeli (savunmasiz filoda)");
yaz(D, "kosul", "buraya kadar tutan", "bu kosulda dusen", "  asamanin sonucu");
for (let n = 1; n <= KOSUL.length; n++) {
  const tut = say([], (u) => nKosul(u, [], n));
  yaz(D, `${n}.`, tut, say([], (u) => nKosul(u, [], n - 1)) - tut, `  ${SONUC[n - 1]}`);
}
console.log(`dorduncu kosuldan sonra kalem diske yazilmistir: erken kirmanin siniri ` +
  `ucuncu kosuldur (${say([], (u) => nKosul(u, [], 3))} uc nokta)`);
console.log(`tam kurulusta kalan uc: ${say(SAVUNMA.map((s) => s.ad), tamZincir)}, ` +
  `dorduncu kosula kadar tutan: ` +
  `${say(SAVUNMA.map((s) => s.ad), (u, q) => nKosul(u, q, 4))}`);
```

```
600 kurgu uc nokta, 6 kosul, 7 savunma

1. kosul basina tutan uc nokta
kosul                 hedef oran  tutan uc  buraya kadar
sayfaya-ulasma              0.60       362           362
ucuncu-taraf-icerik         0.75       440           262
acik-kalmis-bilesen         0.40       241           118
onaysiz-yazma               0.60       362            73
calistirilabilirlik         0.80       482            63
korumanin-gormemesi         0.35       221            22
alti kosulun altisi da 22 uc noktada tutuyor (%3.7); dorduncu kosula kadar tutan 73 uc noktada kalem diske yazilmis olur

2. tek savunma dagitildiginda
savunma                    kirdigi      kapsam      kalan uc     mesru
ad-cozumleme-suzgeci             1        0.85             5         5
icerik-politikasi                2        0.60            10         7
otomatik-guncelleme              3        0.75             5         3
indirme-onayi                    4        0.80             6         9
uygulama-izin-listesi            5        0.45            10        14
uc-nokta-koruma                  6        0.90             1         6
tarayici-yalitimi              3,5        0.30            16        11
hicbir savunma yokken kalan uc: 22

3. en cok azaltandan baslayarak birikimli
eklenen savunma           kalan uc      azalma   birikimli mesru     kalan %
uc-nokta-koruma                  1          21                 6        %4.5
otomatik-guncelleme              0           1                 9        %0.0
ad-cozumleme-suzgeci             0           0                14        %0.0
icerik-politikasi                0           0                21        %0.0
indirme-onayi                    0           0                30        %0.0
tarayici-yalitimi                0           0                41        %0.0
uygulama-izin-listesi            0           0                55        %0.0

4. gec kirmanin bedeli (savunmasiz filoda)
kosul   buraya kadar tutan  bu kosulda dusen  asamanin sonucu
1.                     362               238  iz yok
2.                     262               100  iz yok
3.                     118               144  iz yok
4.                      73                45  kalem diske yazildi
5.                      63                10  kalem calisti
6.                      22                41  koruma gormedi
dorduncu kosuldan sonra kalem diske yazilmistir: erken kirmanin siniri ucuncu kosuldur (118 uc nokta)
tam kurulusta kalan uc: 0, dorduncu kosula kadar tutan: 0
```

#### Altı Koşulun Kesişimi

Birinci çıktı koşulları tek tek ve birikimli olarak sayar. Tek tek bakıldığında hiçbir koşul
seyrek değildir: en dar koşul 600 uç noktanın 221'inde, en geniş koşul 482'sinde tutuyor.
Birikimli sütun ise hızla iner: 362, 262, 118, 73, 63 ve sonunda **22**.

Birikimli sütunun ilk satırı ile son satırı arasındaki oran on altı kattır. Bu düşüşün her
adımı bir çarpımdır ve çarpanların hiçbiri sıfıra yakın değildir; sonucu küçük yapan şey
çarpanların **sayısıdır**. Bir koşulun oranını yarıya indirmek sonucu da yarıya indirir, ama
bir koşulu tamamen kaldırmak sonucu sıfırlar — VE zincirinde bu iki hamle arasındaki fark
niceliksel değil, niteliksel bir farktır.

Filonun **%3,7'sinde** altı koşulun altısı da aynı anda tutuyor. Bu sayı sınıfın neden hem
yaygın hem de seyrek göründüğünü açıklar. Her koşul tek başına sıradandır; sıra dışı olan
kesişimdir. Bir raporda "uç noktaların %40'ında güncel olmayan bir bileşen var" cümlesi doğru
olabilir ve bu sınıfın büyüklüğü hakkında hiçbir şey söylemez.

İlk koşuldan sonraki en büyük düşüş üçüncüdedir: 262'den 118'e. Açık kalmış bileşen koşulu,
zincirin ortasında kesişimi en çok daraltan kalemdir; nedeni, görece düşük bir oranın hâlâ büyük
olan bir kalana uygulanmasıdır. **VE zincirinde en dar koşul
sonucu belirler** — ve savunma açısından bu, en dar koşulu daha da daraltmanın en verimli
hamle olduğu anlamına gelir.

#### Kırılan Koşul ve Kapsam

İkinci çıktı her savunmayı tek başına dağıtır. Sonuçlar 1 ile 16 arasında değişir ve sıralama
kırılan koşulun sırasıyla ilgili değildir; **kapsamla ilgilidir.**

Uç nokta koruması kalanı 22'den **1'e** indirir: kapsamı 0,90'dır ve kırdığı koşul zaten
seyrektir. Ad çözümleme süzgeci 5'e, otomatik güncelleme 5'e, indirme onayı 6'ya indirir.
Uygulama izin listesi 10'da kalır çünkü kapsamı 0,45'tir.

Son satır bu çıktının en dikkat çekici sonucudur. Tarayıcı yalıtımı **iki koşulu birden kırar**
— altı savunmanın hiçbiri bunu yapmaz — ve buna rağmen kalanı yalnız 16'ya indirir; yedisinin
en zayıfıdır. Nedeni kapsamının 0,30 olmasıdır. **İki koşul kıran ve filonun üçte birine
ulaşan bir savunma, tek koşul kıran ve onda dokuzuna ulaşan bir savunmadan zayıftır.** Katmanın
gücü kırdığı koşul sayısıyla değil, kırdığı koşul ile kapsamının çarpımıyla ölçülür.

#### Birikimli Ekleme

Üçüncü çıktı savunmaları her turda en çok azaltandan başlayarak ekler. İlk iki adımda kalan uç
sayısı 22'den 1'e, sonra **0'a** iner ve birikimli meşru bedel **9'dur**. Kalan beş savunma
hiçbir uç noktayı daha düşürmez ve bedeli 55'e çıkarır.

Bu, öteki beş savunmanın gereksiz olduğu anlamına gelmez ve bu ayrım önemlidir. Ölçüm bir
**anlık görüntüdür**: bu filoda, bu kapsam değerleriyle, bu koşul oranlarıyla. Üçüncü koşulun
oranı 0,40'tan 0,70'e çıktığında — yeni bir açık kalem ortaya çıktığında — sıralama değişir ve
sıfır kalan savunmalar sayı üretmeye başlar. VE zincirinde yedek katmanların işlevi bugünkü
sayıyı düşürmek değil, **bir koşulun oranı değiştiğinde sayının fırlamasını engellemektir**.

Yine de bir şey açıktır: iki kalem, dokuz birim meşru bedelle bu filoyu sıfıra indiriyor. Yedi
kalemin toplam bedeli 55. Savunma bütçesi sınırlıysa sıralama bu tablodan okunur, katman
listesinden değil.

Sıranın kendisi de tesadüf değildir. Açgözlü seçim ilk turda uç nokta korumasını alır, çünkü
kırdığı koşul filoda en dar olan koşuldur ve kapsamı en yüksek olanlardandır. İkinci turda
otomatik güncellemeyi alır; kalan tek uç noktanın koruma kapsamı dışında kalan uç olması, o
uçta ikinci bir koşulun düşürülmesini gerektirir. Üçüncü turdan itibaren seçim yapacak bir şey
kalmaz ve sıralama yalnız meşru bedele göre yapılır.

#### Erken Kırmanın Sınırı

Dördüncü çıktı bedeli aşama aşama verir. İlk üç koşul boyunca **hiçbir iz kalmaz**: kullanıcı
bir sayfa açmış, sayfa bir içerik yüklemiş, bileşende bir kalem bulunmuştur. Dördüncü koşulda
bir kalem diske yazılır — savunmasız filoda **73 uç noktada**. Beşinci koşulda kalem çalışır
(63 uç nokta), altıncıda koruma onu görmez (22 uç nokta).

Erken kırmanın sınırı bu tablodadır: zincir üçüncü koşula kadar durursa geriye hiçbir kalem
kalmaz. Dördüncü koşuldan sonra durmak, uç noktada bir kalemin bulunduğu ve bir incelemenin
gerektiği anlamına gelir. **73 ile 22 arasındaki 51 uç nokta bu aradaki bölgedir**: zincir
tamamlanmamıştır, ama diske bir kalem yazılmıştır ve o kalemin bulunması, sınıflandırılması ve
temizlenmesi gereken bir iş kalemi doğar.

Bu ayrım savunma raporlarında sık kaybolur. "Bulaşma olmadı" cümlesi 22 sayısına bakar;
gerçek iş yükü 73 sayısındadır. İlk üç koşulu kıran bir savunma bu iş yükünü hiç doğurmaz,
son iki koşulu kıran bir savunma ise doğurur ve bunu yaparken "başarılı" görünür. Kursun
üçüncü sütunu — geç kırmanın bedeli — tam olarak bu farkı yazmak için vardır.

Tam kuruluşta iki sayı da sıfırdır: ne diske yazma kalır ne de tamamlanan zincir. Bu kuruluşun
maliyeti 55 meşru birimdir ve aynı sonucu 9 birim veren iki kalemle almak da mümkündür — fark,
koşul oranları değiştiğinde ortaya çıkacaktır.

#### Özet

- Drive-by indirme bir VE zinciridir: altı koşulun altısı da tutmalıdır. Tek tek
  koşullar seyrek değildir (221 ile 482 uç nokta arası), kesişim seyrektir: 600 uç noktanın
  22'si, yani %3,7'si.
- Birikimli sayı 362, 262, 118, 73, 63, 22 diye iner; en büyük düşüş en dar koşulda olur.
  VE zincirinde sonucu en dar koşul belirler.
- Tek başına dağıtılan savunmalarda sıralamayı kırılan koşul değil kapsam belirler: kapsamı
  0,90 olan kalem 22'yi 1'e indirir, kapsamı 0,30 olan ve iki koşul birden kıran kalem 16'da
  bırakır.
- İki savunma 9 birim meşru bedelle kalanı 0'a indiriyor; yedi savunmanın toplam bedeli 55 ve
  ek olarak düşürdüğü uç nokta sayısı 0. Yedek katmanların işlevi bugünkü sayıyı değil, koşul
  oranı değiştiğinde oluşacak sıçramayı karşılamaktır.
- İlk üç koşulda hiçbir iz kalmaz; dördüncü koşuldan sonra kalem diske yazılmıştır. Savunmasız
  filoda 73 uç noktada kalem yazılmış, 22'sinde zincir tamamlanmıştır — aradaki 51 uç, zincirin
  tamamlanmadığı ama yine de bir temizleme işi doğurduğu bölgedir.

#### Sonraki Adım

Bu ders bir kalemin uç noktaya ulaşmasını saydı ama o kalemin **ne olduğunu** hiç sormadı.
Savunmanın elinde çoğu zaman yalnız o kalem vardır: kaynağı yok, belgesi yok, yazarı bilinmiyor.
Sonraki ders bu soruyu ölçer — bir ikiliden hangi göstergeler çıkarılabilir, hangileri hiçbir
biçimde çıkarılamaz ve karşı önlemler kaç kalemi gizler. O ders aynı zamanda kursun
kapanışıdır: yirmi iki dersin zincir adımı, kırılabilen halkası ve geç kırma bedeli tek bir
tabloda toplanır.

### Tersine Mühendislik Temelleri

Source: https://academia.sh/tr/kurslar/saldiri-teknikleri/tersine-muhendislik-temelleri

Tersine mühendisliğin savunmadaki yerinin ölçülmesi: yirmi kurgu göstergenin toplam savunma değerinin otuz sekiz olması, ham ikiliden dizge taramasıyla on iki kalemin çıkması, simge silme ile dizge gizlemenin birlikte bu on ikisini sıfıra indirmesi, üç kalemin hiçbir kuruluşta çıkarılamayıp yalnız kurbanın kendi kaydında görülmesi ve kursun yirmi iki dersinin zincir sütunlarının tek tabloda toplanması.

Önceki ders bir kalemin uç noktaya ulaşmasını saydı ama o kalemin ne olduğunu hiç sormadı.
Savunmanın elinde çoğu zaman yalnız o kalem vardır: kaynağı yok, belgesi yok, yazarı bilinmiyor.
Tersine mühendislik, o kalemden **savunmanın kullanabileceği gösterge** çıkarma işidir.

Bu ders sınıfı ölçünün diğer ucundan ele alır. Buraya kadarki sekiz derste zincir saldıranındı
ve savunma onu kırıyordu. Burada zincir **savunmanındır**: örneği elde etmek, statik çıkarım
yapmak, dinamik gözlem yapmak, göstergeleri bir kurala dönüştürmek ve kuralı filoya dağıtmak.
Kıran taraf ise karşı önlemlerdir. Ölçüm boyunca gerçek bir örnek, gerçek bir araç ve gerçek
bir çözümleme adımı yazılmaz; ikili bu derste **kendi üretilir** ve tarama gerçekten koşturulur.

#### Üç Tür Gösterge, Bir Tür Boşluk

Bir ikiliden çıkarılabilecek kalemler tek türden değildir. **Dizge** ve **simge** türündeki
kalemler ikilinin içinde metin olarak bulunur; bir tarama onları doğrudan verir. **Davranış**
türündeki kalemler ikilide yazılı değildir; ancak kalem çalıştırıldığında görülür. Dördüncü bir
tür ise hiçbir yolla çıkarılamaz: kalem o bilgiyi taşımaz, onu **kurbanın ortamından** alır.

Bu dördüncü tür bu dersin asıl noktasıdır. Bir çözümleme raporu ne kadar ayrıntılı olursa olsun,
kalemin hedef ağdaki adresini, türetilen bir oturum anahtarını ya da hangi kurumun hedeflendiğini
söyleyemez. O kalemler yalnız **kurbanın kendi kaydında** görülür.

**TS33:** gösterge envanteri kurgudur; `savunma`, kalemin bir tespit kuralı için değeridir.
**TS34:** ikili gerçekten üretilir; metin taşıyan kalemler bölgelere yazılır, geri kalan bölge
üreteçten gelen baytlarla doldurulur. **TS35:** dizge taraması, dört ve daha uzun basılabilir bayt
dizilerini toplar. **TS36:** savunmanın çözümleme zinciri beş adımdır ve her karşı önlem bir adımı
kırar.

```js
// tm/ikili.mjs — kurgu bir ikili kalem ve icindeki gostergeler (model). Gercek bir kotu
// amacli yazilim, gercek bir ornek ve hicbir cozumleme araci yok; ikili burada uretilir.
export const GOSTERGE = [
  { ad: "yapilandirma-anahtari", tur: "dizge", metin: "olcum.ayar.esik", savunma: 2 },
  { ad: "bilesen-etiketi", tur: "dizge", metin: "sayac-toplayici-1", savunma: 1 },
  { ad: "gonderim-araligi", tur: "dizge", metin: "gonderim-araligi=900", savunma: 2 },
  { ad: "dosya-adi-kalibi", tur: "dizge", metin: "gecici-olcum-veri", savunma: 3 },
  { ad: "yeniden-deneme", tur: "dizge", metin: "yeniden-deneme-siniri", savunma: 1 },
  { ad: "derleme-etiketi", tur: "dizge", metin: "derleme-2026-04-11", savunma: 1 },
  { ad: "surum-etiketi", tur: "dizge", metin: "ayar-imzasi-v3", savunma: 1 },
  { ad: "islev-baglantiKur", tur: "simge", metin: "baglantiKur", savunma: 2 },
  { ad: "islev-veriTopla", tur: "simge", metin: "veriTopla", savunma: 2 },
  { ad: "islev-kayitYaz", tur: "simge", metin: "kayitYaz", savunma: 1 },
  { ad: "islev-zamanlayici", tur: "simge", metin: "zamanlayiciAyarla", savunma: 2 },
  { ad: "islev-ayarOku", tur: "simge", metin: "ayarOku", savunma: 1 },
  { ad: "acilis-sirasi", tur: "davranis", savunma: 3 },
  { ad: "dosya-yazma-duzeni", tur: "davranis", savunma: 3 },
  { ad: "zamanlama-araligi", tur: "davranis", savunma: 2 },
  { ad: "yeniden-baslatma-tepkisi", tur: "davranis", savunma: 2 },
  { ad: "kaynak-kullanim-profili", tur: "davranis", savunma: 1 },
  { ad: "hedef-ag-adresi", tur: "cikarilamaz", savunma: 3 },
  { ad: "oturum-anahtari", tur: "cikarilamaz", savunma: 3 },
  { ad: "kurban-kimligi", tur: "cikarilamaz", savunma: 2 },
];

function uretec(tohum) {
  let s = tohum >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) & 255;
}

export function ikiliUret({ simgeSil = false, dizgeGizle = false, paketle = false } = {}) {
  const r = uretec(20260804);
  const bayt = [];
  const koy = (m) => { for (const c of m) bayt.push(c.charCodeAt(0)); bayt.push(0); };
  const doldur = (n) => { for (let i = 0; i < n; i++) bayt.push(r() | 128); };  // basilamaz

  doldur(24);                                              // baslik bolgesi
  for (const g of GOSTERGE.filter((x) => x.tur === "simge")) {
    if (simgeSil || paketle) doldur(g.metin.length + 1); else koy(g.metin);
  }
  doldur(32);                                              // kod bolgesi
  for (const g of GOSTERGE.filter((x) => x.tur === "dizge")) {
    if (paketle) doldur(g.metin.length + 1);
    else if (dizgeGizle) { for (const c of g.metin) bayt.push(c.charCodeAt(0) ^ 90); bayt.push(0); }
    else koy(g.metin);
  }
  doldur(24);
  return Uint8Array.from(bayt);
}

export function dizgeTara(b, enAz = 4) {
  const bulunan = [];
  let s = "";
  for (const x of b) {
    if (x >= 32 && x <= 126) s += String.fromCharCode(x);
    else { if (s.length >= enAz) bulunan.push(s); s = ""; }
  }
  if (s.length >= enAz) bulunan.push(s);
  return bulunan;
}

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(""));
```

```js
// tm/olcum.mjs — ikiliden kac gosterge cikiyor, karsi onlemler kacini gizliyor, hangi
// kalem hicbir kurulusta cikmiyor. Dizge taramasi gercekten kosturulur.
import { GOSTERGE, ikiliUret, dizgeTara, yaz } from "./ikili.mjs";

const TUR = ["dizge", "simge", "davranis", "cikarilamaz"];
const deger = (k) => k.reduce((t, g) => t + g.savunma, 0);

console.log(`${GOSTERGE.length} kurgu gosterge, toplam savunma degeri ${deger(GOSTERGE)}\n`);

const A = [-14, 9, 12, 22];
console.log("1. gosterge turleri");
yaz(A, "tur", "kalem", "savunma", "cikarma yolu");
const YOL = { dizge: "dizge taramasi", simge: "dizge taramasi",
  davranis: "dinamik gozlem", cikarilamaz: "yok" };
for (const t of TUR) {
  const k = GOSTERGE.filter((g) => g.tur === t);
  yaz(A, t, k.length, deger(k), YOL[t]);
}

const cikan = (secenek) => {
  const bulunan = dizgeTara(ikiliUret(secenek));
  return GOSTERGE.filter((g) => g.metin && bulunan.includes(g.metin));
};

const KURULUS = [
  ["karsi onlem yok", {}],
  ["simge silme", { simgeSil: true }],
  ["dizge gizleme", { dizgeGizle: true }],
  ["simge silme + dizge gizleme", { simgeSil: true, dizgeGizle: true }],
  ["paketleme", { paketle: true }],
];
const B = [-30, 9, 11, 11, 12];
console.log("\n2. dizge taramasinin cikardigi (gercek kosum)");
yaz(B, "kurulus", "kalem", "savunma", "gizlenen", "kalan pay");
const ham = cikan({});
for (const [ad, s] of KURULUS) {
  const c = cikan(s);
  yaz(B, ad, c.length, deger(c), ham.length - c.length,
    `%${((deger(c) / deger(GOSTERGE)) * 100).toFixed(1)}`);
}
console.log(`ikili ${ikiliUret({}).length} bayt (butun kuruluslarda ayni; degisen yalnizca ` +
  `icerik). Ham ikilide cikan ${ham.length} kalemin ` +
  `${ham.filter((g) => g.tur === "dizge").length} tanesi dizge, ` +
  `${ham.filter((g) => g.tur === "simge").length} tanesi simge.`);

const ADIM = ["ornegin-elde-edilmesi", "statik-cikarim", "dinamik-gozlem",
  "kurala-donusturme", "filoya-dagitim"];
const ONLEM = [
  { ad: "simge-silme", kirar: 2, gizler: ["simge"] },
  { ad: "dizge-gizleme", kirar: 2, gizler: ["dizge"] },
  { ad: "paketleme", kirar: 2, gizler: ["dizge", "simge"] },
  { ad: "hata-ayiklayici-tespiti", kirar: 3, gizler: ["davranis"] },
  { ad: "kosula-bagli-calisma", kirar: 3, gizler: ["davranis"] },
];
const C = [-24, 10, 20, 10, 12];
console.log("\n3. karsi onlem - adim eslemesi");
yaz(C, "karsi onlem", "kirdigi", "gizledigi tur", "kalem", "savunma");
for (const o of ONLEM) {
  const k = GOSTERGE.filter((g) => o.gizler.includes(g.tur));
  yaz(C, o.ad, `${o.kirar}. adim`, o.gizler.join("+"), k.length, deger(k));
}
console.log(`${ADIM.length} adimlik cozumleme zinciri: ${ADIM.join(" -> ")}`);

const D = [-34, 10, 12, 14];
console.log("\n4. kalan gosterge (karsi onlemler birikimli)");
yaz(D, "kurulus", "kalem", "savunma", "kalan pay");
const kalan = (turler) => GOSTERGE.filter((g) => !turler.includes(g.tur) && g.tur !== "cikarilamaz");
for (const [ad, t] of [["hicbiri", []], ["statik gizleme", ["dizge", "simge"]],
  ["dinamik gizleme", ["davranis"]], ["ikisi birden", ["dizge", "simge", "davranis"]]]) {
  const k = kalan(t);
  yaz(D, ad, k.length, deger(k), `%${((deger(k) / deger(GOSTERGE)) * 100).toFixed(1)}`);
}
const cik = GOSTERGE.filter((g) => g.tur === "cikarilamaz");
console.log(`hicbir kurulusta cikarilamayan kalem: ${cik.length}, savunma degeri ` +
  `${deger(cik)} (%${((deger(cik) / deger(GOSTERGE)) * 100).toFixed(1)}); ` +
  `bu kalemler ancak kurbanin kendi kaydinda gorulur`);
```

```
20 kurgu gosterge, toplam savunma degeri 38

1. gosterge turleri
tur               kalem     savunma          cikarma yolu
dizge                 7          11        dizge taramasi
simge                 5           8        dizge taramasi
davranis              5          11        dinamik gozlem
cikarilamaz           3           8                   yok

2. dizge taramasinin cikardigi (gercek kosum)
kurulus                           kalem    savunma   gizlenen   kalan pay
karsi onlem yok                      12         19          0       %50.0
simge silme                           7         11          5       %28.9
dizge gizleme                         5          8          7       %21.1
simge silme + dizge gizleme           0          0         12        %0.0
paketleme                             0          0         12        %0.0
ikili 266 bayt (butun kuruluslarda ayni; degisen yalnizca icerik). Ham ikilide cikan 12 kalemin 7 tanesi dizge, 5 tanesi simge.

3. karsi onlem - adim eslemesi
karsi onlem                kirdigi       gizledigi tur     kalem     savunma
simge-silme                2. adim               simge         5           8
dizge-gizleme              2. adim               dizge         7          11
paketleme                  2. adim         dizge+simge        12          19
hata-ayiklayici-tespiti    3. adim            davranis         5          11
kosula-bagli-calisma       3. adim            davranis         5          11
5 adimlik cozumleme zinciri: ornegin-elde-edilmesi -> statik-cikarim -> dinamik-gozlem -> kurala-donusturme -> filoya-dagitim

4. kalan gosterge (karsi onlemler birikimli)
kurulus                                kalem     savunma     kalan pay
hicbiri                                   17          30         %78.9
statik gizleme                             5          11         %28.9
dinamik gizleme                           12          19         %50.0
ikisi birden                               0           0          %0.0
hicbir kurulusta cikarilamayan kalem: 3, savunma degeri 8 (%21.1); bu kalemler ancak kurbanin kendi kaydinda gorulur
```

#### Taramanın Çıkardığı

İkinci çıktı gerçek bir koşumdur: üretilen 266 baytlık ikilide basılabilir bayt dizileri
toplanır ve envanterle eşleştirilir. Ham ikiliden **12 kalem** çıkar — 7 dizge, 5 simge — ve
bunların savunma değeri 19'dur, envanterin toplam değerinin **yarısı**.

Karşı önlemler bu sayıyı adım adım düşürür. Simge silme 12'yi 7'ye, dizge gizleme 5'e indirir.
İkisi birlikte uygulandığında ya da tek bir paketleme kullanıldığında tarama **sıfır kalem**
verir. Sayı sıfıra indiğinde ikili hâlâ 266 bayttır ve hâlâ aynı işi yapmaktadır; değişen tek
şey, statik bir taramanın ondan bir şey okuyup okuyamadığıdır.

Bu, çözümleme raporlarında en sık karşılaşılan yanılgının ölçülmüş hâlidir: **bir taramanın boş
dönmesi kalemin zararsız olduğunu değil, o taramanın o kalemde işe yaramadığını gösterir.**
Aynı ikili, aynı davranış, farklı bir sunum.

#### Karşı Önlem Hangi Adımı Kırar

Üçüncü çıktı beş karşı önlemi savunmanın çözümleme zincirine eşler. Üçü **ikinci adımı** —
statik çıkarımı — kırar. İkisi **üçüncü adımı** — dinamik gözlemi — kırar.

Hiçbiri birinci adımı kırmaz. Örneğin elde edilmesi, karşı önlemlerin ulaşamadığı halkadır:
kalem uç noktaya varmışsa savunmanın elindedir. Dördüncü ve beşinci adımlar — kurala
dönüştürme ve filoya dağıtım — da karşı önlemlerin kapsamı dışındadır; onların hızı savunmanın
kendi işleyişine bağlıdır.

Buradan bu kursun ölçüsüne uygun bir sonuç çıkar. Savunmanın çözümleme zincirinde **kırılabilen
iki halka vardır** ve ikisi de ortadadır. Zincirin başı ve sonu saldıranın erişemediği
halkalardır. Karşı önlem seçimi, savunmanın hangi adımda daha az yedeği olduğuna bakar:
statik çıkarımın yedeği dinamik gözlemdir, dinamik gözlemin yedeği yoktur.

#### Çıkarılamayan Kalem

Dördüncü çıktı kalan göstergeleri sayar. Hiçbir karşı önlem yokken 17 kalem ve 30 savunma
değeri çıkarılabilir durumdadır. Statik gizleme uygulandığında 5 kalem ve 11 değer kalır;
dinamik gizleme uygulandığında 12 kalem ve 19 değer. İkisi birden uygulandığında ikilinin
kendisinden **hiçbir şey** çıkmaz.

Son satır bu dersin cevabıdır. Üç kalem — hedef ağ adresi, oturum anahtarı ve kurban kimliği —
hiçbir kuruluşta çıkarılamaz ve savunma değerlerinin toplamı 8'dir, envanterin **%21,1'i**. Bu
kalemler ikilide hiç bulunmaz; kalem onları çalıştığı ortamdan alır.

Sonuç şudur: tersine mühendislik savunmaya bir gösterge kümesi verir, ama **hiçbir zaman
tamamını** vermez ve karşı önlemler karşısında verdiği kısım sıfıra kadar inebilir. Kurbanın
kendi kayıtları bu yüzden çözümlemenin alternatifi değil, tamamlayıcısıdır: son üç kalem yalnız
orada vardır ve savunma değeri en yüksek beş kalemden ikisi o kümededir.

#### Özet

- Bir ikiliden çıkarılabilecek kalemler dört türdür: dizge ve simge statik taramayla, davranış
  yalnız çalışma anında görülür, dördüncü tür hiçbir yolla çıkarılamaz.
- 266 baytlık kurgu ikiliden dizge taraması 12 kalem çıkardı (7 dizge, 5 simge), savunma değeri
  19 — envanterin toplam değerinin yarısı.
- Simge silme çıkan kalemi 7'ye, dizge gizleme 5'e indirdi; ikisi birlikte ya da tek başına
  paketleme sıfıra indirdi. İkili aynı boyutta ve aynı işlevdedir; değişen yalnız okunabilirliktir.
- Beş karşı önlemin üçü çözümleme zincirinin ikinci adımını, ikisi üçüncü adımını kırar. Birinci,
  dördüncü ve beşinci adımlar karşı önlemlerin ulaşamadığı halkalardır.
- Üç kalem hiçbir kuruluşta çıkarılamaz; savunma değerleri 8, envanterin %21,1'i. Bu kalemler
  yalnız kurbanın kendi kaydında görülür ve çözümlemenin alternatifi değil tamamlayıcısıdır.

#### Kurs Kapanışı

Yirmi iki ders boyunca tek bir soru soruldu: bu zincir hangi halkada kırılabilir ve geç kırmak
ne kaybettirir. Aşağıdaki tablo her dersin üç sütununu sırayla toplar; her sayı kendi dersinden
okunmuştur.

| Ders | Zincir adımı | Kırılabilen halka | Geç kırmanın bedeli |
|---|---|---|---|
| Tehdit Aktörleri | 8 adım | 8 eşik, 1 düzey geçer | 64 kalem |
| Gelişmiş Sürekli Tehdit | 8 adım, 330 gün | 5 denetimli, 2 uyarır | 48 kalem |
| Saldırı Yaşam Döngüsü | 8 adım | 5 denetim, 3 boş adım | 20,14 kalem |
| Saldırgan Davranış Sınıflandırmaları | 8 adım, 10.800 zincir | 72 zincir kırılamaz | 1,39 kalem ortalama |
| Elmas Modeli | 8 adım, 6 bağlantı | altyapı 8. adımda | 41 kalem |
| Bilinen ve Bilinmeyen Tehditler | 8 denetim | bilinende 7, bilinmeyende 5 | 19,69 kalem |
| Sosyal Mühendisliğin Temeli | 6 adım | 4 denetimli, en erken 3. | 9 kalem |
| Kimlik Avı Türleri | 5 adım | en erken 2. adım | 11 kalem |
| Diğer Kanallar | 5 adım | e-postada 4, sesli aramada 0 | 11 kalem |
| Fiziksel Teknikler | 3 zincir | ilk adım denetimsiz | 7, 5, 7 kalem |
| Alan Adı Taklidi | kayıt zinciri | izleme varsa 1. adım | 6 kalem kazanç |
| Su Kuyusu Saldırıları | 6 adım | 3 kaynakta 3., 2 sayfada 6. | 12 kalem |
| Farkındalık Programları | 5 halka | bildirim 3. halkayı kırar | 5 kalem |
| Web Uygulaması Riskleri | 39 adım, 9 zincir | 17 adımda denetim | 480 kalem |
| Enjeksiyon Saldırıları | 6 adım | 2. adım, 9/12 yerde | 480 kalem |
| Siteler Arası Betik Çalıştırma | 5, 6 ve 4 adım | 3 bileşim kırılmıyor | 340 oturum |
| İstek Sahteciliği | 5 + 5 adım | tarayıcıda 3., sunucuda 1. | 267 işlem, 60 iç uç |
| Dizin Geçişi | 5 adım | 2. adım, tanıtıcı eşlemesi | 30 kalem, 41 duyarlılık |
| Arabellek Taşması | 5 adım | 1. adım, dil sınıfı | 6 komşu alan |
| Parola Saldırıları | 6 adım | 3. adım, eşiğin ölçeği | 190 hesap |
| Drive-by İndirmeler | 6 koşul | 3. koşul, erken sınır | 73 uç nokta |
| Tersine Mühendislik Temelleri | 5 adım, çözümleme | 2. adım, karşı önlem | 8 savunma değeri |

Tablo tek bir kuralı adıyla anmayı gerektirir: **saldırı bir an değil, önkoşulları olan bir adım
dizisidir.** Hiçbir satırda tek bir olay yoktur; her satırda birbirine bağlı adımlar ve her
adımın tutması gereken bir koşulu vardır. Savunmanın işi de bu yüzden zinciri kırmak değildir —
zincir zaten pek çok yerde kırılabilir. Savunmanın işi **en erken kırılabilen halkayı** bulmak,
onun meşru işe bedelini yazmak ve o halkanın kaç yerde gerçekten dağıtıldığını saymaktır.

Yirmi iki satırın hepsi bunu yalnız kâğıt üzerinde gösterir. Adım dizileri modellendi, denetimler
adımlara eşlendi, kapsam sayıldı ve bedel yazıldı — hepsi kendi yazdığımız veri yapıları
üzerinde. Bir savunmanın gerçekten tuttuğunu ise kâğıt gösteremez; ancak **yetkili biri
deneyerek** gösterebilir. O denemenin kuralları, kapsamının nasıl tanımlandığı, nerede
durulacağı ve bulunanların hangi biçimde raporlanacağı bu kursta hiç ele alınmadı. Sonraki
kurs — **Güvenlik Araçları ve Sızma Testi** — tam olarak bunu ölçer.

