---
title: 'Güvenlik Araçları ve Sızma Testi'
source: 'https://academia.sh/tr/kurslar/sizma-testi'
language: tr
updated: '2026-08-17T04:39:59+00:00'
license: 'CC BY-SA 4.0'
lessons: 18
outcomes:
    - 'Yetkilendirilmiş test sürecinin kapsamını ve katılım kurallarını programlı denetime çevirir'
    - 'Keşif, tarama ve çözümleme araçlarının ürettiği adayı kanıta dönüştürür'
    - 'Her adımın savunmada bıraktığı izi sayar ve bulguyu yeniden üretilebilir biçimde raporlar'
---

# Güvenlik Araçları ve Sızma Testi

Yetkilendirilmiş bir değerlendirmede aday bulgu ile kanıtlanmış bulgu arasındaki fark: halka açık bilgiden saldırı yüzeyi adayı çıkarma, alan adı ve kayıt sorgulamanın sahiplik kanıtı olarak değeri, alt alan ve varlık keşfinin bulduğu sahipsiz kalem, tarama türlerinin savunmada bıraktığı iz, servis ve sürüm parmak izi, paket yakalama ve protokol çözümlemesinin kanıt değeri, vekil araçlarla istek değiştirme, sanal alan çözümlemesi, çoklu motor itibar servislerinin çoğunluk kararı, istismar çerçevelerinin doğrulama amaçlı sınırı, yasal alıştırma ortamları, katılım kuralları ve kapsamın programlı denetimi, kara, gri ve beyaz kutu değerlendirmeleri, yanlış pozitifin elenmesi, bulgunun iş etkisiyle ifadesi, yeniden üretim adımları ve sorumlu açıklama.

## Keşif

Yetkilendirilmiş bir değerlendirmenin dışarıdan görünen envanteri: halka açık kaynaklardan çıkan saldırı yüzeyi adayının kaçının gerçekten kuruma ait olduğu, alan adı ve kayıt sorgulamada hangi kaydın sahipliği kanıtlayıp hangisinin yalnız ipucu kaldığı, alt alan ve varlık keşfinin bulduğu sahipsiz kalem, bağlantı noktası tarama türlerinin bulduğu aday ile savunmada bıraktığı kayıt arasındaki denge ve servis parmak izinin kaç adayı tek bir sürüme indirgeyebildiği.

### Açık Kaynak İstihbaratı

Source: https://academia.sh/tr/kurslar/sizma-testi/acik-kaynak-istihbarati

Halka açık kalemden saldırı yüzeyi adayına: 29 kalemden 26 anma ve 20 benzersiz aday çıkması, bunların 9'unun kanıt ve 6'sının yanlış pozitif olması (%30), en isabetli kaynağın %83 ve en verimsizinin %0 kanıt üretmesi, 45 doğrulama adımının 12'sinin sıfır kanıt getirmesi, dört kaynaktan sonra kanıt sayısının sabitlenip isabetin %69'dan %45'e düşmesi ve 13 kalemlik envanterin yalnız 9'unun dışarıdan görünmesi.

Bir önceki kurs, hangi halkanın kırılabildiğini kâğıt üzerinde saydı ve şu soruyla kapandı: bir
savunmanın gerçekten tuttuğunu ancak yetkili biri deneyerek gösterebilir. Bu kurs o denemenin
kendisidir. İlk adımı, deneyecek kişinin **neye bakacağını** bilmesidir — ve o listeyi kurumun
kendisi vermez; dışarıda zaten duran kalemlerden çıkarılır.

**Açık kaynak istihbaratı (open-source intelligence)**, halka açık kalemlerden hedefe ait
olabilecek varlıkların çıkarılmasıdır. Buradaki kritik sözcük **olabilecek**tir. Bu kursun ölçü
birimi bulgu sayısı değil, **kanıtlanmış bulgu** sayısıdır ve ayrım daha ilk adımda başlar: bir ad
listede geçiyor olması, o adın kuruma ait olduğunu göstermez.

#### Aday, Kanıt ve Yanlış Pozitif

Bu değerlendirme **yetkilendirilmiştir**: kapsam sahibi yazılı yetki vermiş ve hangi varlıkların
test edilebileceğini tanımlamıştır. Aynı adımların yazılı yetki ve tanımlı kapsam dışında
yapılması hem yasadışı hem meslek dışıdır.

**KS1:** her kaynak türü dört sayı taşır — kaç kalem alındığı, hedef tarafta kaç kayıt bıraktığı,
kaç uyarı tetiklediği ve aday başına kaç doğrulama adımı gerektirdiği. **KS2:** bir adayın bir
kaynakta geçmesine *anma* denir; aynı aday birden çok kaynakta geçebilir, bu yüzden anma sayısı
aday sayısından büyüktür. **KS3:** kapsam sahibinin onayladığı envanter bu ölçümün hakemidir;
envanterde olan aday **kanıt**, envanterde olmayıp kuruma hizmet ettiği görülen **ipucu**,
envanterle hiç örtüşmeyen **yanlış pozitif** sayılır.

```js
// kesif/kaynak.mjs — kurgu bir olcum aginin halka acik kalem kumesi (model): gercek bir alan
// adi, gercek bir genel adres, gercek bir kurum yok. Rastgelelik yok.

// KS1: kaynak turu su dort sayiyi tasir — alinan kalem, hedefte biraktigi kayit, tetikledigi
// uyari ve aday basina gereken dogrulama adimi. Ucuncu tarafta duran kaynak hedefte kayit
// uretmez; kurumun kendi ucundan alinan kalem her alista bir erisim kaydi birakir.
export const KAYNAK = `
  sertifika-kaydi     4   0  0  1
  belge-meta          3   0  0  2
  is-ilani            2   0  0  2
  genel-kod-deposu    3   0  0  2
  arsiv-kopyasi       5   0  0  3
  kurum-sitesi       12  12  0  1`
  .trim().split("\n").map((r) => {
    const [tur, kalem, kayit, uyari, adim] = r.trim().split(/\s+/);
    return { tur, kalem: +kalem, kayit: +kayit, uyari: +uyari, adim: +adim };
  });

// KS2: her satir bir adayin bir kaynakta gecmesidir; ayni aday birden cok kaynakta gecebilir.
export const ANMA = `
  sertifika-kaydi   abone-portali
  sertifika-kaydi   saha-uygulamasi
  sertifika-kaydi   test-portali
  sertifika-kaydi   ortak-arayuzu
  sertifika-kaydi   sayac-guncelleme-ucu
  sertifika-kaydi   eski-rapor-ucu
  belge-meta        rapor-ucu
  belge-meta        ortak-arayuzu
  belge-meta        sube-vpn-ucu
  belge-meta        eski-rapor-ucu
  is-ilani          is-emri-ucu
  is-ilani          sube-vpn-ucu
  is-ilani          egitim-ortami
  genel-kod-deposu  toplayici-ag-gecidi
  genel-kod-deposu  bulut-depolama-kovasi
  genel-kod-deposu  test-portali
  genel-kod-deposu  yedek-alan-adi
  arsiv-kopyasi     eski-abone-portali
  arsiv-kopyasi     eski-saha-uygulamasi
  arsiv-kopyasi     destek-portali
  arsiv-kopyasi     bayi-portali
  kurum-sitesi      abone-portali
  kurum-sitesi      rapor-ucu
  kurum-sitesi      pazarlama-sayfasi
  kurum-sitesi      kimlik-saglayici-ucu
  kurum-sitesi      odeme-saglayici-ucu`
  .trim().split("\n").map((r) => {
    const [kaynak, aday] = r.trim().split(/\s+/);
    return { kaynak, aday };
  });

// KS3: kurgu envanter, bu degerlendirmede kapsam sahibinin onayladigi gercek varlik listesidir
// ve olcumun hakemidir. Envanterde olmayan aday yanlis pozitiftir.
export const ENVANTER = [
  "abone-portali", "saha-uygulamasi", "sube-vpn-ucu", "toplayici-ag-gecidi", "rapor-ucu",
  "test-portali", "ortak-arayuzu", "is-emri-ucu", "sayac-guncelleme-ucu",
  "ic-ag-yonetim-ucu", "yedekleme-ucu", "olcum-deposu", "kimlik-deposu",
];

// Sahiplik disaridan kanitlanamayan, ucuncu tarafta duran ama kuruma hizmet eden kalemler.
export const IPUCU = ["eski-abone-portali", "pazarlama-sayfasi", "bulut-depolama-kovasi",
  "kimlik-saglayici-ucu", "egitim-ortami"];

export const ADAY = [...new Set(ANMA.map((a) => a.aday))];
export const sinif = (a) =>
  ENVANTER.includes(a) ? "kanit" : IPUCU.includes(a) ? "ipucu" : "yanlis-pozitif";
```

```js
// kesif/aday.mjs — halka acik kalemden saldiri yuzeyi adayi: kac aday cikiyor, kaci kanit.
import { KAYNAK, ANMA, ADAY, ENVANTER, sinif } from "./kaynak.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 say = (l, s) => l.filter((a) => sinif(a) === s).length;
const KALEM = KAYNAK.reduce((t, k) => t + k.kalem, 0);

console.log(`${KAYNAK.length} kaynak turu, ${KALEM} halka acik kalem, ${ANMA.length} anma, ` +
  `${ADAY.length} benzersiz aday; envanter ${ENVANTER.length} kalem`);

const A = [-19, 7, 6, 7, 7, 8, 9];
console.log("\n1. kaynak turu basina aday ve isabet");
yaz(A, "kaynak turu", "kalem", "anma", "kanit", "ipucu", "yanlisP", "kanit %");
for (const k of KAYNAK) {
  const l = ANMA.filter((a) => a.kaynak === k.tur).map((a) => a.aday);
  yaz(A, k.tur, k.kalem, l.length, say(l, "kanit"), say(l, "ipucu"), say(l, "yanlis-pozitif"),
    ((say(l, "kanit") / l.length) * 100).toFixed(0));
}
yaz(A, "TOPLAM (benzersiz)", KALEM, ADAY.length, say(ADAY, "kanit"), say(ADAY, "ipucu"),
  say(ADAY, "yanlis-pozitif"), ((say(ADAY, "kanit") / ADAY.length) * 100).toFixed(0));

const B = [-19, 9, 7, 8, 12, 12];
console.log("\n2. dogrulamanin bedeli ve savunmada biraktigi iz");
yaz(B, "kaynak turu", "hedefte", "uyari", "adim", "adim/kanit", "kayit/kanit");
let adimTop = 0;
for (const k of KAYNAK) {
  const l = ANMA.filter((a) => a.kaynak === k.tur).map((a) => a.aday);
  const kn = say(l, "kanit"), ad = l.length * k.adim;
  adimTop += ad;
  yaz(B, k.tur, k.kayit, k.uyari, ad, kn ? (ad / kn).toFixed(2) : "-",
    kn ? (k.kayit / kn).toFixed(2) : "-");
}
const IZ = KAYNAK.reduce((t, k) => t + k.kayit, 0);
yaz(B, "TOPLAM", IZ, KAYNAK.reduce((t, k) => t + k.uyari, 0), adimTop,
  (adimTop / say(ADAY, "kanit")).toFixed(2), (IZ / say(ADAY, "kanit")).toFixed(2));

const C = [-19, 10, 12, 13];
console.log("\n3. bir kaynak turu birakilirsa");
yaz(C, "birakilan kaynak", "kalan kanit", "kacirilan", "kacirilan %");
const KANIT = ADAY.filter((a) => sinif(a) === "kanit");
for (const k of KAYNAK) {
  const kalan = [...new Set(ANMA.filter((a) => a.kaynak !== k.tur).map((a) => a.aday))]
    .filter((a) => sinif(a) === "kanit");
  yaz(C, k.tur, kalan.length, KANIT.length - kalan.length,
    (((KANIT.length - kalan.length) / KANIT.length) * 100).toFixed(1));
}

const D = [-19, 7, 7, 9, 9, 9];
console.log("\n4. kaynak eklendikce (isabeti yuksekten dusuge)");
yaz(D, "eklenen kaynak", "aday", "kanit", "yanlisP", "kanit %", "iz");
const sirali = [...KAYNAK].sort((x, y) => {
  const o = (k) => { const l = ANMA.filter((a) => a.kaynak === k.tur).map((a) => a.aday);
    return say(l, "kanit") / l.length; };
  return o(y) - o(x);
});
const biriken = [];
let izTop = 0;
for (const k of sirali) {
  biriken.push(k.tur); izTop += k.kayit;
  const l = [...new Set(ANMA.filter((a) => biriken.includes(a.kaynak)).map((a) => a.aday))];
  yaz(D, k.tur, l.length, say(l, "kanit"), say(l, "yanlis-pozitif"),
    ((say(l, "kanit") / l.length) * 100).toFixed(0), izTop);
}

const gorunur = ENVANTER.filter((e) => ANMA.some((a) => a.aday === e)).length;
console.log(`\ndisaridan gorunmeyen envanter kalemi: ` +
  ENVANTER.filter((e) => !ANMA.some((a) => a.aday === e)).join(", "));
console.log(`envanterin ${gorunur}/${ENVANTER.length} kalemi gorunur ` +
  `(%${((gorunur / ENVANTER.length) * 100).toFixed(1)}); ` +
  `${ADAY.length} adayin ${say(ADAY, "yanlis-pozitif")}'si yanlis pozitif ` +
  `(%${((say(ADAY, "yanlis-pozitif") / ADAY.length) * 100).toFixed(1)})`);
```

```
6 kaynak turu, 29 halka acik kalem, 26 anma, 20 benzersiz aday; envanter 13 kalem

1. kaynak turu basina aday ve isabet
kaynak turu          kalem  anma  kanit  ipucu yanlisP  kanit %
sertifika-kaydi          4     6      5      0       1       83
belge-meta               3     4      3      0       1       75
is-ilani                 2     3      2      1       0       67
genel-kod-deposu         3     4      2      1       1       50
arsiv-kopyasi            5     4      0      1       3        0
kurum-sitesi            12     5      2      2       1       40
TOPLAM (benzersiz)      29    20      9      5       6       45

2. dogrulamanin bedeli ve savunmada biraktigi iz
kaynak turu          hedefte  uyari    adim  adim/kanit kayit/kanit
sertifika-kaydi            0      0       6        1.20        0.00
belge-meta                 0      0       8        2.67        0.00
is-ilani                   0      0       6        3.00        0.00
genel-kod-deposu           0      0       8        4.00        0.00
arsiv-kopyasi              0      0      12           -           -
kurum-sitesi              12      0       5        2.50        6.00
TOPLAM                    12      0      45        5.00        1.33

3. bir kaynak turu birakilirsa
birakilan kaynak   kalan kanit   kacirilan  kacirilan %
sertifika-kaydi             7           2         22.2
belge-meta                  9           0          0.0
is-ilani                    8           1         11.1
genel-kod-deposu            8           1         11.1
arsiv-kopyasi               9           0          0.0
kurum-sitesi                9           0          0.0

4. kaynak eklendikce (isabeti yuksekten dusuge)
eklenen kaynak        aday  kanit  yanlisP  kanit %       iz
sertifika-kaydi          6      5        1       83        0
belge-meta               8      7        1       88        0
is-ilani                10      8        1       80        0
genel-kod-deposu        13      9        2       69        0
kurum-sitesi            16      9        3       56       12
arsiv-kopyasi           20      9        6       45       12

disaridan gorunmeyen envanter kalemi: ic-ag-yonetim-ucu, yedekleme-ucu, olcum-deposu, kimlik-deposu
envanterin 9/13 kalemi gorunur (%69.2); 20 adayin 6'si yanlis pozitif (%30.0)
```

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

#### Yirmi Aday, Dokuz Kanıt

Yirmi dokuz halka açık kalem yirmi altı anma üretti; anmalar tekilleştirildiğinde **20 aday**
kaldı. Bu yirmi adayın **9'u kanıt**, 5'i ipucu, **6'sı yanlış pozitif**tir. Ham listenin
%30'u kuruma ait değildir ve doğrulama yapılmadan rapora girse düzeltme isteyen tarafı olmayan
altı kalem üretirdi.

Birinci tablonun asıl bilgisi kaynak türleri arasındaki isabet farkıdır. Sertifika kaydı altı
anmanın beşinde kanıt üretir — **%83**. Arşiv kopyası dört anma üretir ve **hiçbiri kanıt
değildir**; üçü doğrudan yanlış pozitiftir. İkisi de "halka açık kaynak" başlığı altındadır ve
ikisi de aday listesine aynı biçimde girer, ama biri neredeyse doğrudan kanıt, öteki neredeyse
tamamen gürültüdür.

Fark kaynağın **doğasından** gelir. Sertifika kaydı bir ada karşılık sertifika verilmiş olmasını
gösterir ve o adı denetleyebilen taraf sınırlıdır; arşiv kopyası ise geçmişte bir sayfada geçmiş
olmayı gösterir ve geçmişte doğru olan bir şey bugün doğru olmak zorunda değildir. Arşivden çıkan
`eski-saha-uygulamasi` kalemi vaktiyle kuruma aitti, devredildi ve artık başka bir tarafın
sorumluluğundadır. Aynı listede duran `destek-portali` ve `bayi-portali` ise yalnız **ad
benzerliği** yüzünden listeye girmiştir.

#### İz Bırakan Adım ve Bırakmayan Adım

İkinci tablo bu kurs boyunca taşınacak sütunu açar: bir adım savunmada **kaç kayıt** üretiyor.
Altı kaynak türünden **beşi hedefte sıfır kayıt** bırakır, çünkü kalem üçüncü tarafın elindedir;
hedefin günlüğünde bu adımların hiçbir izi yoktur. Yalnız kurumun kendi ucundan alınan on iki
kalem on iki erişim kaydı üretir.

Bu on iki kaydın **0 uyarı** üretmesi tablonun ikinci sonucudur. Bir portalın on iki sayfasını
sırayla almak, normal bir ziyaretçinin yaptığından ayırt edilemez; savunma tarafında bu satırlar
gürültünün içinde durur. Mavi takım açısından çıkarım şudur: keşif aşamasının büyük bölümü
savunmanın göremeyeceği yerde geçer, görülebilen bölümü de eşik altında kalır. **Bu aşamanın
tespiti bir uyarı meselesi değil, geriye dönük ilişkilendirme meselesidir.**

Aynı tablonun `adim` sütunu bedeli verir. Kırk beş doğrulama adımı harcanmış, dokuz kanıt
çıkmıştır: kanıt başına **5,00 adım**. Dağılım eşit değildir. Sertifika kaydı kanıt başına 1,20
adım harcar; genel kod deposu 4,00 adım harcar; arşiv kopyası **12 adım harcar ve hiçbir kanıt
üretmez**. Kaynakları isabete göre değil alışkanlığa göre sıralayan bir keşif, bütçesinin dörtte
birini sıfır getirili bir kaynağa yatırır.

#### Kaynak Eklemenin İki Yüzü

Üçüncü tablo her kaynağın **vazgeçilmezliğini** ölçer. Altı kaynaktan üçü bırakıldığında hiçbir
kanıt kaybolmaz: belge meta verisi, arşiv kopyası ve kurumun kendi sitesi verdikleri kanıtları
başka kaynaklarla paylaşır. Sertifika kaydı bırakılırsa **2 kanıt** kaybolur (%22,2), iş ilanı
ve genel kod deposu birer kanıt götürür. Yani dokuz kanıtın hepsine ulaşmak için altı kaynak
gerekmez — ama üçünün tek tek vazgeçilebilir olması üçünün **birlikte** bırakılabileceğini
göstermez; bir sonraki tablo dördünün yettiğini yazıyor.

Dördüncü tablo bunu birikimli olarak gösterir ve dersin en keskin sonucudur. Kaynaklar isabete
göre sıralanıp tek tek eklendiğinde kanıt sayısı 5 → 7 → 8 → **9** diye ilerler ve dördüncü
kaynaktan sonra **hiç artmaz**. Buna karşılık aday sayısı 13'ten 16'ya, oradan 20'ye çıkar ve
yanlış pozitif 2'den 6'ya yükselir. İsabet aynı iki adımda **%69'dan %45'e** düşer.

Son iki kaynak şunu yapar: yedi yeni aday ekler, **sıfır yeni kanıt** getirir, dört yeni yanlış
pozitif üretir ve savunma tarafında **12 kayıt** bırakır. Keşif aşamasında "daha çok kaynak daha
iyi kapsama" varsayımı bu tabloda kırılır. Kaynak eklemek kapsamayı bir noktadan sonra
artırmaz; artırdığı şey **eleme yüküdür**.

#### İpucu Sınıfı Kapsam Sınırında Durur

Yirmi adayın beşi ne kanıt ne yanlış pozitiftir. Eski abone portalı, pazarlama sayfası, bulut
depolama kovası, kimlik sağlayıcı ucu ve eğitim ortamı kuruma **hizmet eder** ama kurumun
envanterinde durmaz; hepsi üçüncü tarafın altyapısında çalışır. Bu beş kalem aday listesinin
dörtte biridir ve ikili bir eleme kuralıyla — "envanterdeyse kanıt, değilse gürültü" — yanlış
tarafa düşer.

Bu sınıfın ayrı tutulmasının nedeni ölçüm değil **yetkidir**. Bir kalem kuruma hizmet ediyor
olabilir, ama üzerinde işlem yapmak o kalemin sahibi olan üçüncü tarafın altyapısına dokunmak
demektir; verilen yazılı yetki o tarafı kapsamaz. Beş ipucu kaleminin her biri **kapsam sınırına
değen** bir kalemdir ve hiçbiri kapsam sahibinin onayı alınmadan test edilemez. Yanlış pozitifle
aralarındaki fark da buradadır: yanlış pozitif listeden **düşer**, ipucu listede kalır ve
**karar bekler**.

Sayısal karşılığı şudur: dokuz kanıt doğrudan işlenebilir, altı yanlış pozitif elenir, beş kalem
kapsam görüşmesine taşınır. Keşif aşamasının çıktısı tek bir liste değil, **üç ayrı listedir**;
üçünü tek listeye indiren bir rapor ya çalışılamayacak kalemi çalışır ya da çalışılması gereken
kalemi atar.

#### Dışarıdan Görünmeyen Dört Kalem

Son satır ölçümün üst sınırını verir. Envanterde on üç kalem vardır, açık kaynak istihbaratı
bunların **dokuzunu** görür — **%69,2**. İç ağ yönetim ucu, yedekleme ucu, ölçüm deposu ve kimlik
deposu hiçbir halka açık kalemde geçmez.

Bu dört kalem yokluklarıyla iki şey söyler. Birincisi, açık kaynak istihbaratının kapsaması
kurumun **dışa dönük yüzüyle** sınırlıdır; içeride duran ve dışarıya hiçbir imza bırakmayan
varlıklar bu aşamada listeye girmez. İkincisi, bu aşamada üretilen liste bir **envanter** değil,
envanterin dışarıdan görünen bir izdüşümüdür. Kapsam sahibinin verdiği envanterle
karşılaştırılamayan bir değerlendirmede bu %69,2 hiç bilinmez; bilinen tek şey yirmi adaydır ve
o yirminin dokuzunun kanıt olduğu ancak hakem varken söylenebilir.

#### Özet

- Bu kursun ölçü birimi aday değil kanıttır: 29 halka açık kalem 26 anma ve 20 benzersiz aday
  üretti; 9'u kanıt, 5'i ipucu, 6'sı yanlış pozitiftir (%30,0).
- Kaynak türleri arasındaki isabet farkı büyüktür: sertifika kaydı %83 kanıt üretirken arşiv
  kopyası %0 üretir ve dört anmasının üçü yanlış pozitiftir.
- Altı kaynak türünden beşi hedefte sıfır kayıt bırakır; kurumun kendi ucundan alınan 12 kalem
  12 erişim kaydı ve **0 uyarı** üretir — bu aşama eşik altında kalır.
- Doğrulama bedeli kanıt başına 5,00 adımdır ve eşit dağılmaz: sertifika kaydı 1,20 adım, arşiv
  kopyası 12 adım harcayıp hiçbir kanıt üretmez.
- Dört kaynaktan sonra kanıt sayısı 9'da sabitlenir; son iki kaynak 7 aday, 0 kanıt, 4 yanlış
  pozitif ve 12 kayıt ekler, isabeti %69'dan %45'e düşürür.
- Envanterin 13 kaleminden yalnız 9'u dışarıdan görünür (%69,2); dört kalem hiçbir halka açık
  kaynakta geçmez.

#### Sonraki Adım

Yirmi adayın dokuzunu kanıt, altısını yanlış pozitif diye ayıran şey bu derste dışarıdan gelen
bir hakemdi: kapsam sahibinin onayladığı envanter. Gerçek bir değerlendirmede o envanter
değerlendirmenin **çıktısıdır**, girdisi değil. O halde soru şu: hakem olmadan bir adayın kuruma
ait olduğu nasıl gösterilir?

Bir kısmı için gösterilebilir. Alan adı ve kayıt sistemleri, bir adı kimin denetlediğine dair
doğrulanabilir izler taşır; bazı kayıtları yalnız adın sahibi yazabilir, bazıları ise adı
barındıran üçüncü tarafa işaret eder ve sahiplik hakkında hiçbir şey kanıtlamaz. Sonraki ders
kayıtları **envanter kanıtı** olarak ele alır: aynı yirmi aday kayıt sorgulamasından geçirilir,
kaçının sahipliği kanıtlanabildiği, kaçının yalnız ipucu düzeyinde kaldığı ve bu sorgulamanın
hedef tarafta kaç kayıt bıraktığı sayılır.

### Alan Adı ve Kayıt Sorgulama

Source: https://academia.sh/tr/kurslar/sizma-testi/alan-adi-ve-kayit-sorgulama

Kaydın kanıt gücünü ölçmek: 20 adayda dört kayıt ölçütünün isabetinin %100 ile %25 arasında değişmesi, güçlü üç ölçütün 10 adayı ayırıp 8 kanıtı sıfır yanlış pozitifle yakalaması, zayıf dördüncü ölçütün 0 yeni kanıt getirip isabeti %80'den %62'ye düşürmesi, sessiz kalan 10 adayın %60'ının yanlış pozitif ama birinin gerçek varlık olması ve önbellek yolunun 0 kayıt bırakıp 1 kanıt kaçırarak 2 yanlış pozitif eklemesi.

Önceki ders yirmi adayı dokuz kanıt, beş ipucu ve altı yanlış pozitife ayırdı — ama bu ayrımı
yapan şey dışarıdan gelen bir hakemdi: kapsam sahibinin onayladığı envanter. Gerçek bir
değerlendirmede o envanter çıktıdır, girdi değil. Bu ders hakemsiz bir ayrım dener: adayların
adları sorgulanır ve dönen kayıtların **kanıt gücü** ölçülür.

Kayıt türlerinin ne işe yaradığı ve nasıl yönetildiği Sunucu, Ağ ve Sertleştirme kursunda ele
alındı. Burada ölçülen şey farklıdır: bir kayıt bir **iddia** taşır ve iddianın değeri, o kaydı
kimin yazabildiğine bağlıdır. Bazı kayıtları yalnız adı denetleyen taraf oluşturabilir; bazıları
adı barındıran üçüncü tarafın işidir ve sahiplik hakkında hiçbir şey söylemez.

#### Kayıt Bir İddiadır, Kanıt Değildir

**KS4:** her aday için dört bilgi tutulur — hakemin verdiği gerçek sınıf, tescil kaydında kurum
adının görünüp görünmediği, yalnız adı denetleyen tarafın yazabileceği doğrulama kaydının var olup
olmadığı ve adın çözümlendiği adres bloğu. **KS5:** bir *ölçüt*, adayı kanıt sayan bir kuraldır;
iki sayıyla anılır — **isabet** (tetiklediği adayların kaçı gerçekten kanıt) ve **kapsama** (bütün
kanıtların kaçını yakalıyor). **KS6:** önbellekten gelen yanıt hedefte hiçbir kayıt bırakmaz ama
eskimiş olabilir; yetkili sunucuya doğrudan sorulan yanıt tazedir ve her sorgu bir kayıt bırakır.

Bu sorgulama yetkilendirilmiş bir değerlendirmenin parçasıdır ve yalnız kapsam tanımındaki
adlarla sınırlıdır.

```js
// kesif/kayit.mjs — 01'in yirmi adayi icin kurgu kayit sorgulama sonucu (model): gercek alan
// adi, gercek adres ve gercek tescil kaydi yok. Rastgelelik yok.

// KS4: her satir bir aday icin dort seyi tasir — kapsam sahibinin envanterine gore gercek sinif
// (hakem), tescil kaydinda kurum adinin gorunup gorunmedigi, yalniz adi denetleyen tarafin
// yazabilecegi dogrulama kaydinin var olup olmadigi ve adin cozumlendigi adres blogu.
// Blok A kuruma ayrilmis, B ortak barindirma, C ucuncu taraf, "-" cozumlenmiyor demektir.
// "bolge" adin yanitini kimin verdigini, "eski" ise onbellekteki eskimis blok degerini soyler.
export const ADAY = `
  abone-portali          kanit    1 1 A kurum -
  saha-uygulamasi        kanit    1 1 A kurum -
  sube-vpn-ucu           kanit    1 0 A kurum -
  toplayici-ag-gecidi    kanit    0 0 A kurum C
  rapor-ucu              kanit    1 1 A kurum -
  test-portali           kanit    0 0 C kurum -
  ortak-arayuzu          kanit    1 0 B kurum -
  is-emri-ucu            kanit    1 1 A kurum -
  sayac-guncelleme-ucu   kanit    0 1 A kurum -
  eski-abone-portali     ipucu    1 0 C kurum -
  pazarlama-sayfasi      ipucu    0 0 C kurum -
  bulut-depolama-kovasi  ipucu    0 0 C dis   -
  kimlik-saglayici-ucu   ipucu    0 1 C dis   -
  egitim-ortami          ipucu    0 0 B kurum -
  odeme-saglayici-ucu    yanlisP  0 0 C dis   -
  eski-saha-uygulamasi   yanlisP  0 0 B dis   -
  yedek-alan-adi         yanlisP  0 0 - dis   -
  bayi-portali           yanlisP  0 0 B dis   -
  destek-portali         yanlisP  0 0 C dis   A
  eski-rapor-ucu         yanlisP  0 0 - kurum A`
  .trim().split("\n").map((r) => {
    const [ad, sinif, tescil, sahiplik, blok, bolge, eski] = r.trim().split(/\s+/);
    return { ad, sinif, tescil: +tescil, sahiplik: +sahiplik, blok, bolge, eski };
  });

// KS5: bir kural, adayi kanit sayan bir olcuttur. Isabet = tetiklenen adaylarin kaci gercekten
// kanit; kapsama = butun kanitlarin kaci bu kuralla bulunuyor.
export const KURAL = [
  { ad: "sahiplik kaydi", f: (a, b) => a.sahiplik === 1 },
  { ad: "tescil kaydi", f: (a, b) => a.tescil === 1 },
  { ad: "kuruma ayrilmis blok", f: (a, b) => b === "A" },
  { ad: "ortak barindirma blogu", f: (a, b) => b === "B" },
];

// KS6: onbellekten gelen yanit hedefte kayit birakmaz ama eskimis olabilir; yetkili sunucuya
// dogrudan sorulan yanit tazedir ve kurum bolgesindeki her ad icin iki kayit birakir.
export const blokOf = (a, yol) => (yol === "onbellek" && a.eski !== "-" ? a.eski : a.blok);
export const KANIT = ADAY.filter((a) => a.sinif === "kanit").length;
```

```js
// kesif/sahiplik.mjs — hangi kayit sahipligi kanitliyor, hangisi yalniz ipucu birakiyor.
import { ADAY, KURAL, KANIT, blokOf } from "./kayit.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 say = (l, s) => l.filter((a) => a.sinif === s).length;
const oran = (l) => l.length ? ((say(l, "kanit") / l.length) * 100).toFixed(0) : "-";

console.log(`${ADAY.length} aday, ${KANIT} kanit, ${say(ADAY, "ipucu")} ipucu, ` +
  `${say(ADAY, "yanlisP")} yanlis pozitif; ${KURAL.length} kayit olcutu, aday basina 3 sorgu`);

const A = [-24, 7, 7, 7, 9, 9, 10];
console.log("\n1. kayit olcutu basina isabet ve kapsama");
yaz(A, "olcut", "aday", "kanit", "ipucu", "yanlisP", "isabet %", "kapsama %");
for (const k of KURAL) {
  const l = ADAY.filter((a) => k.f(a, a.blok));
  yaz(A, k.ad, l.length, say(l, "kanit"), say(l, "ipucu"), say(l, "yanlisP"), oran(l),
    ((say(l, "kanit") / KANIT) * 100).toFixed(1));
}

const B = [-32, 7, 7, 7, 9, 9, 10];
console.log("\n2. olcutler birlestikce (guclu olcutten zayifa)");
yaz(B, "kume", "aday", "kanit", "ipucu", "yanlisP", "isabet %", "kapsama %");
const kume = [];
for (const k of KURAL) {
  kume.push(k);
  const l = ADAY.filter((a) => kume.some((x) => x.f(a, a.blok)));
  yaz(B, `+ ${k.ad}`, l.length, say(l, "kanit"), say(l, "ipucu"), say(l, "yanlisP"), oran(l),
    ((say(l, "kanit") / KANIT) * 100).toFixed(1));
}

const guclu = KURAL.slice(0, 3);
const tetiklenen = ADAY.filter((a) => guclu.some((k) => k.f(a, a.blok)));
const sessiz = ADAY.filter((a) => !guclu.some((k) => k.f(a, a.blok)));
const C = [-32, 7, 7, 7, 9, 10];
console.log("\n3. ilk uc olcutun ayirdigi iki liste");
yaz(C, "liste", "aday", "kanit", "ipucu", "yanlisP", "yanlisP %");
for (const [ad, l] of [["tetiklenen", tetiklenen], ["hicbir olcut tetiklenmeyen", sessiz]])
  yaz(C, ad, l.length, say(l, "kanit"), say(l, "ipucu"), say(l, "yanlisP"),
    ((say(l, "yanlisP") / l.length) * 100).toFixed(1));
console.log("tetiklenmeyen kanit: " +
  sessiz.filter((a) => a.sinif === "kanit").map((a) => a.ad).join(", "));

const D = [-26, 9, 7, 9, 8, 8, 10];
console.log("\n4. iki sorgulama yolu: iz ile kesinlik");
yaz(D, "yol", "hedefte", "uyari", "eskimis", "kanit", "yanlisP", "isabet %");
for (const yol of ["onbellek", "dogrudan"]) {
  const l = ADAY.filter((a) => guclu.some((k) => k.f(a, blokOf(a, yol))));
  const kayit = yol === "dogrudan"
    ? ADAY.filter((a) => a.bolge === "kurum").length * 2 : 0;
  const eskimis = yol === "onbellek" ? ADAY.filter((a) => a.eski !== "-").length : 0;
  yaz(D, yol, kayit, 0, eskimis, say(l, "kanit"), say(l, "yanlisP"), oran(l));
}
const oy = ADAY.filter((a) => guclu.some((k) => k.f(a, blokOf(a, "onbellek"))));
console.log(`onbellek yolunda kacan kanit: ` +
  tetiklenen.filter((a) => !oy.includes(a)).map((a) => a.ad).join(", ") +
  `; eklenen yanlis pozitif: ` +
  oy.filter((a) => !tetiklenen.includes(a)).map((a) => a.ad).join(", "));
```

```
20 aday, 9 kanit, 5 ipucu, 6 yanlis pozitif; 4 kayit olcutu, aday basina 3 sorgu

1. kayit olcutu basina isabet ve kapsama
olcut                      aday  kanit  ipucu  yanlisP isabet % kapsama %
sahiplik kaydi                6      5      1        0       83      55.6
tescil kaydi                  7      6      1        0       86      66.7
kuruma ayrilmis blok          7      7      0        0      100      77.8
ortak barindirma blogu        4      1      1        2       25      11.1

2. olcutler birlestikce (guclu olcutten zayifa)
kume                               aday  kanit  ipucu  yanlisP isabet % kapsama %
+ sahiplik kaydi                      6      5      1        0       83      55.6
+ tescil kaydi                        9      7      2        0       78      77.8
+ kuruma ayrilmis blok               10      8      2        0       80      88.9
+ ortak barindirma blogu             13      8      3        2       62      88.9

3. ilk uc olcutun ayirdigi iki liste
liste                              aday  kanit  ipucu  yanlisP yanlisP %
tetiklenen                           10      8      2        0       0.0
hicbir olcut tetiklenmeyen           10      1      3        6      60.0
tetiklenmeyen kanit: test-portali

4. iki sorgulama yolu: iz ile kesinlik
yol                         hedefte  uyari  eskimis   kanit yanlisP  isabet %
onbellek                          0      0        3       7       2        64
dogrudan                         26      0        0       8       0        80
onbellek yolunda kacan kanit: toplayici-ag-gecidi; eklenen yanlis pozitif: destek-portali, eski-rapor-ucu
```

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

#### Dört Ölçüt, Dört Ayrı İsabet

Birinci tablo dört ölçütü aynı yirmi aday üzerinde koşturur ve isabetleri **%100 ile %25 arasında**
dağılır. Bu aralık dersin ana bulgusudur: "kayıt sorgulaması yapıldı" cümlesi hiçbir şey söylemez,
çünkü hangi kaydın hangi iddiayı taşıdığı ölçütten ölçüte değişir.

Kuruma ayrılmış adres bloğu ölçütü yedi adayı tetikler ve **yedisi de kanıttır** — %100 isabet.
Nedeni yapısaldır: bir adres bloğu bir kuruma tahsis edilmişse, o bloğa çözümlenen adın başka bir
kuruma ait olması için bloğun sahibinin işbirliği gerekir. Tescil kaydı %86, sahiplik kaydı %83
isabetle onu izler; ikisi de kanıt üretir ama ikisinin de kapsaması yarıdan biraz fazladır.

Dördüncü ölçüt tersini gösterir. Ortak barındırma bloğu dört adayı tetikler; **biri kanıt, biri
ipucu, ikisi yanlış pozitiftir** — %25 isabet. Ortak bir barındırma bloğunda yüzlerce kurumun adı
aynı adrese çözümlenir; "aynı adrese çözümleniyor" bilgisi orada sahiplik hakkında neredeyse
hiçbir şey söylemez. Aynı biçimdeki iki gözlem — bir ad bir adrese çözümlenir — bloğun cinsine
göre kanıt ile gürültü arasında dört kat fark taşır.

Sahiplik kaydı ölçütünün tetiklediği tek ipucu kalemi ayrıca öğreticidir. `kimlik-saglayici-ucu`
üzerinde geçerli bir sahiplik kaydı vardır; kurum o adı denetlediğini kanıtlamıştır. Kalem yine de
kanıt değildir, çünkü kayıt **adın** denetimini kanıtlar, **varlığın** kime ait olduğunu değil.
Ad kurumun, üzerinde çalışan hizmet üçüncü tarafındır.

#### Birleştirmenin Getirisi Nerede Duruyor

İkinci tablo ölçütleri güçlüden zayıfa doğru birleştirir. İlk üç ölçütün birleşimi **10 adayı**
tetikler ve içinde 8 kanıt, 2 ipucu, **0 yanlış pozitif** vardır: isabet %80, kapsama %88,9.
Dördüncü ölçüt eklendiğinde aday 13'e çıkar, kanıt **8'de kalır**, yanlış pozitif 0'dan 2'ye
yükselir ve isabet %62'ye düşer.

Bu, önceki dersteki eğrinin aynısıdır ve buradaki biçimi daha katıdır: zayıf ölçüt **hiçbir yeni
kanıt getirmez**, yalnız eleme yükü ekler. Kapsama sütunu iki satırda da %88,9'dur. Bir ölçüt
kümesine yeni kural eklerken sorulacak soru "daha çok aday buluyor mu" değil, "**kapsamayı
artırıyor mu**" olmalıdır; bu tabloda dördüncü ölçütün kapsamaya katkısı sıfırdır.

#### Sessiz Kalan On Aday

Üçüncü tablo listenin öteki yarısını gösterir. Güçlü üç ölçütten hiçbiri **10 aday** için
tetiklenmez ve bu on adayın **6'sı yanlış pozitiftir** — %60. Yani kayıt sorgulaması bir eleme
aracı olarak gerçekten çalışır: altı yanlış pozitifin **altısı da** bu sessiz listededir, hiçbiri
kanıt listesine sızmamıştır.

Karşılığında bir gerçek varlık kaybedilir. `test-portali` kuruma aittir, envanterde durur ve
hiçbir ölçüt onu tetiklemez: üçüncü tarafta barındırıldığı için özel blokta değildir, tescil
kaydında görünmez ve üzerinde sahiplik kaydı yoktur. Kayıt sorgulaması bu adaya "hakkında bir şey
söyleyemem" der ve ikili bir eleme kuralı bunu "kuruma ait değil" diye okur.

Sayısal özet şudur: dokuz kanıtın sekizi kayıtla doğrulanabilir (%88,9), biri doğrulanamaz ve
sessiz listeye düşer. Sessiz liste **atılacak bir liste değil, ayrı bir listedir**; içinde
oranı %60 olan gürültünün yanında oranı %10 olan gerçek varlık durur.

#### İz ile Tazelik Arasındaki Takas

Dördüncü tablo bu kursun iz sütununu ikinci kez açar ve ilk kez bir **takas** gösterir.
Sorgular bir ara çözümleyicinin önbelleğinden karşılanırsa hedefte **0 kayıt** kalır; hedefin
yetkili sunucusuna doğrudan sorulursa kurum bölgesindeki on üç ad için ikişer sorgu, yani **26
kayıt** oluşur.

Bedava görünen yol bedava değildir. Önbellekte üç eskimiş yanıt vardır ve sonuç üç yerde
bozulur: `toplayici-ag-gecidi` kanıt olmaktan çıkar (eski yanıt onu üçüncü taraf bloğunda
gösterir), `destek-portali` ile `eski-rapor-ucu` ise eskimiş kayıtları yüzünden kuruma ayrılmış
blokta görünür ve **yanlış pozitif olarak kanıt listesine girer**. İsabet %80'den %64'e düşer.

İki yol arasındaki seçim bu kursta tekrar tekrar karşılaşılacak biçimi taşır: **iz bırakmamak
kesinlikten vazgeçmektir**. Mavi takım açısından okunuşu da simetriktir — yetkili sunucudaki 26
kayıt hiçbir uyarı üretmez, çünkü ad sorgusu ağın en sıradan olayıdır. Bu adım savunma tarafında
görünür ama fark edilmez; fark edilmesi, sorguların **hangi adları** ve hangi sırayla hedeflediğinin
sonradan ilişkilendirilmesine bağlıdır.

#### Altmış Sorgunun Bedeli

Yirmi adayın her biri üç sorgu gerektirdi: tescil kaydı, adres ve sahiplik kaydı. Toplam **60
sorgu** sekiz kanıt üretti — kanıt başına **7,5 sorgu**. Önceki dersin doğrulama bedeli kanıt
başına 5,00 adımdı; bu ders o bedelin üstüne çıkar ve karşılığında bir şey kazandırır: önceki
dersin dokuz kanıtı hakemden okunuyordu, bu dersin sekizi **kendi kendini doğruluyor**.

Bedelin dağılımı da eşit değildir. Kayıt vermeyen on aday da üç sorguluk payını harcar; sessiz
listenin toplam bedeli 30 sorgudur ve karşılığında **sıfır kanıt** üretir. Doğrulama bütçesinin
yarısı, sonucu "bilinmiyor" olan bir listeye gider — ve bu harcama gereksiz değildir, çünkü altı
yanlış pozitifi listeden düşüren şey odur.

Kapsam açısından ayrıca ayırt edilmesi gereken bir sınır vardır: yirmi addan **yedisi** kurumun
bölgesi dışındadır. Bu adları sorgulamak halka açık veriyi okumaktır ve kapsam sorunu üretmez;
o adlar üzerinde **işlem yapmak** ise kapsamın dışına çıkmaktır. Sorgulamanın serbest olduğu bir
kalem, üzerinde çalışılmasının serbest olduğu bir kalem değildir.

#### Özet

- Kayıt bir iddia taşır ve iddianın gücü kaydı kimin yazabildiğine bağlıdır: dört ölçütün isabeti
  %100, %86, %83 ve %25'tir.
- Kuruma ayrılmış adres bloğu ölçütü 7 adayın 7'sinde doğrudur; ortak barındırma bloğu 4 adayın
  yalnız 1'inde — aynı biçimdeki gözlem bloğun cinsine göre dört kat farklı değer taşır.
- Sahiplik kaydı adın denetimini kanıtlar, varlığın sahipliğini değil: geçerli sahiplik kaydı
  taşıyan bir aday üçüncü tarafın hizmetidir ve kanıt sayılmaz.
- Güçlü üç ölçütün birleşimi 10 adayı tetikler, 8 kanıt yakalar ve 0 yanlış pozitif üretir;
  dördüncü ölçüt 3 aday ve 2 yanlış pozitif ekler, 0 yeni kanıt getirir, isabeti %80'den %62'ye
  düşürür.
- Hiçbir ölçütün tetiklenmediği 10 adayın 6'sı yanlış pozitiftir (%60) ama biri gerçek varlıktır;
  sessiz liste atılacak liste değil, ayrı bir listedir.
- Önbellek yolu hedefte 0 kayıt bırakır, 3 eskimiş yanıt yüzünden 1 kanıt kaçırır ve 2 yanlış
  pozitif ekler; doğrudan yol 26 kayıt bırakır, 0 uyarı üretir ve isabeti %80'de tutar.

#### Sonraki Adım

Buraya kadar aday listesi hazır geldi: yirmi ad önceki dersin halka açık kalemlerinden çıkmıştı
ve bu ders yalnız onları sınıflandırdı. Oysa liste kapalı bir küme değildir. Bir kurumun alan
adının altında, hiçbir halka açık belgede geçmeyen ve hiçbir sayfada bağlantısı bulunmayan adlar
olabilir; onları bulmanın yolu belgeleri okumak değil, **ad uzayını taramaktır**.

Bu tarama iki yeni sayı üretir. Birincisi kapsamadır: farklı keşif yöntemleri aynı ad uzayında kaç
aday çıkarır, kaçında örtüşür, hangisi tek başına yeterlidir. İkincisi bu kursun en dikkat çeken
kalemidir: bulunan adların bir kısmı **artık var olmayan bir hedefe** işaret eder — kaydı duran,
karşılığı düşmüş, sahibi belirsiz kalemler. Sonraki ders alt alan ve varlık keşfini bu iki eksende
ölçer ve her yöntemin savunmada kaç kayıt bıraktığını sayar.

### Alt Alan ve Varlık Keşfi

Source: https://academia.sh/tr/kurslar/sizma-testi/alt-alan-ve-varlik-kesfi

Ad uzayında sahipsiz kalemi saymak: 24 bölge kaydının 7'sinin artık yanıt vermeyen bir hedefe işaret etmesi, üç yöntemin kapsamasının %66,7 ile %29,2 arasında değişmesi, iz bırakmayan yöntemin en çok adayı bulması, 120 denemelik yöntemin kayıt başına 8,57 iz üretmesi, bağlı kalem çıkarımının hiçbir sahipsiz kalem bulamaması, 4 uyarı üreten isteğin 0 aday getirmesi ve birleşimin 21 kaydı bulup 3'ünü hiç görmemesi.

Önceki iki ders kapalı bir liste üzerinde çalıştı: yirmi aday halka açık kalemlerden çıkmış ve
kayıt sorgulamasıyla sınıflandırılmıştı. Bir kurumun alan adının altında ise hiçbir belgede
geçmeyen, hiçbir sayfada bağlantısı bulunmayan adlar durur. Bu ders o adları arar ve ararken iki
şeyi birlikte sayar: yöntemlerin kapsamasını ve **artık var olmayan bir hedefe işaret eden**
kayıtları.

Bölge dosyasının bir envanter olarak tutulması ve öksüz kayıtların temizlenmesi Sunucu, Ağ ve
Sertleştirme kursunda bölgenin sahibi açısından ele alınmıştı. Burada aynı bölgeye **dışarıdan**
bakılır: sahibi bilmediği için temizlemediği kalem, değerlendirmeyi yapan tarafın listesinde bir
aday olarak durur.

#### Sahipsiz Kayıt ve Unutulmuş Kalem

**KS7:** her ad üç şey taşır — hedefinin yanıt verip vermediği, envanterde olup olmadığı ve
sorumlu ekibi. Hedefi yanıt vermeyen kayıt **sahipsizdir**: kayıt durur, karşılığı düşmüştür.
Hedefi yanıt veren ama sorumlusu olmayan kayıt **unutulmuştur**: çalışır, ama kimse ondan sorumlu
değildir. **KS8:** bir yöntem bir aday kümesi üretir; adayın bölgede karşılığı yoksa yanlış
pozitiftir. **KS9:** yöntemin izi, hedefte bıraktığı kayıt ve tetiklediği uyarı sayısıdır; deneme
sayısı iz üretse de aday üretmeyebilir.

Bu adımların hepsi kapsam tanımındaki alan adıyla sınırlıdır ve yazılı yetkinin dışına çıkan bir
ad uzayında yapılamaz.

```js
// kesif/bolge.mjs — kurgu bir olcum aginin alt alan kayitlari ve uc kesif yonteminin bulgusu
// (model): gercek alan adi, gercek ad sunucusu ve gercek hedef yok. Rastgelelik yok.

// KS7: her satir bir addir — hedefinin yanit verip vermedigi, envanterde olup olmadigi, sorumlu
// ekibi ve onu bulan yontemler. Hedefi yanit vermeyen kayit sahipsiz, hedefi yanit veren ama
// sorumlusu olmayan kayit unutulmus sayilir. Son sutunda p pasif kayit derlemesi, s sozluk
// denemesi, b bagli kalem cikarimidir; "-" o yontemin bulamadigini gosterir.
export const AD = `
  abone       var      1 portal     psb
  saha        var      1 saha       psb
  vpn         var      1 ag         ps-
  toplayici   var      1 olcum      p--
  rapor       var      1 veri       psb
  test        var      1 portal     psb
  ortak       var      1 portal     p-b
  is-emri     var      1 saha       p-b
  sayac       var      1 olcum      p--
  eski-abone  var      0 -          p--
  pazarlama   var      0 pazarlama  -sb
  egitim      var      0 -          -s-
  demo        yok      0 -          ps-
  eski-rapor  yok      0 -          p--
  kampanya-2  yok      0 -          p--
  arsiv       yok      0 -          ps-
  staging     var      0 veri       ps-
  yedek       yok      1 ag         -s-
  izleme      var      1 ag         ps-
  gunluk      var      1 veri       -s-
  anket       yok      0 -          -s-
  eski-saha   yok      0 -          ---
  sube-1      var      1 ag         ---
  sube-2      var      1 ag         ---
  kampanya-1  kayitsiz 0 -          p--`
  .trim().split("\n").map((r) => {
    const [ad, hedef, env, sahip, bulan] = r.trim().split(/\s+/);
    return { ad, hedef, env: +env, sahip, bulan };
  });

// KS8: bir yontem bir aday kumesi uretir; adayin bolgede karsiligi yoksa yanlis pozitiftir.
// KS9: yontemin izi hedefte biraktigi kayit ve tetikledigi uyaridir. Deneme sayisi iz uretse de
// aday uretmeyebilir: bolge aktarim istegi dort ad sunucusunda reddedilir ve hicbir ad vermez.
export const YONTEM = [
  { kod: "p", ad: "pasif kayit derlemesi", deneme: 0, kayit: 0, uyari: 0 },
  { kod: "s", ad: "sozluk denemesi", deneme: 120, kayit: 120, uyari: 1 },
  { kod: "b", ad: "bagli kalem cikarimi", deneme: 12, kayit: 12, uyari: 0 },
  { kod: "z", ad: "bolge aktarim istegi", deneme: 4, kayit: 4, uyari: 4 },
];

export const KAYIT = AD.filter((a) => a.hedef !== "kayitsiz");
export const bulur = (y, a) => a.bulan.includes(y.kod);
export const sahipsiz = (a) => a.hedef === "yok";
export const unutulmus = (a) => a.hedef === "var" && a.sahip === "-";
```

```js
// kesif/varlik.mjs — uc kesif yontemi ayni ad uzayinda: kac aday, kac sahipsiz kalem, kac iz.
import { AD, YONTEM, KAYIT, bulur, sahipsiz, unutulmus } from "./bolge.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 SAHIPSIZ = KAYIT.filter(sahipsiz).length;

console.log(`${KAYIT.length} bolge kaydi: ${KAYIT.filter((a) => a.hedef === "var").length} ` +
  `hedefi yanit veriyor, ${SAHIPSIZ} sahipsiz, ${KAYIT.filter(unutulmus).length} unutulmus, ` +
  `${KAYIT.filter((a) => !a.env && a.hedef === "var").length} envanter disi`);

const A = [-23, 9, 7, 8, 9, 10, 10];
console.log("\n1. yontem basina aday ve sahipsiz kalem");
yaz(A, "yontem", "deneme", "aday", "dogru", "yanlisP", "sahipsiz", "kapsama %");
for (const y of YONTEM) {
  const l = AD.filter((a) => bulur(y, a));
  const d = l.filter((a) => a.hedef !== "kayitsiz");
  yaz(A, y.ad, y.deneme, l.length, d.length, l.length - d.length, d.filter(sahipsiz).length,
    ((d.length / KAYIT.length) * 100).toFixed(1));
}

const B = [-23, 8, 8, 11, 15, 12];
console.log("\n2. yontemin biraktigi iz");
yaz(B, "yontem", "kayit", "uyari", "kayit/aday", "kayit/sahipsiz", "aday/deneme");
for (const y of YONTEM) {
  const d = AD.filter((a) => bulur(y, a) && a.hedef !== "kayitsiz");
  const sz = d.filter(sahipsiz).length;
  yaz(B, y.ad, y.kayit, y.uyari, d.length ? (y.kayit / d.length).toFixed(2) : "-",
    sz ? (y.kayit / sz).toFixed(2) : "-",
    y.deneme ? (d.length / y.deneme).toFixed(2) : "-");
}
const IZ = YONTEM.reduce((t, y) => t + y.kayit, 0);
const UY = YONTEM.reduce((t, y) => t + y.uyari, 0);

const C = [-23, 9, 9, 11, 11];
console.log("\n3. birlesim ve ortusme");
yaz(C, "kume", "aday", "dogru", "sahipsiz", "kapsama %");
const kume = [];
for (const y of YONTEM) {
  kume.push(y);
  const l = AD.filter((a) => kume.some((x) => bulur(x, a)));
  const d = l.filter((a) => a.hedef !== "kayitsiz");
  yaz(C, `+ ${y.ad}`, l.length, d.length, d.filter(sahipsiz).length,
    ((d.length / KAYIT.length) * 100).toFixed(1));
}
const kac = (a) => YONTEM.filter((y) => bulur(y, a)).length;
const D = [-23, 9, 11, 12];
console.log("\n4. kac yontemden cikiyor");
yaz(D, "yontem sayisi", "kayit", "sahipsiz", "unutulmus");
for (const n of [0, 1, 2, 3]) {
  const l = KAYIT.filter((a) => kac(a) === n);
  yaz(D, `${n} yontem`, l.length, l.filter(sahipsiz).length, l.filter(unutulmus).length);
}
const bulunan = KAYIT.filter((a) => kac(a) > 0);
console.log(`hicbir yontemin bulamadigi kayit: ` +
  KAYIT.filter((a) => !kac(a)).map((a) => a.ad).join(", "));
console.log(`birlesim ${bulunan.length}/${KAYIT.length} kaydi (%` +
  `${((bulunan.length / KAYIT.length) * 100).toFixed(1)}) ve ` +
  `${bulunan.filter(sahipsiz).length}/${SAHIPSIZ} sahipsiz kalemi buluyor; ` +
  `toplam iz ${IZ} kayit, ${UY} uyari`);
```

```
24 bolge kaydi: 17 hedefi yanit veriyor, 7 sahipsiz, 2 unutulmus, 4 envanter disi

1. yontem basina aday ve sahipsiz kalem
yontem                    deneme   aday   dogru  yanlisP  sahipsiz kapsama %
pasif kayit derlemesi          0     17      16        1         4      66.7
sozluk denemesi              120     14      14        0         4      58.3
bagli kalem cikarimi          12      7       7        0         0      29.2
bolge aktarim istegi           4      0       0        0         0       0.0

2. yontemin biraktigi iz
yontem                    kayit   uyari kayit/aday kayit/sahipsiz aday/deneme
pasif kayit derlemesi         0       0       0.00           0.00           -
sozluk denemesi             120       1       8.57          30.00        0.12
bagli kalem cikarimi         12       0       1.71              -        0.58
bolge aktarim istegi          4       4          -              -        0.00

3. birlesim ve ortusme
kume                        aday    dogru   sahipsiz  kapsama %
+ pasif kayit derlemesi       17       16          4       66.7
+ sozluk denemesi             22       21          6       87.5
+ bagli kalem cikarimi        22       21          6       87.5
+ bolge aktarim istegi        22       21          6       87.5

4. kac yontemden cikiyor
yontem sayisi              kayit   sahipsiz   unutulmus
0 yontem                       3          1           0
1 yontem                       9          4           2
2 yontem                       8          2           0
3 yontem                       4          0           0
hicbir yontemin bulamadigi kayit: eski-saha, sube-1, sube-2
birlesim 21/24 kaydi (%87.5) ve 6/7 sahipsiz kalemi buluyor; toplam iz 136 kayit, 5 uyari
```

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

#### Yedi Sahipsiz Kayıt

Yirmi dört bölge kaydının **7'si sahipsizdir**: kayıt durur, işaret ettiği hedef yanıt vermez.
Oran %29,2'dir — bölgedeki her üç kayıttan biri bir hiçe bakar. Bunların yanında hedefi yanıt
veren ama sorumlusu olmayan **2 unutulmuş kalem** ve envanterde hiç geçmeyen ama çalışan **4
kalem** vardır.

Bu üç sınıfın değerlendirme açısından ağırlığı aynı değildir. Envanter dışı dört kalem bir kapsam
sorunudur: çalışıyorlar, kuruma hizmet ediyorlar, ama kapsam görüşmesinde adları geçmemiş.
Unutulmuş iki kalem bir sorumluluk boşluğudur: bir bulgu çıkarsa raporun kime yazılacağı belirsiz
kalır. Sahipsiz yedi kayıt ise en dikkat çekici olanıdır, çünkü **bir kayıt bir adı bir hedefe
bağlama sözüdür** ve hedef ortadan kalktığında o söz, sözü sahiplenmeye hazır başka bir tarafa
açık kalır. Kaydı sürdüren taraf kurumdur; hedefi sağlayan taraf artık kimse değildir.

#### Üç Yöntem, Üç Ayrı Kapsama

Birinci tablo üç yöntemi aynı ad uzayında koşturur. Pasif kayıt derlemesi 17 aday üretir,
16'sının bölgede karşılığı vardır ve kapsaması **%66,7**'dir. Sözlük denemesi 14 aday üretir ve
%58,3 kapsar. Bağlı kalem çıkarımı yalnız 7 aday üretir — **%29,2**.

Fark yöntemlerin kalitesinden değil, **neye baktıklarından** gelir. Bağlı kalem çıkarımı bir
sayfadan öteki sayfaya giden bağlantıları izler; bir ad ancak biri ona bağlantı verdiyse bulunur.
Sahipsiz kalemler tam olarak kimsenin bağlantı vermediği kalemlerdir, bu yüzden bu yöntem **yedi
sahipsiz kaydın hiçbirini** bulamaz. Aynı sütunda pasif derleme 4, sözlük denemesi 4 sahipsiz
kalem çıkarır. Bir yöntem "en az adayı üreten" olduğu için değil, **aradığı sınıfa yapısal olarak
kör olduğu** için elenir.

Yanlış pozitif sütunu tek bir kalemde doludur. Pasif derlemenin ürettiği `kampanya-1` bölgede hiç
yoktur: geçmişte bir sertifika kaydına girmiş, ad sonradan bölgeden kaldırılmıştır. Pasif
kaynakların bu özelliği bir önceki dersteki arşiv kopyasıyla aynıdır — geçmişte doğru olan bir şey
bugün doğru olmak zorunda değildir.

#### Yüz Yirmi Deneme, On Dört Ad

İkinci tablo bu kursun iz sütununu ilk kez bir yöntem seçimine bağlar. Pasif kayıt derlemesi
hedefte **sıfır kayıt** bırakır ve en çok adayı bulan yöntemdir. Sözlük denemesi 120 deneme yapar,
14 ad bulur ve hedefte **120 kayıt** bırakır; ad başına **8,57 kayıt**, bulduğu sahipsiz kalem
başına **30,00 kayıt**. Bağlı kalem çıkarımı 12 kayıt bırakır ve ad başına 1,71 iz üretir.

Sözlük denemesinin isabet oranı `aday/deneme` sütununda görünür: **0,12**. Yüz yirmi denemenin yüz
altısı boşa gider ve boşa giden denemeler de kayıt bırakır. Savunma tarafından okunuşu şudur:
mavi takımın bu yöntemi fark etmesi, var olan adlara gelen sorgulara değil, **var olmayan adlara
gelen sorguların yoğunluğuna** bakmakla olur. Bu ders boyunca üretilen tek uyarıyı da o yoğunluk
tetikler.

Dördüncü satır dersin en keskin karşılaştırmasıdır. Bölge aktarım isteği dört ad sunucusunda
reddedilir: **0 aday**, 4 kayıt, **4 uyarı**. Toplam beş uyarının dördü, hiçbir ad getirmeyen bu
adımdan gelir. İzin verilmiş olsaydı tek adımda bütün bölgeyi verirdi; verilmediğinde geriye
yalnız iz kalır. Bir adımın beklenen getirisi yüksek diye denenmesi, gerçekleşen getirisi sıfır
olduğunda **yalnızca maliyet** olur.

#### Birleşimin Durduğu Nokta

Üçüncü tablo yöntemleri birleştirir. İlk ikisi birlikte 21 kaydı bulur ve kapsama %66,7'den
**%87,5'e** çıkar; sahipsiz kalem 4'ten 6'ya yükselir. Üçüncü ve dördüncü yöntem eklendiğinde her
üç sayı da **hiç değişmez**. Bağlı kalem çıkarımının bulduğu yedi adın hepsi zaten ilk iki
yöntemden çıkmıştır.

Dördüncü tablo bunu kalem kalem gösterir. Yirmi dört kaydın 4'ü üç yöntemden birden çıkar, 8'i
ikisinden, 9'u yalnız birinden ve **3'ü hiçbirinden**. Tek yöntemden çıkan dokuz kaydın 4'ü
sahipsiz, 2'si unutulmuştur: **kurumun en az farkında olduğu kalemler, en az yöntemin gördüğü
kalemlerdir.** Üç yöntemden birden çıkan dört kaydın hiçbiri sahipsiz ya da unutulmuş değildir;
onlar bölgenin en görünür, en bakımlı adlarıdır.

Hiçbir yöntemin bulamadığı üç kayıt listenin sınırını çizer. `sube-1` ve `sube-2` numaralı adlardır
ve sözlükte karşılıkları yoktur; `eski-saha` hem sahipsizdir hem de hiçbir pasif kayıtta izi
kalmamıştır. Yani yedi sahipsiz kalemin **altısı** bulunur, biri bulunmaz — ve bulunmadığı bu
koşumda ancak hakem envanteri elde olduğu için bilinir. Gerçek bir değerlendirmede bu kaydın
varlığı hiç bilinmez; bilinen tek şey 21 addır.

#### Sahipsiz Kayıt Henüz Bir Kanıt Değildir

Altı sahipsiz kaydın bulunması bu kursun ölçüsüne göre altı **aday** demektir, altı bulgu değil.
Bir kaydın hedefi yanıt vermiyor olabilir çünkü hedef geçici olarak kapalıdır, çünkü ad yalnız
kurum ağının içinden çözümlenir ya da çünkü hedefin bulunduğu alan başka bir tarafça yeniden
sahiplenilebilir durumdadır. Rapora giren bulgu yalnız üçüncü durumdur; ilk ikisi yanlış
pozitiftir ve keşif adımlarının hiçbiri üçünü birbirinden ayıramaz.

Ayrımın bedeli iki kalemdir. Birincisi ek adımdır: her sahipsiz kayıt için hedefin bulunduğu
hizmetin sahiplenmeye açık olup olmadığının sınanması gerekir. İkincisi ve daha kısıtlayıcı olanı
**kapsamdır**: o sınama kurumun altyapısında değil, üçüncü tarafın altyapısında yapılır. Altı
sahipsiz kaydın işaret ettiği hedeflerin hiçbiri kapsam tanımında adı geçen bir varlık değildir.

Bu, önceki derste ipucu sınıfı için yazılan kuralın ikinci karşılaşmasıdır ve burada daha
belirgindir: bir kalemin **bulunması** serbesttir, **doğrulanması** ayrı bir yetki gerektirir.
Altı adayın kaçının kanıta dönüştüğü bu konuda değil, kapsam görüşmesinden sonra belli olur.

#### Özet

- Yirmi dört bölge kaydının 7'si sahipsizdir (%29,2): kayıt durur, hedefi yanıt vermez. Yanında
  2 unutulmuş ve 4 envanter dışı kalem bulunur.
- Üç yöntemin kapsaması %66,7, %58,3 ve %29,2'dir; bağlı kalem çıkarımı yedi sahipsiz kaydın
  hiçbirini bulamaz, çünkü sahipsiz kalem kimsenin bağlantı vermediği kalemdir.
- Pasif kayıt derlemesi hedefte 0 kayıt bırakır ve en çok adayı bulur; tek yanlış pozitifi
  bölgeden kaldırılmış bir addır.
- Sözlük denemesi 120 deneme ile 14 ad bulur (0,12 isabet), ad başına 8,57 ve sahipsiz kalem
  başına 30,00 kayıt bırakır; bu kursun beş uyarısının biri onun yoğunluğundan çıkar.
- Bölge aktarım isteği 0 aday getirir, 4 kayıt ve 4 uyarı bırakır: toplam uyarının %80'i hiçbir
  ad üretmeyen tek adımdan gelir.
- Birleşim iki yöntemden sonra %87,5'te durur; tek yöntemden çıkan 9 kaydın 4'ü sahipsiz, 2'si
  unutulmuştur, üç yöntemden çıkan 4 kaydın hiçbiri değildir.

#### Sonraki Adım

Üç ders sonunda dışarıdan görünen ad listesi hazırdır: yirmi bir ad, altısı sahipsiz. Ne var ki
bir ad bir varlık değildir. `abone` adı bir hedefe çözümlenir, ama o hedefte **ne çalıştığı** bu
ana kadar hiç sorulmadı. Bir kaydın işaret ettiği makine hiçbir bağlantı kabul etmiyor olabilir;
üç servis birden sunuyor olabilir; ya da yalnız kurum ağından erişilebilen bir servisi dışarıya
kapalı tutuyor olabilir. Üçü de aynı kayıtta aynı biçimde görünür.

Bunu ayıran adım, hedefin hangi bağlantı noktalarında yanıt verdiğini sınamaktır ve bu adım önceki
üçünden farklıdır: hedefe **doğrudan** ve **çok sayıda** istek gider. Sonraki ders tarama türlerini
tek bir eksende karşılaştırır — her tür kaç adayı buluyor, kaçını kaçırıyor, savunmada kaç kayıt
ve kaç uyarı üretiyor. Bu derste 136 kayıt ve 5 uyarı biriktirildi; o derste iki sayı da başka bir
büyüklük sınıfına geçer.

### Bağlantı Noktası Tarama

Source: https://academia.sh/tr/kurslar/sizma-testi/baglanti-noktasi-tarama

Tarama türlerini iz ekseninde karşılaştırmak: 96 noktalık uzayda 23 açık noktanın türlere göre %78,3 ile %0 arasında kesinlikle ayrılması, tek yönlü sondanın 21 belirsiz aday ve 3 yanlış pozitif üretmesi, kanıt başına izin 3,13 ile 8,00 kayıt arasında değişmesi, aynı türün yavaşlatıldığında aynı 18 kanıtı aynı 72 kayıtla ama 2 yerine 0 uyarıyla üretmesi ve %91,3 kapsamanın iki türün birleşimini gerektirmesi.

Üç ders sonunda dışarıdan görünen ad listesi hazırdır, ama bir ad bir varlık değildir. Bir kayıt
bir hedefe çözümlenir; o hedefte hiçbir bağlantı kabul edilmiyor da olabilir, üç servis birden
sunuluyor da. İkisi kayıt düzeyinde aynı görünür. Bu ders farkı sınayan adımı ele alır ve önceki
üçünden ayrıldığı nokta şudur: hedefe **doğrudan** ve **çok sayıda** istek gider.

Bu yüzden ölçünün ağırlığı da değişir. Buraya kadar biriken iz 136 kayıt ve 5 uyarıydı. Bu derste
tek bir tarama türü tek başına o sayının yarısını aşabilir. Karşılaştırma bu eksende yapılır: her
tür kaç açık noktayı kesin ayırıyor, kaçını belirsiz bırakıyor, kaçını kaçırıyor ve savunmada kaç
kayıt ile kaç uyarı üretiyor. Bu adım yalnız yazılı yetkinin ve kapsam tanımının kapsadığı uçlarda
yapılabilir; kapsam dışı bir uca gönderilen tek bir istek bile yetkiyi geçersiz kılar.

#### Türü Tanımlayan Şey Ayırdığı Durumdur

Tarama türleri burada araç, komut ya da seçenek olarak değil, **ayırma gücü** olarak anılır. Bir
türü belirleyen şey hangi nokta durumunu kesin ayırdığı, hangisini belirsiz bıraktığıdır.

**KS10:** tarama uzayı uç başına 9 bağlantılı ve 3 bağlantısız noktadır; yaygın nokta listesi uç
başına 4 noktadır. Bir nokta `acik`, `suzulmus` ya da `kapali` durumundadır. **KS11:** bir tür,
uzayının hangi durumunu **kesin** ayırdığı ve hangisini **belirsiz** bıraktığıyla tanımlanır;
belirsiz kalan noktalardan gerçekte açık olmayanlar yanlış pozitiftir. **KS12:** iz üç kalemdir —
her deneme bir ağ kaydı, bağlantısı tamamlanan her açık nokta bir uygulama kaydı, uyarı ise hız
eşiğinden ve uygulama kaydının varlığından çıkar.

```js
// kesif/nokta.mjs — kurgu sekiz ucun baglanti noktasi durumu ve bes tarama turu (model): gercek
// ana makine, gercek adres ve gercek servis yok. Arac adi, komut ve bayrak dizisi de yok:
// tarama turleri yalniz "hangi durumu kesin ayirir, hangisini belirsiz birakir" ile tanimlanir.

// KS10: tarama uzayi uc basina 9 baglantili (bl) ve 3 baglantisiz (bz) noktadir; yaygin nokta
// listesi uc basina 4 noktadir. Asagida yalniz kapali olmayan noktalar yazilir, gerisi kapalidir.
// "yanit", baglantisiz noktanin sondaya karsilik verip vermedigini soyler.
export const UC = ["abone", "saha", "vpn", "toplayici", "rapor", "ortak", "izleme", "gunluk"];
export const UZAY = { bl: UC.length * 9, bz: UC.length * 3, yaygin: UC.length * 4 };

export const NOKTA = `
  abone      n1 bl acik      1 -
  abone      n2 bl acik      1 -
  abone      n3 bl acik      0 -
  abone      n4 bl suzulmus  1 -
  saha       n1 bl acik      1 -
  saha       n5 bl acik      0 -
  saha       n6 bl acik      1 -
  saha       b1 bz acik      1 evet
  vpn        n1 bl suzulmus  1 -
  vpn        n6 bl acik      1 -
  vpn        b2 bz acik      0 hayir
  toplayici  n6 bl acik      1 -
  toplayici  n7 bl acik      0 -
  toplayici  n8 bl acik      0 -
  toplayici  b1 bz acik      1 evet
  rapor      n1 bl acik      1 -
  rapor      n6 bl acik      1 -
  rapor      n9 bl suzulmus  0 -
  ortak      n1 bl acik      1 -
  ortak      n3 bl acik      0 -
  izleme     n1 bl acik      1 -
  izleme     n7 bl acik      0 -
  izleme     b1 bz acik      1 evet
  gunluk     n1 bl acik      1 -
  gunluk     n5 bl acik      0 -
  gunluk     b3 bz acik      1 hayir`
  .trim().split("\n").map((r) => {
    const [uc, no, prot, durum, yaygin, yanit] = r.trim().split(/\s+/);
    return { uc, no, prot, durum, yaygin: +yaygin, yanit };
  });

export const ACIK = NOKTA.filter((n) => n.durum === "acik");
const acik = (n) => n.durum === "acik";
const yanitli = (n) => n.durum === "acik" && n.yanit === "evet";

// KS11: bir tarama turu, uzayinin hangi durumunu kesin ayirdigi ve hangisini belirsiz biraktigi
// ile tanimlanir. "birim" bir denemenin kurgu sure birimi, "uyg" ise baglantinin tamamlanip
// uygulama katmaninda kayit birakip birakmadigidir.
export const TUR = [
  { ad: "tam baglanti", uzay: "bl", birim: 3, uyg: 1, kesin: acik, belirsiz: () => false },
  { ad: "yarim baglanti", uzay: "bl", birim: 1, uyg: 0, kesin: acik, belirsiz: () => false },
  { ad: "tek yonlu sonda", uzay: "bl", birim: 1, uyg: 0, kesin: () => false,
    belirsiz: (n) => n.durum !== "kapali" },
  { ad: "baglantisiz protokol", uzay: "bz", birim: 5, uyg: 0, kesin: yanitli,
    belirsiz: (n) => acik(n) && !yanitli(n) },
  { ad: "sinirli liste", uzay: "yaygin", birim: 3, uyg: 1, kesin: acik,
    belirsiz: () => false },
  { ad: "yarim baglanti (yavas)", uzay: "bl", birim: 10, uyg: 0, kesin: acik,
    belirsiz: () => false },
];

export const kapsamda = (t, n) =>
  t.uzay === "yaygin" ? n.yaygin === 1 : n.prot === t.uzay;

// KS12: iz uc kalemdir — her deneme bir ag kaydi, baglantisi tamamlanan her acik nokta bir
// uygulama kaydi, uyari ise hiz esiginden ve uygulama kaydinin varligindan cikar.
export const olc = (t) => {
  const gorulen = NOKTA.filter((n) => kapsamda(t, n));
  const kesin = gorulen.filter((n) => t.kesin(n));
  const belirsiz = gorulen.filter((n) => t.belirsiz(n));
  const deneme = UZAY[t.uzay];
  const sure = deneme * t.birim;
  const hiz = deneme / sure;
  const agKayit = deneme;
  const uygKayit = t.uyg * kesin.length;
  const uyari = (hiz > 0.5 ? 2 : hiz > 0.25 ? 1 : 0) + (uygKayit > 0 ? 1 : 0);
  return { t, deneme, kesin, belirsiz, sure, hiz, agKayit, uygKayit,
    kayit: agKayit + uygKayit, uyari,
    yanlisP: belirsiz.filter((n) => n.durum !== "acik").length,
    kacirilan: ACIK.length - kesin.length - belirsiz.filter(acik).length };
};
```

```js
// kesif/tarama.mjs — tarama turleri iz ekseninde: kac aday, kac kacan, kac kayit, kac uyari.
import { NOKTA, ACIK, TUR, UZAY, olc } from "./nokta.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 O = TUR.map(olc);

console.log(`${UZAY.bl} baglantili + ${UZAY.bz} baglantisiz nokta uzayi, ` +
  `${NOKTA.length} kapali olmayan nokta: ${ACIK.length} acik, ` +
  `${NOKTA.filter((n) => n.durum === "suzulmus").length} suzulmus`);

const A = [-23, 8, 8, 10, 9, 11, 10];
console.log("\n1. tur basina bulunan ve kacan");
yaz(A, "tarama turu", "deneme", "kesin", "belirsiz", "yanlisP", "kacirilan", "kapsama %");
for (const o of O)
  yaz(A, o.t.ad, o.deneme, o.kesin.length, o.belirsiz.length, o.yanlisP, o.kacirilan,
    ((o.kesin.length / ACIK.length) * 100).toFixed(1));

const B = [-23, 9, 10, 8, 8, 8, 7];
console.log("\n2. savunmada biraktigi iz");
yaz(B, "tarama turu", "ag kaydi", "uyg kaydi", "kayit", "sure", "hiz", "uyari");
for (const o of O)
  yaz(B, o.t.ad, o.agKayit, o.uygKayit, o.kayit, o.sure, o.hiz.toFixed(2), o.uyari);

const C = [-23, 12, 12, 12];
console.log("\n3. kanit basina bedel");
yaz(C, "tarama turu", "kayit/kesin", "sure/kesin", "uyari/kesin");
for (const o of O) {
  const k = o.kesin.length;
  yaz(C, o.t.ad, k ? (o.kayit / k).toFixed(2) : "-", k ? (o.sure / k).toFixed(2) : "-",
    k ? (o.uyari / k).toFixed(3) : "-");
}

const D = [-45, 8, 10, 8, 8, 8];
console.log("\n4. iki turun birlesimi");
yaz(D, "birlesim", "kesin", "kapsama %", "kayit", "sure", "uyari");
const cift = [[1, 3], [4, 3], [5, 3], [0, 3]];
for (const [i, j] of cift) {
  const k = new Set([...O[i].kesin, ...O[j].kesin]).size;
  yaz(D, `${O[i].t.ad} + ${O[j].t.ad}`, k, ((k / ACIK.length) * 100).toFixed(1),
    O[i].kayit + O[j].kayit, O[i].sure + O[j].sure, O[i].uyari + O[j].uyari);
}
const y = O[5], h = O[1];
console.log(`ayni tur yavaslatildiginda: kesin ${h.kesin.length} -> ${y.kesin.length}, ` +
  `kayit ${h.kayit} -> ${y.kayit}, sure ${h.sure} -> ${y.sure}, ` +
  `uyari ${h.uyari} -> ${y.uyari}`);
```

```
72 baglantili + 24 baglantisiz nokta uzayi, 26 kapali olmayan nokta: 23 acik, 3 suzulmus

1. tur basina bulunan ve kacan
tarama turu              deneme   kesin  belirsiz  yanlisP  kacirilan kapsama %
tam baglanti                 72      18         0        0          5      78.3
yarim baglanti               72      18         0        0          5      78.3
tek yonlu sonda              72       0        21        3          5       0.0
baglantisiz protokol         24       3         2        0         18      13.0
sinirli liste                32      15         0        0          8      65.2
yarim baglanti (yavas)       72      18         0        0          5      78.3

2. savunmada biraktigi iz
tarama turu             ag kaydi uyg kaydi   kayit    sure     hiz  uyari
tam baglanti                  72        18      90     216    0.33      2
yarim baglanti                72         0      72      72    1.00      2
tek yonlu sonda               72         0      72      72    1.00      2
baglantisiz protokol          24         0      24     120    0.20      0
sinirli liste                 32        15      47      96    0.33      2
yarim baglanti (yavas)        72         0      72     720    0.10      0

3. kanit basina bedel
tarama turu             kayit/kesin  sure/kesin uyari/kesin
tam baglanti                   5.00       12.00       0.111
yarim baglanti                 4.00        4.00       0.111
tek yonlu sonda                   -           -           -
baglantisiz protokol           8.00       40.00       0.000
sinirli liste                  3.13        6.40       0.133
yarim baglanti (yavas)         4.00       40.00       0.000

4. iki turun birlesimi
birlesim                                        kesin kapsama %   kayit    sure   uyari
yarim baglanti + baglantisiz protokol              21      91.3      96     192       2
sinirli liste + baglantisiz protokol               15      65.2      71     216       2
yarim baglanti (yavas) + baglantisiz protokol      21      91.3      96     840       0
tam baglanti + baglantisiz protokol                21      91.3     114     336       2
ayni tur yavaslatildiginda: kesin 18 -> 18, kayit 72 -> 72, sure 72 -> 720, uyari 2 -> 0
```

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

#### Sıfır Kesin, Yirmi Bir Belirsiz

Birinci tablonun en dikkat çekici satırı üçüncüsüdür. Tek yönlü sonda 72 deneme yapar ve **hiçbir
noktayı kesin ayıramaz**: kapsaması %0'dır. Bunun yerine 21 belirsiz aday üretir. Nedeni türün
tanımındadır — bu türde yanıt gelmemesi hem açık hem süzülmüş nokta için aynı sonuçtur, ikisi
ayrılamaz. Üretilen 21 adayın **3'ü yanlış pozitiftir**; süzülmüş üç nokta açık olanlarla aynı
listede durur.

Bu satır bu kursun ölçü biriminin en yalın örneğidir. "Tarama yirmi bir açık nokta buldu" cümlesi
bu türde yanlıştır: yirmi bir **aday** bulunmuştur, sıfır kanıt. Aradaki farkı kapatmak için her
adayın ayrı bir adımla doğrulanması gerekir ve o adımların izi bu tabloda hiç yoktur.

Öteki uçta tam ve yarım bağlantı türleri 18 noktayı kesin ayırır, hiç belirsiz bırakmaz ve
kapsamaları **%78,3**'tür. Kaçırdıkları beş nokta bağlantısız protokoldedir: bağlantılı uzayı
tarayan bir tür, bağlantısız uzaydaki hiçbir noktayı göremez. Sınırlı liste 32 denemeyle 15 nokta
bulur (%65,2) ve 8 nokta kaçırır — kaçırdıkları yaygın liste dışındaki noktalardır ve tam olarak
onlar bir değerlendirmede en ilgi çekici olanlardır.

#### Aynı Kanıt, Farklı İz

İkinci tablo iz sütununu açar. Tam ve yarım bağlantı aynı 18 kanıtı üretir, ama tam bağlantı **90
kayıt**, yarım bağlantı **72 kayıt** bırakır. Fark uygulama kaydındadır: tam bağlantı her açık
noktada bağlantıyı tamamlar ve o noktadaki uygulama bir satır yazar. Yarım bağlantı bağlantıyı
tamamlamaz; ağ katmanında 72 satır kalır, uygulama katmanında hiç.

Bu ayrım mavi takım açısından iki kaydın **değerini** de belirler. Ağ kaydı yalnız bir denemenin
yapıldığını söyler; uygulama kaydı hangi uçta hangi noktaya kimin bağlandığını, çoğu zaman bir
kimlik ya da bir istek satırıyla birlikte söyler. Tarama tarafında "daha az iz" diye seçilen tür,
savunma tarafında **daha az bilgi taşıyan iz** anlamına gelir.

Üçüncü tablo bedeli kanıt başına verir. Sınırlı liste kanıt başına **3,13 kayıt** ile en ucuz
türdür, ama sekiz noktayı hiç görmez. Bağlantısız protokol taraması kanıt başına **8,00 kayıt** ve
**40,00 süre** birimi harcar; kayıt sütununun en pahalısıdır, süre sütununda yavaş yarım
bağlantıyla eşittir ve karşılığında yalnız 3 kanıt verir. Ucuzluk
sıralaması ile kapsama sıralaması bu tabloda **birbirinin tersidir**.

#### Hız ile İz Arasındaki Denge

İkinci tablonun son satırı bu dersin ana sonucudur. Yarım bağlantı türü on kat yavaşlatıldığında
**kesin bulunan 18'de kalır, kayıt 72'de kalır, uyarı 2'den 0'a düşer**. Süre 72'den 720'ye çıkar.

Yani hız ile iz arasındaki ilişki doğrudan değildir. Yavaşlatmak savunmanın gördüğü **kayıt
sayısını hiç azaltmaz**; azalttığı şey o kayıtların bir eşiği aşıp uyarıya dönüşmesidir. Aynı 72
satır iki koşumda da günlüğe yazılır; birinde bir dakikaya sığdığı için hız kuralını tetikler,
ötekinde on kat geniş bir aralığa yayıldığı için tetiklemez.

Savunma tarafının çıkarımı buradan doğrudan okunur: **hız eşiğine dayanan bir tespit, yavaş
taramayı hiçbir zaman görmez**. Yavaş taramayı görmenin yolu, aynı kaynaktan gelen denemelerin
geniş bir pencerede biriktirilmesi ve eşiğin hıza değil **yayılıma** — kaç ayrı uca ve kaç ayrı
noktaya dokunulduğuna — bağlanmasıdır. Bu koşumda her iki tür de 8 uca ve 72 noktaya dokunur;
yayılım her iki koşumda da aynıdır.

Üçüncü tablonun `uyari/kesin` sütunu aynı şeyi ters yönden yazar. Yavaş yarım bağlantı ile
bağlantısız protokol taraması **0,000** uyarı üretir; tam ve yarım bağlantı 0,111, sınırlı liste
0,133. En çok uyarı üreten tür en çok deneme yapan tür değildir — sınırlı liste 32 denemeyle en
yüksek oranı verirken bağlantısız protokol 24 denemeyle hiç uyarı üretmez; çünkü uyarı deneme
sayısına değil, denemenin **yoğunluğuna ve katmanına** bağlıdır.

#### Yirmi Üç Noktanın Yirmi Biri

Dördüncü tablo tek türle yetinilemeyeceğini gösterir. Yirmi üç açık noktanın en yüksek tek tür
kapsaması %78,3'tür; **%91,3'e** çıkmak bağlantılı ve bağlantısız uzayı ayrı ayrı tarayan iki
türün birleşimini gerektirir. Kalan iki nokta hiçbir birleşimle bulunmaz: bağlantısız uzayda
sondaya karşılık vermeyen iki açık nokta, bu türlerin hiçbirinde kesin sonuca bağlanamaz.

Birleşimlerin bedeli farklıdır. Yarım bağlantı ile bağlantısız protokol 21 kanıt için 96 kayıt,
192 süre ve 2 uyarı harcar. Aynı kanıt tam bağlantıyla alındığında kayıt 114'e, süre 336'ya
çıkar; uyarı yine 2'dir. Yavaş yarım bağlantıyla alındığında kayıt yine 96, süre **840** ve uyarı
**0**'dır. Üç seçenek aynı 21 kanıtı verir; aralarındaki fark yalnız bedelde ve izdedir.

#### Özet

- Tarama türünü belirleyen şey ayırdığı durumdur: 96 noktalık uzayda 23 açık nokta için
  kapsamalar %78,3, %78,3, %0, %13,0 ve %65,2'dir.
- Tek yönlü sonda hiçbir noktayı kesin ayıramaz; 21 belirsiz aday üretir ve bunların 3'ü yanlış
  pozitiftir — bu tür aday üretir, kanıt üretmez.
- Aynı 18 kanıt tam bağlantıyla 90, yarım bağlantıyla 72 kayıt bırakır; fark uygulama
  katmanındadır ve uygulama kaydı savunma tarafında daha çok bilgi taşır.
- Kanıt başına bedel 3,13 ile 8,00 kayıt arasında değişir; en ucuz tür 8 noktayı hiç görmez, en
  pahalı tür yalnız 3 kanıt verir.
- Aynı tür on kat yavaşlatıldığında kanıt 18'de, kayıt 72'de kalır ve uyarı 2'den 0'a düşer:
  yavaşlamak izi silmez, izin eşiği aşmasını engeller.
- Yirmi üç açık noktanın 21'ine (%91,3) ancak iki türün birleşimiyle ulaşılır; iki nokta hiçbir
  birleşimde kesin sonuca bağlanamaz.

#### Sonraki Adım

Bu ders bir noktanın **açık** olduğunu kesin olarak ayırdı: 21 nokta kanıt düzeyinde işaretlendi.
Ne var ki bir noktanın açık olması, orada ne çalıştığını söylemez. Yirmi bir açık noktanın her biri
şu an yalnız bir sayıdır; arkasındaki yazılımın ne olduğu, hangi sürümü taşıdığı ve o sürümün
bilinen bir açıkla ilişkili olup olmadığı hiç sorulmadı.

Bu soruyu soran adım parmak izi çıkarmadır ve yeni bir ölçü getirir: **kesinlik**. Bir uçtan
toplanan imzalar bir sürüm kümesine işaret eder; küme bazen tek elemanlıdır, bazen onlarca sürüm
içerir, bazen de hedefin kasten yanıltıcı bıraktığı bir tanıtım dizesi yüzünden **yanlış** kümedir.
Sonraki ders kaç adayın tek bir sürüme indirgenebildiğini, ek sondaların kesinliği ne kadar
artırıp izi ne kadar büyüttüğünü ve yanlış sürüm bilgisinin bulgu listesine kaç yanlış pozitif
taşıdığını sayar. Konunun kapanışıdır.

### Servis ve Sürüm Belirleme

Source: https://academia.sh/tr/kurslar/sizma-testi/servis-ve-surum-belirleme

Parmak izini kesinlik cinsinden ölçmek: 21 servisin ilk sonda düzeyinde 13'ünün tek sürüme inmesi ama 4'ünün yanlış sürüme atanması, kanıt oranının %42,9'dan %76,2'ye çıkarken izin 42 kayıttan 168 kayıt ve 6 uyarıya yükselmesi, üçüncü düzeyde kesin sayısının 14'ten 11'e düşerken doğruluğun tamamlanması ve yanlış sürüm bilgisinin bulgu listesine 9 yanlış satır taşıyıp 10 satırı kaçırması.

Önceki ders bir noktanın açık olduğunu kesin olarak ayırdı: kanıt düzeyinde 21 açık nokta
işaretlendi. Bir noktanın açık olması ise orada **ne çalıştığını** söylemez. Yirmi bir nokta şu an
yalnız bir konumdur; arkasındaki yazılımın ne olduğu, hangi sürümü taşıdığı ve o sürümün bilinen
bir açıkla ilişkili olup olmadığı hiç sorulmadı.

Bu soruyu soran adım **parmak izi çıkarmadır (fingerprinting)** ve yeni bir ölçü getirir:
**kesinlik**. Bir uçtan toplanan imzalar bir sürüm kümesine işaret eder. Küme bazen tek
elemanlıdır, bazen onlarca sürüm içerir — ve bazen tek elemanlıdır ama **yanlış** elemanı taşır.
Üçüncü durum bu dersin ana konusudur, çünkü kesin görünen yanlış bir cevap, belirsiz kalan doğru
bir cevaptan daha pahalıdır.

#### Kesinlik Aday Kümesinin Büyüklüğüdür

**KS13:** her servis üç şey taşır — kurgu gerçek sürümü, tanıtım dizesinin durumu (doğru, yanlış,
yok) ve sonda düzeyi başına aday sürüm kümesinin büyüklüğü. **KS14:** bir servis N sondadan sonra
**kesindir** (aday kümesi tek elemanlı); tanıtımı yanıltıcı olan servis doğru sürüme ancak üçüncü
düzeyde ulaşır, önceki düzeylerde kesin ama yanlış atanır. **KS15:** iz sonda düzeyinden çıkar —
her servise N istek, her istek bir ağ ve bir uygulama kaydı; üçüncü düzeyden başlayarak olağandışı
sondalar uyarı üretir.

```js
// kesif/surum.mjs — 04'un 21 kanit duzeyinde acik noktasi icin kurgu parmak izi sonucu (model):
// gercek urun, gercek surum ve gercek acik kimligi yok; surum etiketleri de kurgudur.

// KS13: her servis uc sey tasir — kurgu gercek surumu, tanitim dizesinin durumu (dogru, yanlis,
// yok) ve sonda duzeyi 1..4 icin aday surum kumesinin buyuklugu. Tanitimi yanlis olan servis
// icin "yanlisSurum", dizenin isaret ettigi surumdur.
export const SERVIS = `
  abone/n1      A4 dogru  -   1 1 1 1
  abone/n2      B2 dogru  -   2 1 1 1
  abone/n3      C7 yok    -  12 5 2 1
  saha/n1       A4 dogru  -   1 1 1 1
  saha/n5       D1 yanlis D0   1 1 3 1
  saha/n6       E3 dogru  -   1 1 1 1
  saha/b1       F2 yok    -   9 4 2 2
  vpn/n6        E3 dogru  -   1 1 1 1
  toplayici/n6  E3 dogru  -   1 1 1 1
  toplayici/n7  G5 yok    -  14 6 3 2
  toplayici/n8  H1 yanlis H9   1 1 4 2
  toplayici/b1  F2 yok    -   9 4 2 2
  rapor/n1      A4 dogru  -   1 1 1 1
  rapor/n6      E3 dogru  -   1 1 1 1
  ortak/n1      A4 dogru  -   2 1 1 1
  ortak/n3      C7 yok    -  12 5 2 1
  izleme/n1     A4 dogru  -   1 1 1 1
  izleme/n7     I2 yanlis I5   1 2 3 1
  izleme/b1     F2 yok    -   9 4 2 2
  gunluk/n1     A4 dogru  -   1 1 1 1
  gunluk/n5     J8 yanlis J1   1 1 2 1`
  .trim().split("\n").map((r) => {
    const [ad, gercek, tanitim, yanlisSurum, ...d] = r.trim().split(/\s+/);
    return { ad, gercek, tanitim, yanlisSurum, kume: d.map(Number) };
  });

// Kurgu surum-acik eslemesi: bir surum etiketinin bulgu listesine kac satir tasidigi.
export const ACIK = { A4: 1, B2: 0, C7: 2, D1: 3, E3: 2, F2: 1, G5: 2, H1: 4, I2: 1, J8: 2,
  D0: 0, H9: 1, I5: 3, J1: 5 };

// KS14: bir servis N sondadan sonra kesindir (aday kumesi tek elemanli). Tanitimi yanlis olan
// servis dogru surume ancak ucuncu duzeyde ulasir; onceki duzeylerde kesin ama yanlis atanir.
export const kesin = (s, n) => s.kume[n - 1] === 1;
export const dogru = (s, n) => (s.tanitim === "yanlis" ? n >= 3 : true);
export const atanan = (s, n) => (dogru(s, n) ? s.gercek : s.yanlisSurum);

// KS15: iz sonda duzeyinden cikar — her servise N istek, her istek bir ag ve bir uygulama kaydi;
// ucuncu duzeyden itibaren olagandisi sondalar uyari uretir.
export const iz = (n) => ({ istek: SERVIS.length * n, kayit: SERVIS.length * n * 2,
  uyari: n >= 3 ? (n - 2) * 3 : 0 });
```

```js
// kesif/kesinlik.mjs — parmak izi kesinlik cinsinden: kac aday surum tek surume iniyor.
import { SERVIS, ACIK, kesin, dogru, atanan, iz } from "./surum.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 DUZEY = [1, 2, 3, 4];
const K = (n) => SERVIS.filter((s) => kesin(s, n));

console.log(`${SERVIS.length} servis: ${SERVIS.filter((s) => s.tanitim === "dogru").length} ` +
  `tanitimi dogru, ${SERVIS.filter((s) => s.tanitim === "yanlis").length} yaniltici, ` +
  `${SERVIS.filter((s) => s.tanitim === "yok").length} tanitimsiz`);

const A = [-8, 8, 8, 10, 9, 8, 11];
console.log("\n1. sonda duzeyi basina kesinlik");
yaz(A, "duzey", "istek", "kesin", "belirsiz", "yanlisP", "kanit", "kesinlik %");
for (const n of DUZEY) {
  const k = K(n), yp = k.filter((s) => !dogru(s, n)).length;
  yaz(A, n, iz(n).istek, k.length, SERVIS.length - k.length, yp, k.length - yp,
    (((k.length - yp) / SERVIS.length) * 100).toFixed(1));
}

const B = [-8, 8, 8, 12, 12, 15];
console.log("\n2. kesinligin iz bedeli");
yaz(B, "duzey", "kayit", "uyari", "kayit/kanit", "uyari/kanit", "ort. kume boy");
for (const n of DUZEY) {
  const k = K(n), kanit = k.length - k.filter((s) => !dogru(s, n)).length;
  const ort = SERVIS.reduce((t, s) => t + s.kume[n - 1], 0) / SERVIS.length;
  yaz(B, n, iz(n).kayit, iz(n).uyari, (iz(n).kayit / kanit).toFixed(2),
    (iz(n).uyari / kanit).toFixed(3), ort.toFixed(2));
}

const C = [-8, 10, 8, 8, 8, 10];
console.log("\n3. bulgu listesine tasinan satir");
yaz(C, "duzey", "bildirilen", "dogru", "yanlis", "kacan", "yanlis %");
for (const n of DUZEY) {
  const k = K(n);
  const bild = k.reduce((t, s) => t + ACIK[atanan(s, n)], 0);
  const dg = k.filter((s) => dogru(s, n)).reduce((t, s) => t + ACIK[s.gercek], 0);
  const ger = k.reduce((t, s) => t + ACIK[s.gercek], 0);
  yaz(C, n, bild, dg, bild - dg, ger - dg, ((bild - dg) / bild * 100).toFixed(1));
}

const D = [-10, 7, 7, 7, 7, 7];
console.log("\n4. tanitim durumuna gore kesin sayisi");
yaz(D, "tanitim", "servis", "duzey1", "duzey2", "duzey3", "duzey4");
for (const t of ["dogru", "yanlis", "yok"]) {
  const l = SERVIS.filter((s) => s.tanitim === t);
  yaz(D, t, l.length, ...DUZEY.map((n) => l.filter((s) => kesin(s, n)).length));
}
const b = SERVIS.filter((s) => s.tanitim === "yanlis");
console.log(`yaniltici tanitim: duzey 1'de ${b.filter((s) => kesin(s, 1)).length} servis kesin ` +
  `ama yanlis surume atanir; bunlarin gercek acik sayisi ` +
  `${b.reduce((t, s) => t + ACIK[s.gercek], 0)}, bildirilen ` +
  `${b.reduce((t, s) => t + ACIK[s.yanlisSurum], 0)}`);
```

```
21 servis: 11 tanitimi dogru, 4 yaniltici, 6 tanitimsiz

1. sonda duzeyi basina kesinlik
duzey      istek   kesin  belirsiz  yanlisP   kanit kesinlik %
1             21      13         8        4       9       42.9
2             42      14         7        3      11       52.4
3             63      11        10        0      11       52.4
4             84      16         5        0      16       76.2

2. kesinligin iz bedeli
duzey      kayit   uyari kayit/kanit uyari/kanit  ort. kume boy
1             42       0        4.67       0.000           3.90
2             84       0        7.64       0.000           2.10
3            126       3       11.45       0.273           1.71
4            168       6       10.50       0.375           1.24

3. bulgu listesine tasinan satir
duzey   bildirilen   dogru  yanlis   kacan  yanlis %
1               22      13       9      10      40.9
2               20      14       6       9      30.0
3               14      14       0       0       0.0
4               24      24       0       0       0.0

4. tanitim durumuna gore kesin sayisi
tanitim    servis duzey1 duzey2 duzey3 duzey4
dogru          11      9     11     11     11
yanlis          4      4      3      0      3
yok             6      0      0      0      2
yaniltici tanitim: duzey 1'de 4 servis kesin ama yanlis surume atanir; bunlarin gercek acik sayisi 10, bildirilen 9
```

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

#### On Üç Kesin, Dokuz Kanıt

Birinci tablonun ilk satırı bu dersin sorusunu tek başına kurar. İlk sonda düzeyinde 21 servisin
**13'ü tek bir sürüme iner** — kesinlik ölçütüne göre %61,9'u kesindir. Ne var ki bu on üçün
**4'ü yanlış sürüme atanmıştır**. Kanıt sayısı 13 değil, **9**'dur ve gerçek kesinlik %42,9'dur.

Aradaki fark ölçüm hatası değildir, ölçünün kendisiyle ilgilidir. Aday kümesinin tek elemanlı
olması yalnız **belirsizliğin** ortadan kalktığını gösterir; elemanın doğru olduğunu göstermez.
Bir tanıtım dizesine bakarak sürüm atayan bir adım, hedefin yazdığı bir metni okur ve o metni
kanıt sayar. Metnin doğruluğunu denetleyen hiçbir şey yoktur.

Dördüncü tablo bunu tanıtım durumuna göre ayırır. Tanıtımı doğru olan 11 servisin 9'u ilk düzeyde
kesin olur, ikisi iki sürüm arasında kalır ve ikinci düzeyde ayrılır. Tanıtımı yanıltıcı olan **4
servisin dördü de ilk düzeyde kesindir** — hem de doğru tanıtımlı servislerden daha yüksek bir
oranda. Tanıtımsız 6 servisin ilk üç düzeyde **hiçbiri** kesin olmaz.

Bu, bu dersin en ters sonucudur: **yanıltıcı tanıtım en yüksek görünür kesinliği üretir.** Bir
uçtan gelen "ben şu sürümüm" iddiası, iddianın doğru ya da yanlış olmasına bakılmaksızın aday
kümesini bire indirir. Belirsizlik gören taraf tanıtımsız uçtur; yanlış cevap alan taraf
yanıltıcı olandır.

#### Kesin Sayısının Düştüğü Düzey

Birinci tablonun üçüncü satırı ilk bakışta bir gerileme gibi görünür: kesin sayısı ikinci
düzeydeki **14'ten 11'e** düşer. Aynı satırda yanlış pozitif 3'ten **0'a** iner ve kanıt sayısı
11'de kalır.

Olan şey şudur. Üçüncü düzeydeki davranışsal sondalar, tanıtım dizesiyle çelişen imzalar üretir;
yanıltıcı üç servis artık tek bir sürüme değil, üç ya da dört adaya işaret eder. Aday kümesi
**büyür**, çünkü ölçüm ilk kez tanıtımın yalan olabileceğini hesaba katar. Görünür kesinlik
düşer, gerçek kesinlik yerinde kalır ve yanlış atama sıfırlanır.

Bir değerlendirmede bu satır şöyle okunur: **kesin sayısının düşmesi bir kayıp değil, önceki
kesinliğin sahte olduğunun ortaya çıkmasıdır.** Bir sonda eklemek kesinliği artırmak zorunda
değildir; artırdığı şey doğruluktur ve doğruluk arttığında bazı kalemler haklı olarak belirsize
döner.

Dördüncü düzeyde kesin sayısı 16'ya çıkar ve hepsi doğrudur — kesinlik **%76,2**. Kalan beş
servis dört sondadan sonra da iki adaylık kümelerde durur; bunların dördü tanıtımsız uçlardır.
Parmak izinin bu koşumdaki üst sınırı 21'in 16'sıdır.

#### Bulgu Listesine Taşınan Yanlış Satır

Üçüncü tablo yanlış sürüm bilgisinin bedelini raporun kendisinde ölçer. Her sürüm etiketi bulgu
listesine belli sayıda satır taşır; yanlış sürüm yanlış satır taşır.

İlk düzeyde bulgu listesi **22 satırdır**. Bunların 13'ü doğrudur, **9'u yanlıştır** — listenin
**%40,9'u**. Aynı düzeyde 10 gerçek satır hiç görünmez. Yani bir tarafta düzeltme bütçesini boşa
harcayan dokuz kalem, öteki tarafta hiç bakılmayan on kalem vardır. Kapanış satırı bunu dört
yanıltıcı servis üzerinden verir: gerçek açık sayıları toplam 10 iken bildirilen 9'dur; iki sayı
birbirine yakındır ve **hiçbir satırı ortak değildir**.

İkinci düzeyde yanlış oran %30'a iner. Üçüncü düzeyde bulgu listesi **14 satıra düşer** ve
tamamı doğrudur; kaçan satır sıfırdır, çünkü kesin sayılan on bir servisin hepsi doğru
atanmıştır. Dördüncü düzeyde liste 24 satıra çıkar ve yine tamamı doğrudur.

Birinci ve dördüncü düzey arasındaki karşılaştırma dersin pratik sonucudur: ikisinde de yaklaşık
aynı büyüklükte bir liste üretilir (22'ye karşı 24), ama birinde satırların %40,9'u yanlıştır,
ötekinde %0'ı. **Bulgu sayısı ikisini birbirinden ayırmaz; ayıran tek şey doğrulamadır.**

Bu tablonun savunma tarafında bir karşılığı vardır ve asimetriyi açıkça gösterir. Kurumun kendi
yazılım envanterinde aynı 21 servisin sürümü **tek adımda ve sıfır izle** okunabilir; kurulum
kayıtları hangi sürümün yüklü olduğunu, hangi yamanın uygulandığını ve hangi bileşenin hiç
kullanılmadığını yanıltıcı bir tanıtım dizesine bakmadan söyler. Dışarıdan yapılan ölçüm 84 istek
ve 168 kayıt harcayıp 16 servise ulaşırken içeriden yapılan aynı ölçüm 21 servisin hepsini kapsar.
Değerlendirmenin bu adımdaki bulgusu, kurumun **kendi envanterinden okuyabileceği** bir bilginin
pahalı ve eksik bir kopyasıdır; asıl değeri, o envanterin dışarıdan görünenle **örtüşmediği**
yerlerde ortaya çıkar.

#### Kesinliğin İz Bedeli

İkinci tablo bu konu boyunca taşınan sütunu son kez açar. Ortalama aday küme boyu 3,90'dan
1,24'e iner; karşılığında hedefte biriken kayıt **42'den 168'e**, uyarı **0'dan 6'ya** çıkar.

Bedelin dağılımı eşit değildir. İlk iki düzey 84 kayıt bırakır ve **hiç uyarı üretmez**: bu
sondalar sıradan isteklerden ayırt edilmez. Üçüncü düzeyden itibaren kullanılan olağandışı
sondalar protokol düzeyinde anormallik üretir ve uyarıya dönüşür. Yani doğruluğu tamamlayan
adım, aynı zamanda **savunmanın fark ettiği ilk adımdır**.

`kayit/kanit` sütunu bunu tek sayıya indirir: 4,67, 7,64, 11,45 ve 10,50. En pahalı düzey
üçüncüdür; dördüncü düzey daha çok kayıt bırakır ama beş yeni kanıt getirdiği için kanıt başına
maliyeti düşer. Mavi takım açısından okunuşu ise şudur: **bu konudaki adımların çoğu görülür ama
fark edilmez.** Beş dersin toplamında hedefte biriken kayıt yüzlerle ölçülür; uyarıya dönüşen
kalemler ise iki elin parmaklarını geçmez ve hepsi ya yoğunluktan ya da protokol anormalliğinden
çıkar — hiçbiri "bir keşif yapılıyor" biçiminde bir kayıt değildir.

#### Özet

- Kesinlik aday sürüm kümesinin büyüklüğüdür: ilk sonda düzeyinde 21 servisin 13'ü tek sürüme
  iner ama 4'ü yanlış sürüme atanır; kanıt 9, gerçek kesinlik %42,9'dur.
- Yanıltıcı tanıtım en yüksek görünür kesinliği üretir: tanıtımı yanlış 4 servisin dördü de ilk
  düzeyde kesindir, tanıtımsız 6 servisin ilk üç düzeyde hiçbiri kesin olmaz.
- Üçüncü düzeyde kesin sayısı 14'ten 11'e düşerken yanlış atama 3'ten 0'a iner: kesinliğin
  azalması önceki kesinliğin sahte olduğunun ortaya çıkmasıdır.
- Yanlış sürüm bilgisi ilk düzeyde bulgu listesine 9 yanlış satır taşır (%40,9) ve 10 gerçek
  satırı kaçırır; iki küme hiçbir satırı paylaşmaz.
- Dördüncü düzeyde 24 satırın tamamı doğrudur; birinci düzeydeki 22 satırla benzer büyüklükte bir
  listedir ve aradaki tek fark doğrulamadır.
- Kesinliği %42,9'dan %76,2'ye çıkarmanın bedeli 42 kayıttan 168 kayda ve 0 uyarıdan 6 uyarıya
  çıkmaktır; ilk iki düzey hiç uyarı üretmez, doğruluğu tamamlayan üçüncü düzey ilk uyarıyı üretir.

#### Sonraki Adım

Beş ders sonunda dışarıdan görünen envanter çıkarıldı ve her adımda adaylar sayıldı: halka açık
kalemlerden 20 aday, kayıt sorgulamasından 8 doğrulanmış sahiplik, ad uzayından 21 kayıt ve 6
sahipsiz kalem, taramadan 21 açık nokta, parmak izinden 16 kesin sürüm. Her sayının yanında
bıraktığı iz de yazıldı.

Yine de bütün bu ölçümlerin ortak bir sınırı var. Bu konudaki hiçbir adım, bir adayın **gerçekten
açık olup olmadığını** söyleyemez. Bir sürüm etiketinin bilinen bir açıkla ilişkili olması, o
uçtaki kurulumun gerçekten etkilenmiş olduğunu göstermez: yama uygulanmış olabilir, etkilenen
bileşen hiç kullanılmıyor olabilir, ya da önündeki bir denetim ilgili isteği hiç geçirmiyor
olabilir. Dördüncü düzeyin 24 satırı, kesinliği tam olsa bile, hâlâ birer **adaydır**.

Bu farkı kapatmanın tek yolu uçtan gelen ve uca giden trafiğe bakmaktır: hangi paketler
akıyor, bir istek değiştirildiğinde yanıt nasıl değişiyor, bir dosya çalıştırıldığında ne
yapıyor, bağımsız kaynaklar aynı kalem için ne söylüyor. Sonraki konu — **Analiz Araçları** —
bu araçların her birini aynı iki soruyla ele alır: ne üretiyor ve **neyi kanıtlayamıyor**.

## Analiz Araçları

Trafik, istek ve dosya çözümleme araçlarının ürettiği aday ile kanıtlanmış bulgu arasındaki farkın ölçülmesi: paket yakalamada hangi alanın doğrudan kanıt, hangisinin çıkarım ve hangisinin sahtelenebilir beyan olduğu, protokol çözümleyicilerin şifreli akışta yalnız meta veri bırakması, vekil araçla doğrulamanın kaç istek ve hangi risk sınıfını gerektirdiği, sanal alan çözümlemesinde gizlenen davranış, çoklu motor itibar servislerinde çoğunluk kararının yanlış pozitif oranı, istismar çerçevelerinin neyi kanıtlayıp neyi kanıtlayamadığı ve yasal alıştırma ortamlarının kapsamadığı beceri.

### Paket Yakalama ve Çözümleme

Source: https://academia.sh/tr/kurslar/sizma-testi/paket-yakalama-ve-cozumleme

Yakalanan trafiğin kanıt değerinin ölçülmesi: 24 kurgu paketten çıkan 10 akış, üç yakalama noktasında 18, 44 ve 85 iddia adayı, çekirdek aynada 85 adayın 50'sinin kanıt ve 7'sinin sahtelenebilir çıkması, düşük değerli iddiaların 20/20'si kanıtlanırken yüksek değerlilerin yalnız 10/25'inin kanıtlanması ve pasif yakalamanın hedefte sıfır kayıt bırakıp bir yapılandırma değişikliği istemesi.

Önceki konu dışarıdan görünen envanteri çıkardı ve adayları saydı; kapanışta kalan soru şuydu —
bir adayın gerçekten açık olup olmadığını hiçbir keşif adımı söyleyemez, bunun için trafiğe ve
isteğe bakmak gerekir. Bu konu oraya bakan araçları ele alır ve hepsini tek bir ölçüyle sınar:
ürettikleri **aday** ile geriye kalan **kanıtlanmış bulgu** arasındaki fark.

İlk araç sınıfı **paket yakalayıcıdır**: ağdan geçen çerçeveleri bir noktada kaydeder. Protokollerin
nasıl çalıştığı Bilgisayar Ağları müfredatındaki Ağ Modelleri kursunda kuruldu ve burada
tekrarlanmaz. Burada sorulan tek soru şudur: kaydedilen bu yığından hangi alan **doğrudan kanıt**
sayılır, hangisi yalnız bir **çıkarım**, hangisi de karşı tarafın serbestçe yazabildiği bir beyandır.
Yetkilendirilmiş bir değerlendirmede bile başka bir kuruma ait trafiğin yazılı yetki ve tanımlı
kapsam olmadan kaydedilmesi hem yasadışı hem meslek dışıdır.

#### Alanın Sınıfı Üretenine Bağlıdır

Bir paketteki her alanı aynı gözle okumak, çözümlemenin en yaygın hatasıdır. Alanların bir bölümünü
**yakalama noktasının kendisi** üretir: kaydın zamanı, çerçevenin hangi bacaktan girdiği, yön, boyut,
sayı. Bunlar gönderenin beyanı değildir; ölçüm aracının gözlemidir ve gönderen tarafından
değiştirilemez. Bir bölümünü **başlıklar** taşır: adresler, bağlantı noktası numarası, sunucu adı
alanı. Bunlar ağ yolu boyunca tutarlı olmak zorundadır, dolayısıyla tümüyle serbest değildir, ama
gözlem de değildir — **çıkarımdır**. Kalan bölümü **yük** taşır: kullanıcı adı, sayaç kimliği, istemci
saati. Bunları yazan taraf gönderendir ve kriptografik olarak bağlanmadıkça istediğini yazabilir.

Dördüncü bir sınıf vardır: **imza**. Yük içindeki bir alan kriptografik olarak bağlıysa, o alan
gönderenin beyanı olmaktan çıkıp sınanabilir bir kanıta dönüşür — ancak akış şifreliyse yakalama
noktası imzayı da göremez.

- **AA1.** Paket kümesi, hizmet tablosu, yakalama noktaları ve iddia listesi **modeldir**; gerçek bir
  yakalama yapılmadı. Gerçek adres, ana bilgisayar adı ve kurum yazılmaz.
- **AA2.** Akış (flow), aynı kaynak, hedef ve hizmet üçlüsünü taşıyan paketlerin kümesidir.
- **AA3.** Bir alanın sınıfı üretenine bağlıdır: nokta gözlemi ve imza **kanıt**, başlık alanı
  **çıkarım**, yük alanı **sahtelenebilir**.
- **AA4.** Şifreli akışta yük alanları ve imza görünmez; sunucu adı alanı görünür sayılır.
- **AA5.** **İddia**, yakalanan trafikten çıkarılan bir önermedir. Dayanaklarından en az biri
  görünüyorsa iddia bir **adaydır**; sınıfı, görünen en güçlü dayanağın sınıfıdır.
- **AA6.** Her iddiaya bir **değer** verilir: raporda ne kadar iş taşıdığı. Değer elle atandı.
- **AA7.** Yakalama pasiftir; hedef sistemlerde kayıt üretmez.

```js
// pak/akis.mjs — kurgu paket kumesi, akis cikarma ve alan siniflandirmasi MODELIDIR.
// Gercek bir yakalama yok; gercek adres, ana bilgisayar adi ve kurum yazilmaz.
// Bir alanin sinifi, o alani kimin urettigine baglidir.
export const ALAN = {
  'yakalama-zamani': 'nokta', 'giris-bacagi': 'nokta', 'yon': 'nokta',
  'cerceve-boyutu': 'nokta', 'paket-sayisi': 'nokta', 'duz-metin-varligi': 'nokta',
  'kaynak-adresi': 'baslik', 'hedef-adresi': 'baslik', 'baglanti-noktasi': 'baslik',
  'sunucu-adi-alani': 'baslik', 'imza-dogrulamasi': 'imza',
  'kullanici-adi': 'yuk', 'parola-alani': 'yuk', 'sayac-kimligi': 'yuk',
  'okuma-degeri': 'yuk', 'abone-no': 'yuk', 'oturum-belirteci': 'yuk',
  'istemci-saati': 'yuk', 'cihaz-kimligi': 'yuk', 'islem-kimligi': 'yuk',
};
export const SINIF = { nokta: 'kanit', imza: 'kanit', baslik: 'cikarim', yuk: 'sahte' };
export const GUC = { kanit: 3, cikarim: 2, sahte: 1 };

// Hizmet: sifreli mi, yuku imzali mi, yukte hangi alanlar tasiniyor.
export const HIZMET = {
  'olcum-toplama':   { sifreli: false, imzali: true,  yuk: ['sayac-kimligi', 'okuma-degeri', 'istemci-saati'] },
  'dogrulama-cagri': { sifreli: true,  imzali: true,  yuk: ['islem-kimligi', 'abone-no'] },
  'portal-oturumu':  { sifreli: true,  imzali: false, yuk: ['oturum-belirteci', 'kullanici-adi'] },
  'saha-senkron':    { sifreli: false, imzali: false, yuk: ['kullanici-adi', 'cihaz-kimligi'] },
  'yonetim-erisimi': { sifreli: false, imzali: false, yuk: ['kullanici-adi', 'parola-alani'] },
  'dis-bildirim':    { sifreli: true,  imzali: false, yuk: ['abone-no'] },
};

// Yakalama noktasi: hangi bacaklardan gecen paketi goruyor.
export const NOKTA = {
  'sube-bacagi':   ['sube-1'],
  'cekirdek-ayna': ['sube-1', 'sube-2', 'merkez', 'dis'],
  'toplayici-ucu': ['merkez'],
};

// satir: zaman(sn) | bacak | kaynak | hedef | hizmet | boyut(bayt)
export const PAKET = `
  0 sube-1 s1-ucu toplayici olcum-toplama 420
  1 sube-1 s1-ucu toplayici olcum-toplama 418
  2 sube-1 s1-ucu toplayici olcum-toplama 421
  3 sube-2 s2-ucu toplayici olcum-toplama 419
  4 sube-2 s2-ucu toplayici olcum-toplama 420
  5 merkez toplayici dogrulayici dogrulama-cagri 1180
  6 merkez toplayici dogrulayici dogrulama-cagri 1174
  7 merkez toplayici dogrulayici dogrulama-cagri 1190
  8 dis abone-ucu portal portal-oturumu 2240
  9 dis abone-ucu portal portal-oturumu 2180
 10 dis abone-ucu portal portal-oturumu 2260
 11 sube-1 saha-uc saha-svc saha-senkron 960
 12 sube-1 saha-uc saha-svc saha-senkron 955
 13 sube-2 saha-uc saha-svc saha-senkron 962
 14 merkez yonetim toplayici yonetim-erisimi 310
 15 merkez yonetim toplayici yonetim-erisimi 305
 16 merkez yonetim dogrulayici yonetim-erisimi 308
 17 dis fatura dis-uc dis-bildirim 1420
 18 dis fatura dis-uc dis-bildirim 1415
 19 sube-1 s1-ucu toplayici olcum-toplama 417
 20 merkez toplayici fatura dogrulama-cagri 1160
 21 merkez toplayici fatura dogrulama-cagri 1168
 22 sube-2 s2-ucu toplayici olcum-toplama 422
 23 merkez yonetim saha-svc yonetim-erisimi 312
`.trim().split('\n').map((r) => {
  const [t, bacak, kaynak, hedef, hizmet, boyut] = r.trim().split(/\s+/);
  return { t: +t, bacak, kaynak, hedef, hizmet, boyut: +boyut };
});

// Akis: ayni (kaynak, hedef, hizmet) uclusunu tasiyan paketler.
export function akislar(paketler) {
  const m = new Map();
  for (const p of paketler) {
    const k = `${p.kaynak}>${p.hedef}/${p.hizmet}`;
    if (!m.has(k)) m.set(k, { ad: k, hizmet: p.hizmet, bacak: new Set(), paket: 0, bayt: 0 });
    const a = m.get(k);
    a.bacak.add(p.bacak); a.paket += 1; a.bayt += p.boyut;
  }
  return [...m.values()];
}

// Bir akista gorunen alanlar: nokta ve baslik alanlari her zaman,
// yuk alanlari ile imza yalniz sifresiz akista.
export function gorunurAlan(a) {
  const h = HIZMET[a.hizmet];
  const g = ['yakalama-zamani', 'giris-bacagi', 'yon', 'cerceve-boyutu', 'paket-sayisi',
    'kaynak-adresi', 'hedef-adresi', 'baglanti-noktasi'];
  if (h.sifreli) g.push('sunucu-adi-alani');
  else {
    g.push('duz-metin-varligi', ...h.yuk.filter((f) => ALAN[f]));
    if (h.imzali) g.push('imza-dogrulamasi');
  }
  return g;
}

// Iddia: yakalanan trafikten cikarilan onerme. Dayanak alanlarindan en az biri gorunuyorsa
// iddia bir ADAY olur; iddianin sinifi, gorunen en guclu dayanagin sinifidir.
export const IDDIA = [
  { ad: 'akis-var',             deger: 'dusuk',  dayanak: ['yon', 'cerceve-boyutu'] },
  { ad: 'hacim-ve-zamanlama',   deger: 'dusuk',  dayanak: ['paket-sayisi', 'yakalama-zamani'] },
  { ad: 'islemin-zamani',       deger: 'orta',   dayanak: ['istemci-saati', 'yakalama-zamani'] },
  { ad: 'trafik-su-bacaktan',   deger: 'orta',   dayanak: ['giris-bacagi'] },
  { ad: 'konusulan-servis',     deger: 'orta',   dayanak: ['baglanti-noktasi'] },
  { ad: 'karsi-uc-kimligi',     deger: 'orta',   dayanak: ['hedef-adresi', 'sunucu-adi-alani'] },
  { ad: 'alanlar-duz-metinde',  deger: 'yuksek', dayanak: ['duz-metin-varligi'] },
  { ad: 'gonderen-uc-kimligi',  deger: 'yuksek', dayanak: ['kaynak-adresi', 'imza-dogrulamasi'] },
  { ad: 'okunan-sayac-degeri',  deger: 'yuksek', dayanak: ['okuma-degeri', 'sayac-kimligi', 'imza-dogrulamasi'] },
  { ad: 'kimlik-alani-icerigi', deger: 'yuksek', dayanak: ['parola-alani', 'oturum-belirteci'] },
  { ad: 'islemi-yapan-kisi',    deger: 'yuksek', dayanak: ['kullanici-adi', 'cihaz-kimligi'] },
];

export function iddiaSinifi(iddia, gorunen) {
  const v = iddia.dayanak.filter((f) => gorunen.includes(f));
  if (v.length === 0) return null;
  return v.map((f) => SINIF[ALAN[f]]).sort((x, y) => GUC[y] - GUC[x])[0];
}

export function noktaOlc(nokta) {
  const bacaklar = NOKTA[nokta];
  const p = PAKET.filter((x) => bacaklar.includes(x.bacak));
  const s = { paket: p.length, bayt: p.reduce((t, x) => t + x.boyut, 0), akis: 0,
    aday: 0, kanit: 0, cikarim: 0, sahte: 0 };
  for (const a of akislar(p)) {
    s.akis += 1;
    const g = gorunurAlan(a);
    for (const i of IDDIA) {
      const c = iddiaSinifi(i, g);
      if (c) { s.aday += 1; s[c] += 1; }
    }
  }
  return s;
}
```

#### Üç Yakalama Noktası

```js
// pak/olc.mjs — ayni paket kumesi uc yakalama noktasindan olculur.
import { PAKET, NOKTA, IDDIA, HIZMET, akislar, gorunurAlan, iddiaSinifi, noktaOlc } from './akis.mjs';

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

console.log(`${PAKET.length} paket -> ${akislar(PAKET).length} akis, ` +
  `${Object.keys(HIZMET).length} hizmet, ${IDDIA.length} iddia turu`);

const A = [-22, -17, 7, 7, 9, 8, 6];
console.log('\n1. akis basina gorunur alan');
y(A, 'akis', 'hizmet', 'paket', 'bayt', 'sifreli', 'imzali', 'alan');
for (const a of akislar(PAKET)) {
  const h = HIZMET[a.hizmet];
  y(A, a.ad.split('/')[0], a.hizmet, a.paket, a.bayt, h.sifreli ? 'evet' : 'hayir',
    h.imzali ? 'evet' : 'hayir', gorunurAlan(a).length);
}

const B = [-16, 8, 7, 7, 8, 9, 16];
console.log('\n2. yakalama noktasi basina iddia');
y(B, 'nokta', 'paket', 'akis', 'aday', 'kanit', 'cikarim', 'sahtelenebilir');
for (const n of Object.keys(NOKTA)) {
  const s = noktaOlc(n);
  y(B, n, s.paket, s.akis, s.aday, s.kanit, s.cikarim, s.sahte);
}

const C = [-22, 9, 8, 9, 16];
console.log('\n3. cekirdek aynada iddia turu basina sinif dagilimi');
y(C, 'iddia', 'deger', 'kanit', 'cikarim', 'sahtelenebilir');
const ag = akislar(PAKET).map(gorunurAlan);
const kutu = { dusuk: [0, 0], orta: [0, 0], yuksek: [0, 0] };
for (const i of IDDIA) {
  const c = { kanit: 0, cikarim: 0, sahte: 0 };
  for (const g of ag) { const s = iddiaSinifi(i, g); if (s) c[s] += 1; }
  y(C, i.ad, i.deger, c.kanit, c.cikarim, c.sahte);
  kutu[i.deger][0] += c.kanit;
  kutu[i.deger][1] += c.kanit + c.cikarim + c.sahte;
}

console.log('\n4. iddia degeri ile kanit orani');
for (const d of ['dusuk', 'orta', 'yuksek'])
  console.log(`  ${d.padEnd(8)} kanit ${String(kutu[d][0]).padStart(3)} / ${kutu[d][1]}`);

const t = noktaOlc('cekirdek-ayna');
console.log(`\nhedef sistemlerde uretilen kayit             0`);
console.log(`yakalama icin gereken yapilandirma degisikligi 1 (ayna bacagi, yazili onay)`);
console.log(`incelenen hacim                              ${t.bayt} bayt`);
console.log(`sube bacagindan gorulemeyen akis             ${t.akis - noktaOlc('sube-bacagi').akis} / ${t.akis}`);
```

```
24 paket -> 10 akis, 6 hizmet, 11 iddia turu

1. akis basina gorunur alan
akis                  hizmet             paket   bayt  sifreli  imzali  alan
s1-ucu>toplayici      olcum-toplama          4   1676    hayir    evet    13
s2-ucu>toplayici      olcum-toplama          3   1261    hayir    evet    13
toplayici>dogrulayici dogrulama-cagri        3   3544     evet    evet     9
abone-ucu>portal      portal-oturumu         3   6680     evet   hayir     9
saha-uc>saha-svc      saha-senkron           3   2877    hayir   hayir    11
yonetim>toplayici     yonetim-erisimi        2    615    hayir   hayir    11
yonetim>dogrulayici   yonetim-erisimi        1    308    hayir   hayir    11
fatura>dis-uc         dis-bildirim           2   2835     evet   hayir     9
toplayici>fatura      dogrulama-cagri        2   2328     evet    evet     9
yonetim>saha-svc      yonetim-erisimi        1    312    hayir   hayir    11

2. yakalama noktasi basina iddia
nokta              paket   akis   aday   kanit  cikarim  sahtelenebilir
sube-bacagi            6      2     18      12        5               1
cekirdek-ayna         24     10     85      50       28               7
toplayici-ucu          9      5     44      23       15               6

3. cekirdek aynada iddia turu basina sinif dagilimi
iddia                     deger   kanit  cikarim  sahtelenebilir
akis-var                  dusuk      10        0               0
hacim-ve-zamanlama        dusuk      10        0               0
islemin-zamani             orta      10        0               0
trafik-su-bacaktan         orta      10        0               0
konusulan-servis           orta       0       10               0
karsi-uc-kimligi           orta       0       10               0
alanlar-duz-metinde      yuksek       6        0               0
gonderen-uc-kimligi      yuksek       2        8               0
okunan-sayac-degeri      yuksek       2        0               0
kimlik-alani-icerigi     yuksek       0        0               3
islemi-yapan-kisi        yuksek       0        0               4

4. iddia degeri ile kanit orani
  dusuk    kanit  20 / 20
  orta     kanit  20 / 40
  yuksek   kanit  10 / 25

hedef sistemlerde uretilen kayit             0
yakalama icin gereken yapilandirma degisikligi 1 (ayna bacagi, yazili onay)
incelenen hacim                              22436 bayt
sube bacagindan gorulemeyen akis             8 / 10
```

#### Kanıt Ucuz, Değerli İddia Pahalı

Dördüncü tablo bu dersin sonucudur. Düşük değerli iddiaların **20'sinin 20'si** kanıt sınıfında.
"Bu iki uç arasında akış var", "şu kadar paket şu saatte geçti" — hepsi doğrudur, hiçbiri
tartışılamaz ve hiçbiri bir rapor satırı etmez. Orta değerlilerde oran yarıya iner: bacak ve zaman
kanıttır, konuşulan servis ile karşı ucun kimliği başlıktan okunur ve çıkarımdır. Yüksek değerli
iddiaların ise yalnız **10'u 25'ten** kanıt sınıfına girer.

Bu ters orantı bir kusur değil, yöntemin yapısıdır. Yakalama noktası ne kadar çok şey gözlemliyorsa
o gözlem o kadar az şey söyler; gerçekten bir şey söyleyen alanları ise gönderen üretir ve gönderen
her zaman şüphelidir. Ölçüm hattında bunun üç somut karşılığı var.

**Kimlik alanı içeriği** ve **işlemi yapan kişi** hiçbir akışta kanıt olmuyor; yedi kez aday olarak
üretiliyor ve yedisi de yalnız yük alanına dayanıyor. Bir yakalamada bir kullanıcı adı görülmesi, o
işlemi o kişinin yaptığını göstermez — yalnız o adın o alana yazıldığını gösterir. Rapora
"kullanıcı X şu işlemi yaptı" diye giren satır, kanıtlanmamış bir adaydır ve düzeltme bütçesini
yanlış yere harcatır.

**Gönderen uç kimliği** on adayın ikisinde kanıt, sekizinde çıkarım. İki kanıt, yükü imzalı ve
şifresiz olan ölçüm toplama akışlarından geliyor: imza görülüyor ve doğrulanabiliyor. Kalan sekizde
elde yalnız kaynak adresi var. Şifreli akışlarda imza da yükün içinde kaldığı için görünmez —
şifreleme doğru karardır, ama kanıt olabilecek alanı çözümleyiciden de saklar.

**Alanlar düz metinde** altı akışta kanıt sınıfında ve bu, kurgu ağdaki en sağlam bulgudur. Yönetim
erişiminin üç akışı, saha eşitlemesinin akışı ve iki ölçüm toplama akışı alanlarını şifresiz
taşıyor. Burada ayrım
önemlidir: alanların **düz metinde taşındığı** yakalama noktasının gözlemidir ve kanıttır; o
alanların **ne dediği** gönderenin beyanıdır ve değildir.

#### Noktanın Konumu ve Bırakılan İz

İkinci tablo yakalayıcının nereye konduğunun ölçüsüdür. Şube bacağında 6 paket, 2 akış ve 18 aday
var; çekirdek aynada 24 paket, 10 akış ve 85 aday. Şube bacağından bakan bir çözümleyici on akışın
**sekizini hiç görmez** ve görmediği akış hakkında hiçbir şey söyleyemez. Toplayıcı ucu ortadadır:
merkez trafiğini görür, şube bacaklarını görmez, ama gördüğü beş akışın üçü şifresiz olduğu için
sahtelenebilir aday oranı en yüksek noktadır — 44 adayın 6'sı.

Bedel sütunu iki kalemden oluşuyor ve ikisi de küçüktür. İncelenen hacim 22.436 bayt; gerçek bir
değerlendirmede bu sayı çok daha büyüktür ve çözümleme süresini belirleyen asıl kalemdir. Savunmada
bırakılan iz ise **sıfır kayıttır**: yakalama pasiftir, hedef sistemlere hiçbir istek gitmez,
hiçbir günlük satırı üretilmez. Bu, kursta göreceğimiz en düşük izli adımdır.

Sıfır olmayan tek kalem, yakalamanın **mümkün kılınmasıdır**. Ayna bacağı açmak bir yapılandırma
değişikliğidir; bir değişiklik kaydı üretir, ağ ekibinin onayını ve kapsam belgesinde açık bir
satırı gerektirir. Trafiğin içinde abone verisi geçtiği için kaydın nerede saklanacağı ve ne zaman
silineceği de aynı belgede yazılıdır. Pasif olan yakalamanın kendisidir; ona erişim izni pasif
değildir.

#### Özet

- Yirmi dört kurgu paketten 10 akış çıkar; akış başına görünen alan sayısı şifreli akışlarda 9,
  şifresiz akışlarda 11 ile 13 arasındadır.
- Bir alanın kanıt değeri üretenine bağlıdır: yakalama noktasının gözlemi ve kriptografik imza
  kanıt, başlık alanı çıkarım, yük alanı sahtelenebilir beyandır.
- Çekirdek aynada 85 iddia adayının 50'si kanıt, 28'i çıkarım, 7'si sahtelenebilir sınıftadır;
  bir iddianın sınıfı, görünen en güçlü dayanağının sınıfıdır.
- Kanıt oranı iddianın değeriyle ters gider: düşük değerli iddiaların 20/20'si kanıtlanır, yüksek
  değerlilerin yalnız 10/25'i. Kullanıcıyı işleme bağlayan yedi adayın hiçbiri kanıt değildir.
- Yakalama noktasının konumu görülen akışı belirler: şube bacağı 10 akışın 8'ini hiç görmez.
- Pasif yakalama hedefte sıfır kayıt bırakır; tek iz, ayna bacağı için gereken bir yapılandırma
  değişikliği ve ona bağlı yazılı onaydır.

#### Sonraki Adım

Bu derste alanlar tek tek sınıflandırıldı ama şifreli akışlar tek bir satırla geçildi: yük görünmez,
sunucu adı alanı görünür. Kurgu ağdaki on akışın dördü şifreli ve bu dördü tam olarak en çok iş
taşıyan akışlar — abone portalı oturumu, doğrulama çağrısı, dış bildirim. Çözümlemenin bu akışlarda
eli boş kaldığı doğru değildir; eli **başka türlü doludur**.

Sonraki ders uygulama katmanı incelemesini görünürlük cinsinden ölçer. Aynı akış kümesi bir protokol
çözümleyiciden geçirilir ve iki sütun ayrı sayılır: şifresiz akışta kaç alan okunabiliyor, şifreli
akışta kaç alan yalnız **meta veri** olarak kalıyor. Meta verinin ne kadar iddia taşıdığı, şifre
çözmenin hangi kapsam ve gizlilik kalemini gerektirdiği ve çözümleyicinin **kendi yorumunun** ne
zaman bir çıkarım olduğu ölçülür.

### Protokol Çözümleyicileri

Source: https://academia.sh/tr/kurslar/sizma-testi/protokol-cozumleyicileri

Uygulama katmanı incelemesinin görünürlük cinsinden ölçülmesi: on akışta tanımlı 30 uygulama alanının yalnız 16'sının okunabilmesi, iki akışın taşıma numarasına bakan çözümleyici tarafından yanlış etiketlenmesi, 91 iddia adayının 43'ünün kanıt ve 48'inin meta veriden yapılan çıkarım olması, beş şifreli akışın üçünde anahtar malzemesine erişimin kurum içinde bulunması ve pasif çözümlemenin hedefte sıfır kayıt bırakması.

Önceki ders alanları üretenine göre sınıflandırdı ve şifreli akışları tek satırla geçti: yük
görünmez, sunucu adı alanı görünür. Kurgu ölçüm ağındaki en çok iş taşıyan akışlar tam olarak
şifreli olanlardır. Çözümlemenin bu akışlarda eli boş kaldığı doğru değildir; eli başka türlü
doludur ve bu dersin konusu o "başka türlü"nün ne kadar ettiğidir.

**Protokol çözümleyici**, yakalanan baytları uygulama katmanı alanlarına ayırır. İki iş yapar:
bir **biçim varsayar** ve o biçime göre alanları adlandırır. İkisi de kanıt üretmez; birincisi bir
tahmindir, ikincisi tahmin doğruysa alan okur. Ölçülen şey bu iki adımın kaç akışta tuttuğudur.

#### Görünürlük İki Sütundur

Bir akışta iki ayrı alan kümesi vardır. **Uygulama alanları** yalnız şifreleme kalkarsa ve biçim
doğru bilinirse okunur. **Meta alanları** her koşulda üretilir: uç adresleri, taşıma numarası, yön
dizisi, paket boyut dizisi, zamanlama aralığı, akış süresi. Şifreli oturumlarda buna el sıkışma
parametreleri ve sunucu adı alanı eklenir — şifreleme bu iki alanı kapatmaz.

Meta veri (metadata) kendi sorularına kanıt düzeyinde yanıt verir: akış ne kadar sürdü, hacmi neydi,
düzenli aralıklı mı. Bunlar yakalama noktasının kendi gözlemidir. Sorun, meta verinin **başka
soruların yanıtı gibi** kullanılmasında başlar. Boyut dizisine bakıp "işlem başarılı oldu", yön
dizisine bakıp "bu bir yazma işlemiydi" demek bir **vekil çıkarımdır**: alan okunmadan alanın
yanıtı tahmin edilir. Bu çıkarımlar sık sık doğrudur ve kanıt değildir.

- **AA8.** Biçim kataloğu, akış listesi ve iddia listesi **modeldir**; gerçek bir yakalama yok.
- **AA9.** Çözümleyici biçimi **taşıma numarasından** varsayar. Varsayım yanlışsa alanları okuyamaz
  ve akışı yanlış etiketler. Gerçek çözümleyiciler içerik imzasına da bakar; bu model yalnız
  numaraya bakar ve yanlış etiket sayısını üst sınır olarak verir.
- **AA10.** Metin tabanlı bir biçim yanlış etiketlendiğinde ham metin parçası görünür sayılır;
  ikili biçimde hiçbir şey görünmez.
- **AA11.** Şifreli akışta uygulama alanı okunmaz; meta alanları eksiksiz üretilir.
- **AA12.** Bir iddia, dayanağı okunmuş uygulama alanından geliyorsa **kanıttır**; meta türü
  iddialar meta alanından karşılandığında da kanıttır. Vekil alandan karşılanan alan türü iddia
  **çıkarımdır**.
- **AA13.** Anahtar malzemesine erişim kurumun kendi ucunda bir ajanla sağlanıyorsa `uc-ajani`,
  sağlanamıyorsa `yok` yazılır.
- **AA14.** Pasif çözümleme hedefte kayıt üretmez; araya girerek çözme aktif bir adımdır.

```js
// prot/cozum.mjs — protokol cozumleyici gorunurlugu MODELIDIR. Gercek bir yakalama,
// gercek adres ve gercek kurum yok. Bir cozumleyici, tasima bilgisinden bir bicim VARSAYAR;
// varsayim yanlissa alanlari okuyamaz ve akisi yanlis etiketler.
export const BICIM = {
  'metin-istek':     { metin: true,  alan: ['istek-satiri', 'baslik-alanlari', 'govde', 'durum-kodu', 'oturum-kimligi', 'kullanici-alani'] },
  'olcum-protokolu': { metin: false, alan: ['islev-kodu', 'kayit-adresi', 'deger-alani', 'birim-kimligi'] },
  'dosya-aktarimi':  { metin: true,  alan: ['komut-adi', 'dosya-adi', 'kullanici-alani', 'boyut-alani'] },
  'ad-cozumleme':    { metin: true,  alan: ['sorgu-adi', 'kayit-turu', 'yanit-kodu'] },
  'ikili-senkron':   { metin: false, alan: ['islem-kodu', 'kayit-sayisi', 'zaman-damgasi'] },
  'sifreli-oturum':  { metin: false, alan: [] },
};

// Cozumleyicinin tasima numarasindan yaptigi bicim varsayimi.
export const VARSAYIM = { 80: 'metin-istek', 443: 'sifreli-oturum', 502: 'olcum-protokolu',
  21: 'dosya-aktarimi', 53: 'ad-cozumleme', 8080: 'metin-istek' };

// Sifreleme kalksa da kalan alanlar: cozumleyici bunlari her akista uretir.
export const META = ['uc-adresleri', 'tasima-numarasi', 'yon-dizisi', 'paket-boyut-dizisi',
  'zamanlama-araligi', 'akis-suresi'];
export const SIFRELI_EK = ['sunucu-adi-alani', 'el-sikisma-parametreleri'];

// satir: akis | tasima numarasi | gercek bicim | sifreli mi | anahtar malzemesine erisim
export const AKIS = `
  s1-ucu>toplayici       502 olcum-protokolu evet uc-ajani
  s2-ucu>toplayici       502 olcum-protokolu evet uc-ajani
  toplayici>dogrulayici  443 sifreli-oturum  evet uc-ajani
  abone-ucu>portal       443 sifreli-oturum  evet yok
  saha-uc>saha-svc      8080 ikili-senkron   hayir yok
  yonetim>toplayici       80 metin-istek     hayir yok
  yonetim>dogrulayici     80 metin-istek     hayir yok
  fatura>dis-uc          443 sifreli-oturum  evet yok
  toplayici>fatura       502 ikili-senkron   hayir yok
  saha-uc>dosya-svc       21 dosya-aktarimi  hayir yok
`.trim().split('\n').map((r) => {
  const [ad, port, bicim, sifreli, anahtar] = r.trim().split(/\s+/);
  return { ad, port: +port, bicim, sifreli: sifreli === 'evet', anahtar };
});

// Cozumleme sonucu: okunan uygulama alani, uretilen meta alan, yanlis etiket.
export function coz(a) {
  const varsayilan = VARSAYIM[a.port];
  const meta = [...META, ...(a.sifreli ? SIFRELI_EK : [])];
  if (a.sifreli) return { okunan: [], meta, etiket: varsayilan, yanlisEtiket: false, derinlik: 'yalniz-meta' };
  if (varsayilan === a.bicim)
    return { okunan: BICIM[a.bicim].alan, meta, etiket: varsayilan, yanlisEtiket: false, derinlik: 'tam' };
  const kismi = BICIM[a.bicim].metin ? ['ham-metin-parcasi'] : [];
  return { okunan: kismi, meta, etiket: varsayilan, yanlisEtiket: true,
    derinlik: kismi.length ? 'kismi' : 'yok' };
}

// Iddia: cozumleyici ciktisindan cikarilan onerme.
// tur 'meta' iddialar dogrudan meta alanindan karsilanir ve kanit sayilir (nokta gozlemi).
// tur 'alan' iddialar yalniz uygulama alanindan kanitlanir; vekil, meta alanindan yapilan
// tahmindir ve CIKARIM sayilir.
export const IDDIA = [
  { ad: 'akis-suresi-ve-hacmi', tur: 'meta', gerek: ['akis-suresi'], vekil: [] },
  { ad: 'duzenli-aralik-var',   tur: 'meta', gerek: ['zamanlama-araligi'], vekil: [] },
  { ad: 'karsi-uc-adi',         tur: 'meta', gerek: ['sunucu-adi-alani'], vekil: [] },
  { ad: 'oturum-parametreleri', tur: 'meta', gerek: ['el-sikisma-parametreleri'], vekil: [] },
  { ad: 'konusulan-bicim',      tur: 'alan', gerek: ['istek-satiri', 'islev-kodu', 'komut-adi', 'islem-kodu', 'sorgu-adi'], vekil: ['tasima-numarasi'] },
  { ad: 'istenen-kaynak',       tur: 'alan', gerek: ['istek-satiri', 'sorgu-adi', 'dosya-adi'], vekil: ['sunucu-adi-alani'] },
  { ad: 'islem-sonucu',         tur: 'alan', gerek: ['durum-kodu', 'yanit-kodu'], vekil: ['paket-boyut-dizisi'] },
  { ad: 'yazma-mi-okuma-mi',    tur: 'alan', gerek: ['islev-kodu', 'islem-kodu', 'komut-adi'], vekil: ['yon-dizisi'] },
  { ad: 'aktarilan-dosya',      tur: 'alan', gerek: ['dosya-adi', 'boyut-alani'], vekil: ['paket-boyut-dizisi'] },
  { ad: 'kayit-sayisi',         tur: 'alan', gerek: ['kayit-sayisi', 'kayit-adresi'], vekil: ['paket-boyut-dizisi'] },
  { ad: 'tasinan-kimlik-alani', tur: 'alan', gerek: ['kullanici-alani', 'oturum-kimligi'], vekil: [] },
  { ad: 'yazilan-olcum-degeri', tur: 'alan', gerek: ['deger-alani'], vekil: [] },
];

// Bir iddianin bir akistaki durumu: kanit | cikarim | karsilanmaz
export function durum(i, c) {
  if (i.gerek.some((g) => c.okunan.includes(g))) return 'kanit';
  if (i.tur === 'meta' && i.gerek.some((g) => c.meta.includes(g))) return 'kanit';
  if (i.vekil.some((g) => c.meta.includes(g))) return 'cikarim';
  return 'karsilanmaz';
}

export function olc() {
  const s = { tanimli: 0, okunan: 0, meta: 0, yanlisEtiket: 0, aday: 0, kanit: 0, cikarim: 0 };
  for (const a of AKIS) {
    const c = coz(a);
    s.tanimli += BICIM[a.bicim].alan.length;
    s.okunan += c.okunan.length;
    s.meta += c.meta.length;
    if (c.yanlisEtiket) s.yanlisEtiket += 1;
    for (const i of IDDIA) {
      const d = durum(i, c);
      if (d !== 'karsilanmaz') { s.aday += 1; s[d] += 1; }
    }
  }
  return s;
}
```

#### On Akış, İki Sütun

```js
// prot/gorunurluk.mjs — on akis cozumleyiciden gecirilir; alan ile meta ayri sayilir.
import { AKIS, BICIM, IDDIA, coz, durum, olc } from './cozum.mjs';

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

const A = [-23, -17, 7, 8, 8, 7, 17, 13];
console.log('1. akis basina cozumleme derinligi');
y(A, 'akis', 'gercek bicim', 'tasima', 'sifreli', 'tanimli', 'okunan', 'etiket', 'derinlik');
for (const a of AKIS) {
  const c = coz(a);
  y(A, a.ad, a.bicim, a.port, a.sifreli ? 'evet' : 'hayir', BICIM[a.bicim].alan.length,
    c.okunan.length, c.etiket, c.derinlik);
}

const B = [-22, 6, 7, 9, 13];
console.log('\n2. iddia turu basina karsilanma (10 akis)');
y(B, 'iddia', 'tur', 'kanit', 'cikarim', 'karsilanmaz');
for (const i of IDDIA) {
  const d = AKIS.map((a) => durum(i, coz(a)));
  y(B, i.ad, i.tur, d.filter((x) => x === 'kanit').length,
    d.filter((x) => x === 'cikarim').length, d.filter((x) => x === 'karsilanmaz').length);
}

const s = olc();
console.log('\n3. toplam');
console.log(`  tanimli uygulama alani     ${s.tanimli}`);
console.log(`  okunan uygulama alani      ${s.okunan}`);
console.log(`  uretilen meta alani        ${s.meta}`);
console.log(`  yanlis etiketlenen akis    ${s.yanlisEtiket} / ${AKIS.length}`);
console.log(`  uretilen iddia adayi       ${s.aday} / ${IDDIA.length * AKIS.length}`);
console.log(`    kanit                    ${s.kanit}`);
console.log(`    cikarim                  ${s.cikarim}`);
console.log(`  bicim cikarimi yanlis olan ${s.yanlisEtiket} akis`);

const sifreli = AKIS.filter((a) => a.sifreli);
console.log('\n4. sifreli akista ici gorme secenekleri');
console.log(`  sifreli akis                          ${sifreli.length} / ${AKIS.length}`);
console.log(`  uc ajaniyla anahtara erisim var       ${sifreli.filter((a) => a.anahtar !== 'yok').length}`);
console.log(`  araya girmeden cozulemez              ${sifreli.filter((a) => a.anahtar === 'yok').length}`);
console.log(`  pasif cozumlemenin hedefte izi        0 kayit`);
console.log(`  araya girmenin hedefte izi            akis basina 1 uyari (aktif adim)`);
```

```
1. akis basina cozumleme derinligi
akis                   gercek bicim      tasima sifreli tanimli okunan           etiket     derinlik
s1-ucu>toplayici       olcum-protokolu      502    evet       4      0  olcum-protokolu  yalniz-meta
s2-ucu>toplayici       olcum-protokolu      502    evet       4      0  olcum-protokolu  yalniz-meta
toplayici>dogrulayici  sifreli-oturum       443    evet       0      0   sifreli-oturum  yalniz-meta
abone-ucu>portal       sifreli-oturum       443    evet       0      0   sifreli-oturum  yalniz-meta
saha-uc>saha-svc       ikili-senkron       8080   hayir       3      0      metin-istek          yok
yonetim>toplayici      metin-istek           80   hayir       6      6      metin-istek          tam
yonetim>dogrulayici    metin-istek           80   hayir       6      6      metin-istek          tam
fatura>dis-uc          sifreli-oturum       443    evet       0      0   sifreli-oturum  yalniz-meta
toplayici>fatura       ikili-senkron        502   hayir       3      0  olcum-protokolu          yok
saha-uc>dosya-svc      dosya-aktarimi        21   hayir       4      4   dosya-aktarimi          tam

2. iddia turu basina karsilanma (10 akis)
iddia                    tur  kanit  cikarim  karsilanmaz
akis-suresi-ve-hacmi    meta     10        0            0
duzenli-aralik-var      meta     10        0            0
karsi-uc-adi            meta      5        0            5
oturum-parametreleri    meta      5        0            5
konusulan-bicim         alan      3        7            0
istenen-kaynak          alan      3        5            2
islem-sonucu            alan      2        8            0
yazma-mi-okuma-mi       alan      1        9            0
aktarilan-dosya         alan      1        9            0
kayit-sayisi            alan      0       10            0
tasinan-kimlik-alani    alan      3        0            7
yazilan-olcum-degeri    alan      0        0           10

3. toplam
  tanimli uygulama alani     30
  okunan uygulama alani      16
  uretilen meta alani        70
  yanlis etiketlenen akis    2 / 10
  uretilen iddia adayi       91 / 120
    kanit                    43
    cikarim                  48
  bicim cikarimi yanlis olan 2 akis

4. sifreli akista ici gorme secenekleri
  sifreli akis                          5 / 10
  uc ajaniyla anahtara erisim var       3
  araya girmeden cozulemez              2
  pasif cozumlemenin hedefte izi        0 kayit
  araya girmenin hedefte izi            akis basina 1 uyari (aktif adim)
```

#### Çözümleyicinin Kendi Yorumu

İlk tablonun son iki sütunu bu dersin en sessiz bulgusudur. Tanımlı 30 uygulama alanının yalnız
16'sı okunuyor. Kayıp iki yerden geliyor: beş akış şifreli, iki akış da **yanlış etiketlenmiş**.

Yanlış etiket, aracın bir kusuru değil bir varsayımın sonucudur. Saha eşitlemesi ikili bir biçim
konuşuyor ama alışılmış metin numarasının bir yakınında dinliyor; çözümleyici metin isteği
varsayıyor ve üç tanımlı alandan hiçbirini okuyamıyor. Toplayıcıdan faturalamaya giden akış ölçüm
numarası üzerinden ikili eşitleme yapıyor; çözümleyici ölçüm protokolü etiketi basıyor. İkisinde de
çıktı boş değildir — çıktı **yanlıştır**. Rapora "şu akışta ölçüm protokolü konuşuluyor" satırı
girerse, o satır bir yanlış pozitiftir ve kaynağı hedefteki sistem değil, çözümleyicinin kendisidir.

İkinci tabloda `konusulan-bicim` satırı bunu sayıyla verir: üç akışta biçim gerçekten okunan bir
alandan doğrulanmış, yedi akışta yalnız taşıma numarasından çıkarılmış ve o yedinin **ikisi
yanlış**. Bir çıkarımı kanıta çevirmenin yolu, biçimi ele veren bir alanı gerçekten okumaktır.

Bu iki akışın ikinci bir okuması daha vardır ve savunma tarafına yazılır. Alışılmış numarasının
dışında konuşan bir servis, envanterde kolay gözden kaçar ve numaraya bakarak sınıflandıran her
denetimi aynı biçimde şaşırtır. Değerlendirmenin çözümleyicisini yanıltan şey, savunmanın
sınıflandırıcısını da yanıltır; bulgu "çözümleyici yanıldı" değil, "bu iki akış hiçbir numara
temelli sınıflandırmaya girmiyor" biçiminde yazılır.

#### Meta Verinin Söylediği ve Söylemediği

Doksan bir aday üretildi; 43'ü kanıt, 48'i çıkarım. Çıkarım sütunu neredeyse yarıdır ve içeriği
belirgin bir düzen gösteriyor. `kayit-sayisi` on akışın onunda çıkarım, sıfırında kanıt: paket boyut
dizisine bakıp "şu kadar kayıt aktarıldı" demek her akışta mümkündür ve hiçbir akışta kanıt değildir.
`islem-sonucu` sekiz akışta çıkarım — yanıt boyutundan başarı okumak eski bir alışkanlıktır ve
şifreli akışlarda tek seçenek gibi görünür.

Buna karşılık iki satır hiç çıkarım üretmiyor. `tasinan-kimlik-alani` üç akışta kanıt, yedi akışta
karşılanmaz; `yazilan-olcum-degeri` on akışın onunda karşılanmaz. Bu iki satır şifrelemenin
gerçekten tuttuğu yerdir: kimlik alanının içeriği ve yazılan ölçüm değeri meta veriden türetilemez,
vekilleri yoktur. Değerlendirme raporunda "karşılanmaz" yazmak bir eksiklik değil, doğru cevaptır;
çıkarımı kanıt diye yazmak eksikliktir.

Meta türü dört iddia toplam 30 kanıt üretiyor ve bunların 10'u yalnız şifreli akışlardan geliyor —
sunucu adı alanı ile el sıkışma parametreleri. Şifreleme uygulama alanlarını kapatırken bu iki alanı
açık bırakır ve `istenen-kaynak` iddiasına beş akışta bir vekil sağlar. Şifreli trafik, sorunun
tamamını kapatmaz; hangi tarafla konuşulduğunu ve ne kadar konuşulduğunu söylemeye devam eder.

#### Şifrenin İçini Görmenin Bedeli

Beş şifreli akışın üçünde anahtar malzemesine erişim kurumun kendi ucundadır: ölçüm uçları ve
toplayıcı kurumun yönettiği aygıtlardır, uçtaki bir ajan çözümlemeyi kapsam içinde mümkün kılar.
Kalan ikisi abone portalı oturumu ile dış bildirim akışıdır. Birincisinin diğer ucunda bir abone
vardır, ikincisininkinde başka bir kurum. Bu iki akışın içini görmenin tek yolu araya girmektir;
araya girmek pasif olmaktan çıkmak, hedefte kayıt ve uyarı üretmek ve üçüncü tarafın trafiğine
dokunmak demektir. Yazılı yetki ve tanımlı kapsam bunları içermiyorsa bu adım hem yasadışı hem
meslek dışıdır ve iki akış **çözümlenmeden bırakılır**.

Savunmada bırakılan iz de burada ikiye ayrılır. Pasif çözümleme önceki dersteki gibi sıfır kayıt
üretir. Araya girerek çözme akış başına en az bir uyarı üretir — kurulan güven zincirinin
beklenenden farklı olması, uçtaki denetimin göreceği ilk şeydir. Bu, kursta ilk kez sıfır olmayan
iz sütunudur ve nedeni araçların değişmesi değil, adımın **aktif** hale gelmesidir.

#### Özet

- On akışta tanımlı 30 uygulama alanının 16'sı okunur; kaybın beş akışlık bölümü şifrelemeden, iki
  akışlık bölümü biçim varsayımının tutmamasından gelir.
- Çözümleyici biçimi taşıma bilgisinden varsayar; iki akış yanlış etiketlenir ve çıktı boş değil
  yanlış olur. Bu, hedeften değil araçtan gelen bir yanlış pozitif kaynağıdır.
- Doksan bir adayın 43'ü kanıt, 48'i meta veriden yapılan vekil çıkarımdır; `kayit-sayisi` on
  akışın onunda çıkarım, sıfırında kanıttır.
- Kimlik alanının içeriği ve yazılan ölçüm değeri hiçbir akışta meta veriden türetilemez;
  şifrelemenin gerçekten tuttuğu yer bu iki satırdır.
- Beş şifreli akışın üçünde anahtara kurum içinden erişilir; ikisi abone ve üçüncü taraf içerdiği
  için çözümlenmeden bırakılır.
- Pasif çözümleme sıfır kayıt bırakır; araya girerek çözme akış başına en az bir uyarı üretir ve
  adımı aktif sınıfa taşır.

#### Sonraki Adım

Buraya kadar iki araç da yalnız **bakan** araçlardı: geçen trafiği kaydettiler ve okuyabildikleri
alanları okudular. İkisinin de ortak sınırı şu: bir akışta bir alanın belirli bir değerle geçtiğini
görmek, o alana **başka bir değer** yazıldığında sistemin ne yapacağını söylemez. Bir adayın
gerçekten açık olduğunu göstermek için isteği değiştirip yanıtı görmek gerekir.

Sonraki ders vekil aracı bir doğrulama adımı olarak ele alır ve tek soruyu sorar: bir adayın açık
olduğunu göstermek kaç istek ister. İstekler üç risk sınıfına ayrılır — yalnız gözleyen, hedefte
durum değiştiren ve hizmeti kesme riski taşıyan — ve her adayın doğrulama planı bu sınıflar
cinsinden sayılır. Ayrıca kapsam denetimi ilk kez devreye girer: bazı istekler kapsam dışındaki bir
tarafa dokunduğu için hiç gönderilemez ve o adaylar kanıta dönüşmeden kalır.

### İstek Manipülasyonu

Source: https://academia.sh/tr/kurslar/sizma-testi/istek-manipulasyonu

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

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

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

#### İki Ayrı Sınıflandırma

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

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

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

- **AA15.** Aday listesi, plan uzunlukları, kapsam sınıfları ve `gercek` alanı **modeldir**.
  `gercek`, adayın doğrulama sonunda ortaya çıkacak durumudur; doğrulamadan önce bilinmez ve
  yalnız modelin sonucu hesaplayabilmesi için yazılmıştır.
- **AA16.** Doğrulama planı bir adayın açık olduğunu göstermek için gereken **en kısa** istek
  dizisidir. Plan uzunlukları elle yazıldı.
- **AA17.** Bir plan ancak **bütün** adımları çalıştırılabiliyorsa sonuç üretir. Eksik çalışan plan
  "açık değil" demez; `dogrulanamadi` der.
- **AA18.** Her istek hedefte bir kayıt üretir. Uyarı sayısı risk sınıfına bağlıdır: `g` sıfır,
  `d` bir, `y` üç. Süreler istek başına elle yazıldı.
- **AA19.** Kapsam denetimi programlıdır: izin verilen istek sınıfı, kural kümesi ile kapsam
  sınıfının kesişimidir. Kesişim boşsa istek gönderilmez.
- **AA20.** Üç kural kümesi, katılım kurallarının üç ayrı sıkılık düzeyini temsil eder.
- **AA21.** Yanlış pozitif, planı tam koşan ve açık olmadığı görülen adaydır; bu adayın raporda
  yeri yoktur.

```js
// vek/dogrula.mjs — vekil aracla dogrulamanin ADIM SAYISI ve RISK SINIFI modelidir.
// Hicbir istek icerigi, dizge ya da yuk yazilmaz; istekler yalniz sinifiyla sayilir.
// g = yalniz gozleyen (durum degistirmez), d = hedefte durum degistiren,
// y = hizmeti kesme riski tasiyan.
export const RISK = {
  g: { kayit: 1, uyari: 0, dk: 2 },
  d: { kayit: 1, uyari: 1, dk: 5 },
  y: { kayit: 1, uyari: 3, dk: 15 },
};

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

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

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

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

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

#### On Sekiz Aday, Üç Kural Kümesi

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

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

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

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

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

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

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

```
18 aday, 40 planli istek: g=27 d=10 y=3
gercekte acik olan aday 10 (model; dogrulamadan once bilinmiyor)

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

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

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

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

#### Doğrulamanın Asıl Kazancı

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

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

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

#### Planın Uzunluğu Bir Bulgudur

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

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

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

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

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

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

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

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

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

#### Özet

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

#### Sonraki Adım

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

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

### Sanal Alan Analizi

Source: https://academia.sh/tr/kurslar/sizma-testi/sanal-alan-analizi

Sanal alan çözümlemesinin gizlenen davranış cinsinden ölçülmesi: 14 kalemin hazır görüntüde 5'inin ortamı fark edip belirleyici davranışını göstermemesi, karara bağlanan kalem sayısının 7'den 12'ye çıkarken toplam sürenin 288 dakikadan 965 dakikaya yükselmesi, bir ortam ipucunun hiçbir ortamda gizlenememesi ve çözümlemenin hedefte sıfır kayıt bırakıp karşı tarafa iz düşürmesi.

Önceki üç araç ağ üzerinde çalıştı. Değerlendirme sırasında incelenmesi gereken kalemlerin bir
bölümü ise dosyadan gelir: bir uçta bulunan bilinmeyen bir çalıştırılabilir, bir ekten çıkan arşiv,
saha ekibinin dışarıdan aldığı bir yardımcı araç. Bunların ne yaptığını istek göndererek öğrenmek
mümkün değildir; öğrenmenin yolu kalemi yalıtılmış bir yerde **çalıştırıp** davranışını gözlemektir.

Sanal alanın yalıtım gücü Uç Nokta Güvenliği kursunda ölçüldü ve burada girdi olarak alınır; bu
derste ölçülen şey yalıtım değil **çözümlemenin verimidir**. Tek soru şudur: bir kalemin
davranışlarından kaçı gözlenebiliyor, kaçı ortamın bir çözümleme ortamı olduğunu fark edip
gizleniyor ve kaç kalem karara bağlanamadan kalıyor.

#### Ortam İpucu ve Gizlenme

Bir kalem çalışırken bulunduğu ortama bakabilir. Baktığı şeyler, çözümleme ortamlarını gerçek
uçlardan ayıran izlerdir: makinenin çok kısa süredir açık olması, aygıt sayısının azlığı, kullanıcı
geçmişinin boş olması, çözümleme araçlarının bıraktığı izler, saatin hızlandırılmış olması, ağ
yanıtlarının tek düze olması. Bu izlerden biri bile duruyorsa kalem ortamı tanır ve **belirleyici
davranışını hiç göstermez** — çalışır, zararsız birkaç iş yapar ve durur.

Her izi gizlemek mümkündür ve her birinin bir **hazırlık maliyeti** vardır: görüntünün elden
geçirilmesi, sahte bir kullanıcı geçmişinin oluşturulması, araç izlerinin temizlenmesi. Bir iz
bunun dışında kalır. Ağ yanıtlarının tek düze olmasını gidermenin tek yolu, kalemin gerçek bir
hedefe ulaşmasına izin vermektir; yetkilendirilmiş bir değerlendirmede bu adım kapsamın dışındadır
ve yazılı yetki olmadan başka bir tarafın altyapısına bağlantı kurmak hem yasadışı hem meslek
dışıdır. Bu iz, hazırlıkla kapanmayan bir sınırdır.

- **AA22.** İpucu kataloğu, ortamlar, kalem listesi ve davranışlar **modeldir**; gerçek bir kalem
  çalıştırılmadı. Kalemler yalnız denetlediği ipucu ve gözlenen davranış sınıfıyla anılır.
- **AA23.** Yalıtımın gücü burada ölçülmez, girdi olarak alınır.
- **AA24.** Bir kalem, denetlediği ipuçlarından **en az biri** gizlenmemişse ortamı fark eder ve
  belirleyici davranışlarını göstermez. Zararsız davranışları göstermeye devam eder.
- **AA25.** Bir davranışın görünmesi için gözlem penceresinin gecikmesinden büyük olması gerekir.
  Gecikmeler ve pencereler elle yazıldı; rastgelelik yok.
- **AA26.** Karar üç değerlidir. **Kanıt**: belirleyici bir davranış gözlendi. **Temiz**: kalem
  gizlenmedi, bütün davranışları pencereye sığdı ve hiçbiri belirleyici değildi. **Belirsiz**:
  kalan her durum.
- **AA27.** Belirleyici işaret davranışa aittir, kaleme değil; meşru bir kalem de belirleyici
  sayılan bir davranış gösterebilir.
- **AA28.** Çözümleme hedef ortamda koşmaz; hedef sistemlerde kayıt üretmez.

```js
// alan/gozlem.mjs — sanal alan COZUMLEMESI modelidir. Gercek bir kalem calistirilmaz;
// kalemler yalniz denetledigi ortam ipucu ve gozlenen davranis sinifiyla anilir.
// Yalitimin gucu burada olculmez; Uc Nokta Guvenligi kursundan girdi olarak alinir.
// ipucu -> o ipucunu gizlemenin hazirlik maliyeti (dk)
export const IPUCU = {
  'kisa-calisma-suresi': 8, 'az-aygit-sayisi': 12, 'bilinen-arac-izleri': 15,
  'bos-kullanici-gecmisi': 20, 'hizlandirilmis-saat': 10, 'tekduze-ag-yaniti': 0,
};

// Cozumleme ortami: hangi ipuclarini gizliyor, gozlem penceresi kac dakika.
// 'tekduze-ag-yaniti' hicbir ortamda gizlenmez: gizlemek kalemin gercek bir hedefe
// ulasmasini gerektirir ve yetkilendirilmis bir degerlendirmede bu kapsam disidir.
export const ORTAM = {
  'hazir-goruntu':    { gizler: ['kisa-calisma-suresi'], pencere: 5 },
  'elden-gecirilmis': { gizler: ['kisa-calisma-suresi', 'az-aygit-sayisi', 'bilinen-arac-izleri'], pencere: 20 },
  'gercege-yakin':    { gizler: ['kisa-calisma-suresi', 'az-aygit-sayisi', 'bilinen-arac-izleri',
    'bos-kullanici-gecmisi', 'hizlandirilmis-saat'], pencere: 60 },
};
export const ELLE_DK = 30;   // belirsiz kalem basina elle inceleme

// satir: kalem | gercek | denetledigi ipuclari | davranislar (ad:gecikme, * belirleyici)
export const KALEM = `
  k01 kotu  kisa-calisma-suresi                    dosya-yazma:0,*kalicilik:2
  k02 kotu  az-aygit-sayisi,bilinen-arac-izleri    surec-olusturma:0,*kimlik-okuma:5
  k03 kotu  bos-kullanici-gecmisi                  dosya-yazma:0,*dis-baglanti:10
  k04 kotu  hizlandirilmis-saat                    dosya-yazma:0,*zamanli-tetik:45
  k05 kotu  tekduze-ag-yaniti                      surec-olusturma:0,*dis-baglanti:3
  k06 kotu  -                                      dosya-yazma:0,*kalicilik:1,dis-baglanti:4
  k07 kotu  kisa-calisma-suresi,tekduze-ag-yaniti  dosya-yazma:0,*kimlik-okuma:8
  k08 temiz -                                      dosya-yazma:0,surec-olusturma:1
  k09 temiz -                                      dosya-yazma:0,dis-baglanti:2
  k10 temiz -                                      dosya-yazma:0,surec-olusturma:0,dis-baglanti:1
  k11 temiz -                                      dosya-yazma:0,*kimlik-okuma:3
  k12 temiz -                                      dosya-yazma:0,zamanli-tetik:40
  k13 temiz -                                      surec-olusturma:0,dis-baglanti:35
  k14 temiz -                                      dosya-yazma:0
`.trim().split('\n').map((r) => {
  const [ad, gercek, ipucu, dav] = r.trim().split(/\s+/);
  return { ad, kotu: gercek === 'kotu',
    kontrol: ipucu === '-' ? [] : ipucu.split(','),
    davranis: dav.split(',').map((d) => {
      const [n, g] = d.split(':');
      return { ad: n.replace('*', ''), belirleyici: n.startsWith('*'), gecikme: +g };
    }) };
});

// Kalem, denetledigi ipuclarindan biri gizlenmemisse ortami fark eder ve GIZLENIR:
// belirleyici davranislarini hic gostermez.
export const gizlenir = (k, o) => k.kontrol.some((i) => !ORTAM[o].gizler.includes(i));

export function gozlem(k, o) {
  const p = ORTAM[o].pencere;
  const g = gizlenir(k, o);
  const gorulen = k.davranis.filter((d) => d.gecikme <= p && !(g && d.belirleyici));
  const bastirilan = k.davranis.length - gorulen.length;
  let karar = 'belirsiz';
  if (gorulen.some((d) => d.belirleyici)) karar = 'kanit';
  else if (!g && bastirilan === 0) karar = 'temiz';
  return { gizlendi: g, gorulen: gorulen.length, bastirilan, karar,
    disBaglanti: gorulen.some((d) => d.ad === 'dis-baglanti') };
}

export function ortamOlc(o) {
  const s = { hazirlik: 0, gizlenen: 0, gorulen: 0, bastirilan: 0, kanit: 0, temiz: 0,
    belirsiz: 0, yanlisKanit: 0, kacan: 0, disIz: 0 };
  s.hazirlik = ORTAM[o].gizler.reduce((t, i) => t + IPUCU[i], 0);
  for (const k of KALEM) {
    const r = gozlem(k, o);
    if (r.gizlendi) s.gizlenen += 1;
    s.gorulen += r.gorulen; s.bastirilan += r.bastirilan; s[r.karar] += 1;
    if (r.karar === 'kanit' && !k.kotu) s.yanlisKanit += 1;
    if (r.karar !== 'kanit' && k.kotu) s.kacan += 1;
    if (r.disBaglanti) s.disIz += 1;
  }
  s.gozlemDk = KALEM.length * ORTAM[o].pencere;
  s.elleDk = s.belirsiz * ELLE_DK;
  s.toplamDk = s.hazirlik + s.gozlemDk + s.elleDk;
  return s;
}
```

#### On Dört Kalem, Üç Ortam

```js
// alan/olc.mjs — on dort kalem uc cozumleme ortaminda gozlenir.
import { IPUCU, ORTAM, KALEM, ELLE_DK, gizlenir, gozlem, ortamOlc } from './gozlem.mjs';

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

console.log(`${KALEM.length} kalem (${KALEM.filter((k) => k.kotu).length} kotu), ` +
  `${Object.keys(IPUCU).length} ortam ipucu, ${Object.keys(ORTAM).length} cozumleme ortami`);
console.log(`hicbir ortamda gizlenemeyen ipucu: ` +
  Object.keys(IPUCU).filter((i) => !Object.values(ORTAM).some((o) => o.gizler.includes(i))).join(', '));

const A = [-18, 9, 10, 9, 12, 8, 8, 10, 13];
console.log('\n1. ortam basina sonuc');
y(A, 'ortam', 'pencere', 'gizlenen', 'gorulen', 'bastirilan', 'kanit', 'temiz', 'belirsiz', 'yanlis kanit');
for (const o of Object.keys(ORTAM)) {
  const s = ortamOlc(o);
  y(A, o, ORTAM[o].pencere, s.gizlenen, s.gorulen, s.bastirilan, s.kanit, s.temiz, s.belirsiz,
    s.yanlisKanit);
}

const B = [-7, 8, 21, 21, 21];
console.log('\n2. kalem basina karar');
y(B, 'kalem', 'gercek', ...Object.keys(ORTAM));
for (const k of KALEM)
  y(B, k.ad, k.kotu ? 'kotu' : 'temiz', ...Object.keys(ORTAM).map((o) => {
    const r = gozlem(k, o);
    return r.gizlendi ? `${r.karar} (gizlendi)` : r.karar;
  }));

const C = [-18, 10, 11, 9, 11, 12, 9];
console.log('\n3. bedel ve iz');
y(C, 'ortam', 'hazirlik', 'gozlem dk', 'elle dk', 'toplam dk', 'kacan kotu', 'dis iz');
for (const o of Object.keys(ORTAM)) {
  const s = ortamOlc(o);
  y(C, o, s.hazirlik, s.gozlemDk, s.elleDk, s.toplamDk, s.kacan, s.disIz);
}

const h = ortamOlc('hazir-goruntu'), g = ortamOlc('gercege-yakin');
console.log(`\nkarara baglanan kalem  ${h.kanit + h.temiz} -> ${g.kanit + g.temiz} / ${KALEM.length}`);
console.log(`ortami fark eden kalem ${h.gizlenen} -> ${g.gizlenen} / ${KALEM.length}`);
console.log(`hedefte uretilen kayit 0 (cozumleme hedef ortamda kosmaz)`);
console.log(`elle inceleme suresi   ${ELLE_DK} dk/kalem`);
```

```
14 kalem (7 kotu), 6 ortam ipucu, 3 cozumleme ortami
hicbir ortamda gizlenemeyen ipucu: tekduze-ag-yaniti

1. ortam basina sonuc
ortam               pencere  gizlenen  gorulen  bastirilan   kanit   temiz  belirsiz yanlis kanit
hazir-goruntu             5         5       22           7       3       4         7            1
elden-gecirilmis         20         4       23           6       4       4         6            1
gercege-yakin            60         2       27           2       6       6         2            1

2. kalem basina karar
kalem    gercek        hazir-goruntu     elden-gecirilmis        gercege-yakin
k01        kotu                kanit                kanit                kanit
k02        kotu  belirsiz (gizlendi)                kanit                kanit
k03        kotu  belirsiz (gizlendi)  belirsiz (gizlendi)                kanit
k04        kotu  belirsiz (gizlendi)  belirsiz (gizlendi)                kanit
k05        kotu  belirsiz (gizlendi)  belirsiz (gizlendi)  belirsiz (gizlendi)
k06        kotu                kanit                kanit                kanit
k07        kotu  belirsiz (gizlendi)  belirsiz (gizlendi)  belirsiz (gizlendi)
k08       temiz                temiz                temiz                temiz
k09       temiz                temiz                temiz                temiz
k10       temiz                temiz                temiz                temiz
k11       temiz                kanit                kanit                kanit
k12       temiz             belirsiz             belirsiz                temiz
k13       temiz             belirsiz             belirsiz                temiz
k14       temiz                temiz                temiz                temiz

3. bedel ve iz
ortam               hazirlik  gozlem dk  elle dk  toplam dk  kacan kotu   dis iz
hazir-goruntu              8         70      210        288           5        3
elden-gecirilmis          35        280      180        495           4        3
gercege-yakin             65        840       60        965           2        5

karara baglanan kalem  7 -> 12 / 14
ortami fark eden kalem 5 -> 2 / 14
hedefte uretilen kayit 0 (cozumleme hedef ortamda kosmaz)
elle inceleme suresi   30 dk/kalem
```

#### Gizlenen Davranış

İlk tablonun `gizlenen` sütunu bu dersin ölçüsüdür. Hazır bir görüntüde on dört kalemin **beşi**
ortamı fark ediyor ve belirleyici davranışını hiç göstermiyor. Ortam elden geçtikçe bu sayı 4'e,
sonra 2'ye iniyor. Gözlenen davranış 22'den 27'ye çıkarken bastırılan davranış 7'den 2'ye düşüyor.

Gizlenme, gözlem penceresinin kısalığından farklı bir şeydir ve ikisini ayırmak gerekir. Pencere
kısaysa davranış **henüz** görünmemiştir; uzatmak çözer. Kalem gizleniyorsa davranış **hiç**
görünmeyecektir; pencereyi uzatmak bir şey değiştirmez, ipucunu gizlemek gerekir. İkinci tabloda bu
ayrım kalem kalem okunur: `k04` kırk beş dakika gecikmeli bir davranışa sahiptir ve saat ipucunu
denetler; onu görmek için hem pencerenin altmış dakikaya çıkması hem de hızlandırılmış saatin
gizlenmesi gerekir — biri olmadan öteki yetmez. Buna karşılık `k12` ve `k13` hiçbir şey
denetlemez; onlar için pencereyi uzatmak tek başına yeter ve ikisi de en geniş ortamda temiz çıkar.

Hazırlığın hangi adımının hangi kalemi açtığı da bu tablodan okunur ve kazanç eşit dağılmaz. Hazır
görüntüden elden geçirilmiş ortama geçmek 27 dakika ek hazırlık ister ve tek bir kalemi — aygıt
sayısı ile araç izlerini birlikte denetleyen `k02` — kanıta çevirir. Elden geçirilmişten gerçeğe
yakına geçmek 30 dakika ek hazırlık ve üç kat uzun pencere ister; karşılığında `k03` ile `k04`
kanıta, `k12` ile `k13` temize döner. İkinci adım birincinin biraz üzerinde bir hazırlık maliyetiyle
dört kat iş görür, ama bunu pencere süresini 280 dakikadan 840 dakikaya çıkararak yapar. Hazırlık
ucuz, pencere pahalıdır ve ikisi ayrı kalemlerdir.

İki kalem hiçbir ortamda karara bağlanamıyor: `k05` ve `k07`. İkisi de ağ yanıtlarının tek
düzeliğini denetliyor ve o ipucu hiçbir ortamda gizlenmiyor. Yedi kötü kalemin ikisi, çözümleme
ortamının kalitesinden bağımsız olarak **belirsiz** kalır. Bu iki kalem elle incelemeye devredilir
ve raporda "çözümleme karara bağlayamadı" satırıyla yer alır.

#### Kanıt, Temiz ve Yanlış Kanıt

Aday–kanıt farkı burada üç değerli okunur. On dört kalem çözümlemeye aday olarak gelir. Hazır
görüntüde 3'ü kanıta dönüşür, 4'ü temiz çıkar, 7'si belirsiz kalır. En iyi ortamda 6 kanıt, 6 temiz
ve 2 belirsiz vardır. Karara bağlanan kalem sayısı **7'den 12'ye** çıkar.

Temiz çıkan kalemler kanıt kadar değerlidir. Bir kalemin bütün davranışları görüldü ve hiçbiri
belirleyici değilse o kalem kuyruktan düşer; bu, aday listesini kısaltan tek mekanizmadır. Ama
"temiz" kararının koşulu katıdır: kalem gizlenmemiş **ve** hiçbir davranışı bastırılmamış olmalıdır.
Bastırılmış tek bir davranış varsa karar temize değil belirsize gider. Bu katılık kasıtlıdır, çünkü
gevşetildiğinde `k05` ve `k07` sessizce temiz sayılır.

Ters yönde bir hata her ortamda duruyor: **yanlış kanıt** sütunu üçünde de 1. Meşru bir kalem,
belirleyici sayılan bir davranışı gösteriyor ve çözümleme onu kanıt olarak işaretliyor. Hazırlığı
artırmak, pencereyi uzatmak ve ipuçlarını gizlemek bu satırı değiştirmez, çünkü eksik olan gözlem
değil **bağlamdır**. Sanal alan davranışı görür; o davranışın yerinde olup olmadığını, kalemin hangi
işi yapmak üzere kurulduğunu görmez. Bu yüzden çözümleme çıktısı tek başına bir karar değil, bir
karara girdidir.

#### Bedel ve Karşı Tarafa Düşen İz

Üçüncü tablo maliyeti veriyor ve tek yönlü artıyor. Hazırlık 8 dakikadan 65'e, gözlem 70'ten 840'a
çıkıyor. Elle inceleme ters yönde gidiyor — 210 dakikadan 60'a — ama düşüş artışı karşılamıyor:
toplam 288 dakikadan 965 dakikaya, üç katından fazlasına çıkıyor. Karşılığında karara bağlanan
kalem beş tane artıyor ve kaçan kötü kalem 5'ten 2'ye iniyor. Kalem başına ödenen bedel yaklaşık
135 dakikadır.

Son sütun bu kursta ilk kez görülen bir iz türüdür. Hedef sistemlerde üretilen kayıt **sıfırdır**;
çözümleme hedef ortamda koşmaz, hiçbir isteği hedefe ulaşmaz. Ama gözlem sırasında dış bağlantı
denemesi yapan kalem sayısı 3'ten 5'e çıkıyor ve bu denemeler bir yere gider. Denetimli ağ bunları
gerçek bir hedefe ulaştırmasa bile, denemenin kendisi ve zamanlaması karşı tarafa bir şey söyleyecek
biçimde dışarı sızabilir. Çözümleme ortamı ne kadar gerçeğe yakınsa kalem o kadar çok davranış
gösterir; gösterdiği her davranış aynı zamanda **incelendiğinin işaretidir**.

Bu, kursun iz sütununu ikiye ayırır: savunmanın gördüğü iz ve karşı tarafın görebileceği iz.
İkisinin yönü terstir. Savunmanın gördüğü iz değerlendirmenin kurum içinde şeffaf yürüdüğünün
işaretidir ve fazlalığı yalnız gürültü yaratır. Karşı tarafa düşen iz ise geri alınamaz: bir kalemin
incelendiğinin öğrenilmesi, o kalemi kullananın davranışını değiştirmesine yeter ve sonraki bütün
ölçümleri bozar. Bir sonraki ders ikincisini çok daha keskin bir biçimde ölçecektir.

#### Özet

- On dört kalemin hazır bir görüntüde beşi ortamı fark edip belirleyici davranışını göstermez; ortam
  elden geçtikçe bu sayı 2'ye iner ve gözlenen davranış 22'den 27'ye çıkar.
- Gizlenme ile kısa pencere ayrı sorunlardır: birincisi ipucu gizlemekle, ikincisi pencereyi
  uzatmakla çözülür ve bazı kalemler ikisini birden ister.
- Bir ortam ipucu hiçbir ortamda gizlenemez, çünkü gizlemek kalemin gerçek bir hedefe ulaşmasını
  gerektirir ve bu kapsam dışıdır; yedi kötü kalemin ikisi bu nedenle her ortamda belirsiz kalır.
- Karara bağlanan kalem 7'den 12'ye çıkar; temiz çıkan kalem, aday listesini kısaltan tek
  mekanizmadır ve koşulu katıdır.
- Yanlış kanıt üç ortamda da 1'dir; eksik olan gözlem değil bağlamdır ve hazırlıkla kapanmaz.
- Toplam süre 288 dakikadan 965 dakikaya çıkar; hedefte üretilen kayıt sıfırdır ama dış bağlantı
  denemesi yapan kalem sayısı 3'ten 5'e çıkarak karşı tarafa iz bırakır.

#### Sonraki Adım

Bu derste tek bir çözümleme ortamının kararı ölçüldü ve iki kalem karara bağlanamadan kaldı. Bir
kalemi karara bağlamanın ikinci bir yolu daha vardır: aynı kalemi **çok sayıda bağımsız motora**
sorup çıkan sonuçları birleştirmek. Bu yol çözümleme süresini dakikalardan saniyelere indirir ve
karşılığında yeni bir soru getirir — birbiriyle çelişen sonuçlar nasıl birleştirilir.

Sonraki ders çoklu motor itibar servislerini bu eksende ele alır. Aynı kalem kümesi çok sayıda
motordan geçirilir, **çoğunluk kararının** yanlış pozitif ve yanlış negatif oranı eşik eşik ölçülür
ve tek motora güvenmenin bedeli sayılır. Bunun yanında gizlilik bedeli hesaplanır: bir dosyayı
dışarıdaki bir servise göndermek onu yayımlamaktır ve kurgu ölçüm ağındaki kalemlerin bir bölümü
abone verisi taşır.

### Dosya ve Bağlantı İtibar Servisleri

Source: https://academia.sh/tr/kurslar/sizma-testi/dosya-ve-baglanti-itibar-servisleri

Çoklu motor itibar sonucunun birleştirilmesinin ölçülmesi: 24 kalem ve 12 motorda çoğunluk eşiği yükseldikçe anmanın yüzde 92'den 8'e düşmesi, kesinliğin ise yüzde 50'den yedinci eşikte yüzde 86'ya çıkıp sonra yeniden yüzde 50'ye dönmesi, tek motor ailesi içinde çoğunluk kararının tek motor seçmekle özdeş çıkması, 24 kalemin 10'unun gizlilik sınırı nedeniyle hiç sorulamaması ve her sorgunun karşı tarafa iz bırakması.

Önceki derste iki kalem hiçbir çözümleme ortamında karara bağlanamadı ve her kalem için ayrı bir
hazırlık, gözlem ve elle inceleme bütçesi harcandı. Bir kalemi karara bağlamanın ikinci bir yolu
daha vardır: aynı kalemi çok sayıda bağımsız motora sorup çıkan sonuçları birleştirmek. Bu yol
saniyeler sürer ve karşılığında yeni bir soru getirir — birbiriyle çelişen sonuçlar nasıl
birleştirilir.

**Çoklu motor itibar servisi** bir kalemi ya da bir bağlantı hedefini birçok denetim motoruna
sorar ve dönen işaretleri bir arada gösterir. Çıktı bir karar değil, bir **oy dağılımıdır**; kararı
veren, o dağılımı okuyan taraftır. Bu dersin ölçtüğü şey o okumanın kalitesidir.

#### Oy Saymak ve Bağımsızlık

Bir eşik seçmek gerekir: kaç motor işaretlerse kalem kötü sayılacak. Eşik düştükçe daha çok kötü
kalem yakalanır ve daha çok temiz kalem yanlışlıkla işaretlenir; yükseldikçe tersi olur. İki sayı
bu ödünleşimi ölçer. **Kesinlik (precision)**, kötü dediklerimizin ne kadarının gerçekten kötü
olduğudur. **Anma (recall)**, gerçekten kötü olanların ne kadarını yakaladığımızdır.

Çoğunluk kararının kazanç sağlaması tek bir koşula bağlıdır: motorların **birbirinden bağımsız**
yanılması. Aynı yöntemi kullanan iki motor aynı kalemlerde yanılır; ikisinin oyu bir oydan fazlasını
söylemez. Bu derste motorlar iki aileye ayrılır ve aile içinde iç içe geçmiş kabul edilir:
duyarlılığı yüksek bir motor, düşüğünün işaretlediği her kalemi işaretler. Aileler arasında böyle
bir ilişki yoktur.

- **AA29.** Motor listesi, kalem listesi ve eşik değerleri **modeldir**; gerçek bir itibar servisi,
  gerçek bir dosya ve gerçek bir açık kimliği yok.
- **AA30.** Bir motor bir kalemi ancak duyarlılığı, kalemin o ailedeki eşiğinden büyük ya da eşitse
  işaretler. Kötü kalemlerde eşik "yakalanması için gereken duyarlılık", temiz kalemlerde "yanlış
  işaretlenmesi için gereken duyarlılık" anlamına gelir.
- **AA31.** Aile içinde motorlar iç içe geçmiştir; aileler arasında bağımsızdır. Gerçekte motorlar
  arasında kısmi bağımlılık vardır ve bu model iki uç durumu birlikte gösterir.
- **AA32.** Rastgelelik yok; bütün eşikler elle yazıldı.
- **AA33.** Gizlilik sınıfı `acik` olan kalemin dosyası gönderilebilir. `ic` ve `abone-verisi`
  kalemlerinde dosya gönderilmez; yalnız özet sorulur ve özet sorgusu ancak kalem servis tarafında
  **biliniyorsa** bir sonuç döndürür.
- **AA34.** Bir dosyayı dışarıdaki bir servise göndermek onu yayımlamaktır; geri alınamaz.
- **AA35.** Sorgu hedef sistemlere gitmez; hedefte kayıt üretmez.

```js
// itibar/motor.mjs — coklu motor itibar servisi MODELIDIR. Gercek bir servis, gercek bir
// dosya ve gercek bir kalem yok; motorlar yalniz aile ve duyarlilik degeriyle anilir.
// Iki aile iki ayri sinyale bakar. Bir aile icinde motorlar ic ice gecmistir:
// duyarliligi yuksek motor, dusugunun isaretledigi her kalemi isaretler.
export const MOTOR = [
  ...[30, 40, 50, 60, 75, 90].map((d, i) => ({ ad: `i${i + 1}`, aile: 'imza', duyarlilik: d })),
  ...[30, 40, 50, 60, 75, 90].map((d, i) => ({ ad: `d${i + 1}`, aile: 'davranis', duyarlilik: d })),
];

// Kalem: kotu ise esik = yakalanmasi icin gereken en dusuk duyarlilik (aile basina).
// Temiz ise esik = yanlis isaretlenmesi icin gereken en dusuk duyarlilik. 95 = hicbir motor.
// gizlilik: acik = dosya gonderilebilir; ic ve abone-verisi = gonderilemez, yalniz ozet sorulur.
// bilinen: ozet sorgusunun servis tarafinda karsiligi var mi.
export const KALEM = `
  k01 kotu  30 30 acik         evet
  k02 kotu  40 40 acik         evet
  k03 kotu  50 40 ic           evet
  k04 kotu  60 50 acik         hayir
  k05 kotu  50 60 ic           hayir
  k06 kotu  75 60 abone-verisi evet
  k07 kotu  60 75 ic           hayir
  k08 kotu  75 75 acik         hayir
  k09 kotu  90 75 ic           evet
  k10 kotu  95 60 abone-verisi hayir
  k11 kotu  95 95 ic           hayir
  k12 kotu  40 50 acik         hayir
  k13 temiz 95 95 acik         evet
  k14 temiz 30 95 ic           evet
  k15 temiz 95 30 abone-verisi evet
  k16 temiz 40 95 ic           hayir
  k17 temiz 95 40 acik         evet
  k18 temiz 50 95 ic           hayir
  k19 temiz 95 50 abone-verisi evet
  k20 temiz 60 95 ic           hayir
  k21 temiz 95 60 acik         evet
  k22 temiz 75 95 ic           hayir
  k23 temiz 95 75 abone-verisi hayir
  k24 temiz 30 30 abone-verisi hayir
`.trim().split('\n').map((r) => {
  const [ad, gercek, imza, dav, gizlilik, bilinen] = r.trim().split(/\s+/);
  return { ad, kotu: gercek === 'kotu', esik: { imza: +imza, davranis: +dav },
    gizlilik, bilinen: bilinen === 'evet' };
});

export const isaretler = (m, k) => m.duyarlilik >= k.esik[m.aile];
export const isaretSayisi = (k, kume = MOTOR) => kume.filter((m) => isaretler(m, k)).length;

// Cogunluk karari: verilen motor kumesinde en az 'esik' motor isaretlediyse kalem kotu sayilir.
export function cogunluk(esik, kume = MOTOR) {
  const s = { dp: 0, yp: 0, yn: 0, dn: 0 };
  for (const k of KALEM) {
    const kotuDendi = isaretSayisi(k, kume) >= esik;
    if (kotuDendi && k.kotu) s.dp += 1;
    else if (kotuDendi) s.yp += 1;
    else if (k.kotu) s.yn += 1;
    else s.dn += 1;
  }
  s.kesinlik = s.dp + s.yp ? s.dp / (s.dp + s.yp) : 1;
  s.anma = s.dp / KALEM.filter((k) => k.kotu).length;
  return s;
}

export const tekMotor = (m) => cogunluk(1, [m]);

// Gizlilik siniri: dosya yalniz 'acik' kalemlerde gonderilebilir. Digerlerinde ozet sorulur
// ve ozet sorgusu ancak kalem servis tarafinda biliniyorsa bir sonuc dondurur.
export const sorulabilir = (k) => k.gizlilik === 'acik' || k.bilinen;
export const yayimlanan = (k) => k.gizlilik === 'acik';
```

#### Yirmi Dört Kalem, On İki Motor

```js
// itibar/olc.mjs — 24 kalem 12 motordan gecirilir; cogunluk esigi ve motor ailesi taranir.
import { MOTOR, KALEM, isaretSayisi, cogunluk, tekMotor, sorulabilir, yayimlanan } from './motor.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const yuzde = (x) => `${(x * 100).toFixed(0)}%`;
const imza = MOTOR.filter((m) => m.aile === 'imza');
const dav = MOTOR.filter((m) => m.aile === 'davranis');

console.log(`${KALEM.length} kalem (${KALEM.filter((k) => k.kotu).length} kotu), ` +
  `${MOTOR.length} motor: ${imza.length} imza + ${dav.length} davranis`);

const A = [-8, 8, 8, 10, 10, 14];
console.log('\n1. kalem basina isaret sayisi');
y(A, 'kalem', 'gercek', 'imza', 'davranis', 'toplam', 'gizlilik');
for (const k of KALEM)
  y(A, k.ad, k.kotu ? 'kotu' : 'temiz', isaretSayisi(k, imza), isaretSayisi(k, dav),
    isaretSayisi(k), k.gizlilik);

const B = [-6, 8, 8, 8, 10, 10];
console.log('\n2. cogunluk esigi taramasi (12 motor)');
y(B, 'esik', 'dogru+', 'yanlis+', 'yanlis-', 'kesinlik', 'anma');
for (let e = 1; e <= MOTOR.length; e += 1) {
  const s = cogunluk(e);
  y(B, e, s.dp, s.yp, s.yn, yuzde(s.kesinlik), yuzde(s.anma));
}

const C = [-24, 8, 8, 8, 10, 10];
console.log('\n3. karar kurallarinin karsilastirmasi');
y(C, 'karar kurali', 'dogru+', 'yanlis+', 'yanlis-', 'kesinlik', 'anma');
const satir = (ad, s) => y(C, ad, s.dp, s.yp, s.yn, yuzde(s.kesinlik), yuzde(s.anma));
const tekler = MOTOR.map((m) => ({ m, s: tekMotor(m) })).filter((x) => x.s.dp > 0);
const enKesin = tekler.reduce((a, b) => (b.s.kesinlik > a.s.kesinlik ? b : a));
satir(`en kesin tek motor (${enKesin.m.ad})`, enKesin.s);
satir('yalniz imza, esik 2', cogunluk(2, imza));
satir('yalniz davranis, esik 2', cogunluk(2, dav));
satir('karma, esik 3', cogunluk(3));
satir('karma, esik 5', cogunluk(5));
satir('karma, esik 7', cogunluk(7));

const ozdes = (kume) => kume.every((_, i) => {
  const a = cogunluk(i + 1, kume), b = tekMotor(kume[kume.length - 1 - i]);
  return a.dp === b.dp && a.yp === b.yp;
});
console.log(`  tek aile icinde cogunluk, tek motor secmekle ozdes mi: ` +
  `imza ${ozdes(imza) ? 'evet' : 'hayir'}, davranis ${ozdes(dav) ? 'evet' : 'hayir'}`);

console.log('\n4. gizlilik siniri ve iz');
const acik = KALEM.filter(yayimlanan), sorulur = KALEM.filter(sorulabilir);
console.log(`  dosyasi gonderilebilen (yayimlanan) kalem  ${acik.length} / ${KALEM.length}`);
console.log(`  ozet sorgusuyla karsilik bulunan kalem     ${sorulur.length - acik.length}`);
console.log(`  hicbir bicimde sorulamayan kalem           ${KALEM.length - sorulur.length}`);
console.log(`    bunlarin kotu olani                      ` +
  `${KALEM.filter((k) => k.kotu && !sorulabilir(k)).length}`);
console.log(`  abone verisi tasidigi icin gonderilemeyen  ` +
  `${KALEM.filter((k) => k.gizlilik === 'abone-verisi').length}`);
console.log(`  karsi tarafa iz birakan gonderim           ${sorulur.length}`);
console.log(`  hedef sistemlerde uretilen kayit           0`);

console.log(`\nhicbir motorun isaretlemedigi kotu kalem  ` +
  `${KALEM.filter((k) => k.kotu && isaretSayisi(k) === 0).length}`);
console.log(`butun motorlarin isaretledigi temiz kalem ` +
  `${KALEM.filter((k) => !k.kotu && isaretSayisi(k) === MOTOR.length).length}`);
console.log(`tek ailenin kor kaldigi kotu kalem        ` +
  `${KALEM.filter((k) => k.kotu && (isaretSayisi(k, imza) === 0 || isaretSayisi(k, dav) === 0)).length}`);
```

```
24 kalem (12 kotu), 12 motor: 6 imza + 6 davranis

1. kalem basina isaret sayisi
kalem     gercek    imza  davranis    toplam      gizlilik
k01         kotu       6         6        12          acik
k02         kotu       5         5        10          acik
k03         kotu       4         5         9            ic
k04         kotu       3         4         7          acik
k05         kotu       4         3         7            ic
k06         kotu       2         3         5  abone-verisi
k07         kotu       3         2         5            ic
k08         kotu       2         2         4          acik
k09         kotu       1         2         3            ic
k10         kotu       0         3         3  abone-verisi
k11         kotu       0         0         0            ic
k12         kotu       5         4         9          acik
k13        temiz       0         0         0          acik
k14        temiz       6         0         6            ic
k15        temiz       0         6         6  abone-verisi
k16        temiz       5         0         5            ic
k17        temiz       0         5         5          acik
k18        temiz       4         0         4            ic
k19        temiz       0         4         4  abone-verisi
k20        temiz       3         0         3            ic
k21        temiz       0         3         3          acik
k22        temiz       2         0         2            ic
k23        temiz       0         2         2  abone-verisi
k24        temiz       6         6        12  abone-verisi

2. cogunluk esigi taramasi (12 motor)
esik    dogru+ yanlis+ yanlis-  kesinlik      anma
1           11      11       1       50%       92%
2           11      11       1       50%       92%
3           11       9       1       55%       92%
4            9       7       3       56%       75%
5            8       5       4       62%       67%
6            6       3       6       67%       50%
7            6       1       6       86%       50%
8            4       1       8       80%       33%
9            4       1       8       80%       33%
10           2       1      10       67%       17%
11           1       1      11       50%        8%
12           1       1      11       50%        8%

3. karar kurallarinin karsilastirmasi
karar kurali              dogru+ yanlis+ yanlis-  kesinlik      anma
en kesin tek motor (d5)       11       6       1       65%       92%
yalniz imza, esik 2            9       6       3       60%       75%
yalniz davranis, esik 2       11       6       1       65%       92%
karma, esik 3                 11       9       1       55%       92%
karma, esik 5                  8       5       4       62%       67%
karma, esik 7                  6       1       6       86%       50%
  tek aile icinde cogunluk, tek motor secmekle ozdes mi: imza evet, davranis evet

4. gizlilik siniri ve iz
  dosyasi gonderilebilen (yayimlanan) kalem  8 / 24
  ozet sorgusuyla karsilik bulunan kalem     6
  hicbir bicimde sorulamayan kalem           10
    bunlarin kotu olani                      4
  abone verisi tasidigi icin gonderilemeyen  6
  karsi tarafa iz birakan gonderim           14
  hedef sistemlerde uretilen kayit           0

hicbir motorun isaretlemedigi kotu kalem  1
butun motorlarin isaretledigi temiz kalem 1
tek ailenin kor kaldigi kotu kalem        2
```

#### Eşik Neyi Satın Alır

İkinci tablo bütün eşikleri sırayla deniyor ve tek bir satırın hem kesinliği hem anmayı birlikte
yükseltmediğini gösteriyor. Bir motorun işaretlemesi yeterli sayılırsa anma yüzde 92'ye çıkar ve
kesinlik yüzde 50'de kalır: kötü denilen 22 kalemin yarısı temizdir. Yedi motor istenirse kesinlik
yüzde 86'ya çıkar ve anma yüzde 50'ye düşer: altı kötü kalem gözden kaçar.

Bu eğrinin iki ucunda iki kalem duruyor ve ikisi de eşikten bağımsızdır. `k11` hiçbir motor
tarafından işaretlenmiyor; hangi eşik seçilirse seçilsin kaçar. `k24` bütün motorlar tarafından
işaretleniyor; hangi eşik seçilirse seçilsin yanlış pozitif kalır. Bu iki kalem, oy saymanın
düzeltemeyeceği hata tabanıdır ve raporda "itibar sorgusu karara bağlayamadı" satırıyla değil,
başka bir yöntemle ele alınmalıdır.

Eşik seçimi bu yüzden teknik değil, **iş kararıdır**: bir yanlış pozitifin bedeli bir soruşturma
saatiyse eşik aşağı, saha ekibinin geri çağrılmasıysa yukarı çekilir. Aynı tablo iki kurumda iki
farklı satırı seçtirir.

#### Çoğunluk Ne Zaman Bir Şey Ekler

Üçüncü tablonun son satırı bu dersin yapısal bulgusudur: **tek aile içinde çoğunluk kararı, tek
motor seçmekle özdeştir**. Altı imza motorunun ikisinin işaretlemesini istemek, imza ailesinin
beşinci motorunu tek başına dinlemekle aynı sonucu verir — aynı doğru pozitif, aynı yanlış pozitif.
Kod bunu altı eşiğin hepsinde denetliyor ve iki aile için de `evet` yazıyor. Nedeni şudur: iç içe
geçmiş motorlarda oy saymak, duyarlılık ekseninde bir yer seçmekten başka bir şey değildir. Aynı
yönteme bakan on iki motorun oyu, tek bir motorun oyudur.

Karma küme farklı davranıyor ama kazancı koşulludur. Yüzde 92 anmada karma eşik 3, en iyi tek
motordan **daha kötüdür**: aynı 11 doğru pozitife karşılık 9 yanlış pozitif üretir, tek motor 6
üretir. Buna karşılık karma eşik 7, hiçbir tek motorun ulaşamadığı bir kesinliğe çıkar — yüzde 86'ya
karşı en iyi tek motorun yüzde 65'i. Kazanç, iki ailenin **farklı kalemlerde** yanılmasından gelir:
bir aileye kör görünen iki kötü kalem öteki aile tarafından işaretleniyor ve bir ailenin ürettiği
yanlış pozitifler öteki ailede oy bulamıyor.

Buradan çıkan kural şudur: çoklu motor sonucunu okurken sayılacak olan motor sayısı değil, **farklı
yöntem sayısıdır**. On iki işaretin altısı aynı aileden geliyorsa o altı işaret bir işarettir.

#### Gönderilemeyen Kalem

Dördüncü blok bedeli veriyor ve bedelin büyük bölümü teknik değildir. Yirmi dört kalemin yalnız
sekizinin dosyası gönderilebilir. Altı kalem abone verisi taşıdığı için hiçbir koşulda gönderilemez;
bir dosyayı dışarıdaki bir servise yüklemek onu **yayımlamaktır** ve geri alınamaz. Kalan kalemler
için yalnız özet sorgulanabilir, ama özet sorgusu ancak kalem servis tarafında biliniyorsa yanıt
verir. Sonuç: **on kalem hiçbir biçimde sorulamıyor** ve bunların dördü gerçekte kötü.

Bu, önceki derslerdeki kapsam sınırının aynı yapıdaki başka bir biçimidir. Orada kapsam dışı hedefe
istek gönderilemiyordu; burada gizlilik sınıfı dışarı çıkamıyor. İkisi de doğrulanamayan aday
üretir ve ikisi de raporda "yöntem bu kaleme uygulanamadı" satırıyla yazılır.

Savunmadaki iz sütunu bu derste yine sıfırdır: sorgular hedef sistemlere gitmez. İz başka yere
düşer. On dört sorgunun her biri servisin kayıtlarına girer ve o kayıtları izleyebilen biri, hangi
kalemin ne zaman soruşturulduğunu öğrenir. Önceki dersin sonunda ayrılan iki iz türünden ikincisi
burada en somut halini alır: bir kalemin sorgulanması, o kalemi kullanan tarafa incelendiğini
söyleyebilir ve bu bilgi geri alınamaz.

#### Özet

- Çoğunluk eşiği yükseldikçe anma yüzde 92'den 8'e iner; kesinlik tekdüze değildir — yüzde 50'den
  yedinci eşikte yüzde 86'ya çıkar, on ikinci eşikte yine yüzde 50'ye döner. Hiçbir
  eşik ikisini birlikte yükseltmez ve seçim bir iş kararıdır.
- İki kalem eşikten bağımsızdır: biri hiçbir motorun işaretlemediği kötü kalem, öteki bütün
  motorların işaretlediği temiz kalem. Bu ikisi oy saymanın düzeltemediği hata tabanıdır.
- Tek aile içinde çoğunluk kararı tek motor seçmekle özdeştir; iç içe geçmiş motorlarda oy saymak
  duyarlılık ekseninde bir yer seçmekten başka bir şey değildir.
- Karma kümenin kazancı koşulludur: aynı anmada tek motordan daha çok yanlış pozitif üretir, ama
  yüksek eşikte hiçbir tek motorun ulaşamadığı yüzde 86 kesinliğe çıkar. Sayılacak olan motor
  sayısı değil farklı yöntem sayısıdır.
- Yirmi dört kalemin sekizinin dosyası gönderilebilir; altısı abone verisi taşıdığı için hiçbir
  koşulda gönderilemez ve on kalem hiçbir biçimde sorulamaz. Bunların dördü gerçekte kötüdür.
- Hedefte üretilen kayıt sıfırdır; on dört sorgu servisin kayıtlarına düşer ve karşı tarafa
  incelendiğini söyleyebilir.

#### Sonraki Adım

Buraya kadar beş araç sınıfı aynı sınıra çarptı. Trafik alanları çıkarım bıraktı, çözümleyici
şifreli akışta meta veriye düştü, vekil araç kapsam nedeniyle iki adayı bırakmak zorunda kaldı,
sanal alan iki kalemi karara bağlayamadı, itibar servisi on kalemi hiç soramadı. Her seferinde
aynı boşluk kaldı: bir kalemin **gerçekten** açık olduğunu göstermenin son adımı yapılmadı.

Sonraki ders o son adımı ele alan araç sınıfını — **istismar çerçevelerini** — yalnız doğrulama
amacıyla ve sınırlarıyla inceler. Ölçülen üç şey vardır: bir çerçevenin neyi kanıtladığı, neyi
kanıtlamadığı ve hangi durumda hedefe zarar verdiği. Özellikle ikincisi üzerinde durulur, çünkü
başarısız bir doğrulama denemesi açığın **olmadığını** kanıtlamaz ve bu ayrımın kaybolması raporun
en pahalı hatasıdır.

### İstismar Çerçeveleri

Source: https://academia.sh/tr/kurslar/sizma-testi/istismar-cerceveleri

İstismar çerçevesinin yalnız doğrulama sınırıyla ölçülmesi: 16 adayın 9'u gerçekte açıkken 3'ünün kanıta dönüşmesi, dört doğrulama seçeneğinden yalnız birinin olumsuz sonucunun açığın yokluğunu göstermesi, olumsuz dönen üç adayın ikisinin gerçekte açık olması, olumsuz ve zayıf sonuçların kapatma gerekçesi sayılması durumunda üç adayın yanlış kapanması ve iki hedefe kapsam nedeniyle hiç dokunulmaması.

Buraya kadar beş araç sınıfı aynı sınıra çarptı: her seferinde bir kalemin gerçekten açık olduğunu
gösterecek son adım yapılmadan kaldı. **İstismar çerçevesi** o son adımı yapan araç sınıfıdır ve
tam bu nedenle en dar sınırlarla kullanılır.

Bu ders çerçevenin nasıl kullanıldığını anlatmaz; hiçbir araç, modül, adım dizisi, komut ya da yük
yazılmaz. Ölçülen üç şey vardır: bir doğrulama denemesinin **neyi kanıtladığı**, **neyi
kanıtlamadığı** ve hangi durumda hedefe zarar verdiği. Bir çerçeveyi yazılı yetki ve tanımlı kapsam
olmadan bir hedefe yöneltmek, sonuç ne olursa olsun yetkisiz erişimdir ve yasal sonuç doğurur.

#### Dört Seçenek, İki Ayrı Soru

Bir adayı doğrulamanın birden çok yolu vardır ve bunlar iki bağımsız özellikle ayrılır.

Birincisi **kanıt gücüdür**. Pasif belirti eşleşmesi — yapılandırma ve sürüm bilgisinin bilinen bir
tanımla karşılaştırılması — hedefe dokunmaz ve hiçbir zaman kesin kanıt üretmez; yalnız bir adayı
güçlendirir. Yan etkisiz doğrulama, açığın var olması için gereken koşulun sağlanıp sağlanmadığını
belirlenimci biçimde sınar. Durum değiştiren ve kesinti riskli seçenekler kesin kanıt üretir ve
karşılığında hedefte iz ve risk bırakır.

İkincisi ve daha az konuşulanı, **olumsuz sonucun anlamıdır**. Bir koşul sınaması olumsuz döndüğünde
koşulun sağlanmadığı bilinir; bu, açığın yokluğunun kanıtıdır. Bir deneme olumsuz döndüğünde ise
hiçbir şey bilinmez. Deneme, hedefin o andaki durumu, yükü, bir ara katmanın davranışı ya da
zamanlama nedeniyle başarısız olmuş olabilir. **Başarısız bir doğrulama denemesi açığın olmadığını
kanıtlamaz.** Bu ayrımın kaybolması raporun en pahalı hatasıdır.

- **AA36.** Seçenek kataloğu, aday listesi ve barındırma sınıfları **modeldir**; gerçek bir hedef,
  gerçek bir açık kimliği ve gerçek bir araç yok.
- **AA37.** `acik` alanı adayın gerçek durumudur; doğrulamadan önce bilinmez ve yalnız modelin
  sonucu hesaplayabilmesi için yazılmıştır.
- **AA38.** `kosullu` seçeneklerde sonuç hedefin o andaki ortam koşuluna bağlıdır; koşul
  sağlanmazsa deneme açık bir kalemde bile olumsuz döner.
- **AA39.** Barındırma sınıfı seçenek kümesini daraltır. `yonetilen`, üçüncü tarafın işlettiği bir
  hizmettir ve hiçbir deneme kapsam içinde değildir.
- **AA40.** Katılım kuralları en yüksek risk düzeyini belirler; seçim, izin verilenler içinde kanıt
  gücü en yüksek, eşitlikte riski en düşük seçenektir.
- **AA41.** Süre, kayıt ve uyarı sayıları seçenek başına elle yazıldı.

```js
// cerceve/sinir.mjs — istismar cercevesinin DOGRULAMA SINIRI modelidir. Hicbir arac,
// modul, adim dizisi, komut ya da yuk yazilmaz; secenekler yalniz turu, risk duzeyi,
// kanit gucu ve OLUMSUZ SONUCUN ANLAMI ile anilir.
// olumsuz: 'yokluk' = olumsuz sonuc acigin yoklugunu gosterir; 'belirsiz' = hicbir sey gostermez.
// kosullu = sonuc hedefin o andaki ortam kosuluna baglidir; kosul saglanmazsa deneme acik bir
// kalemde bile olumsuz doner. Kosullu bir denemenin olumsuz sonucu HICBIR SEY gostermez.
export const SECENEK = {
  'belirti-eslesmesi':     { risk: 0, kanit: 'zayif', olumsuz: 'belirsiz', kosullu: false, dk: 5,  kayit: 1, uyari: 0 },
  'yan-etkisiz-dogrulama': { risk: 1, kanit: 'kesin', olumsuz: 'yokluk',   kosullu: false, dk: 15, kayit: 2, uyari: 1 },
  'durum-degistiren':      { risk: 2, kanit: 'kesin', olumsuz: 'belirsiz', kosullu: true,  dk: 30, kayit: 4, uyari: 3 },
  'kesinti-riskli':        { risk: 3, kanit: 'kesin', olumsuz: 'belirsiz', kosullu: true,  dk: 45, kayit: 6, uyari: 5 },
};

// Barindirma sinifi: hedefin uzerinde hangi risk duzeyine kadar islem yapilabilir.
// yonetilen = ucuncu tarafin islettigi hizmet; hicbir deneme kapsam icinde degildir.
export const BARINDIRMA = { kendi: 3, paylasilan: 1, yonetilen: -1 };
export const IZIN_RISK = 2;   // katilim kurallarinin izin verdigi en yuksek risk duzeyi

// satir: aday | acik mi | pasif belirti | ortam kosulu saglandi mi | barindirma | secenekler
export const ADAY = `
  c01 acik   evet  evet  kendi      belirti-eslesmesi,yan-etkisiz-dogrulama
  c02 acik   evet  evet  kendi      belirti-eslesmesi,durum-degistiren
  c03 acik   hayir evet  kendi      belirti-eslesmesi,yan-etkisiz-dogrulama
  c04 acik   evet  hayir kendi      belirti-eslesmesi,durum-degistiren
  c05 acik   evet  evet  paylasilan belirti-eslesmesi,durum-degistiren
  c06 acik   hayir hayir kendi      belirti-eslesmesi,durum-degistiren
  c07 acik   evet  evet  yonetilen  belirti-eslesmesi,yan-etkisiz-dogrulama
  c08 acik   evet  evet  kendi      belirti-eslesmesi
  c09 kapali evet  evet  kendi      belirti-eslesmesi,yan-etkisiz-dogrulama
  c10 kapali evet  evet  kendi      belirti-eslesmesi,durum-degistiren
  c11 kapali hayir evet  kendi      belirti-eslesmesi,yan-etkisiz-dogrulama
  c12 kapali evet  evet  kendi      belirti-eslesmesi
  c13 kapali evet  evet  paylasilan belirti-eslesmesi,yan-etkisiz-dogrulama
  c14 kapali hayir evet  kendi      belirti-eslesmesi,kesinti-riskli
  c15 kapali evet  evet  yonetilen  belirti-eslesmesi,durum-degistiren
  c16 acik   hayir evet  kendi      belirti-eslesmesi,kesinti-riskli
`.trim().split('\n').map((r) => {
  const [ad, durum, belirti, kosul, barindirma, sec] = r.trim().split(/\s+/);
  return { ad, acik: durum === 'acik', belirti: belirti === 'evet', kosul: kosul === 'evet',
    barindirma, secenek: sec.split(',') };
});

export const izinli = (a, s) => SECENEK[s].risk <= Math.min(IZIN_RISK, BARINDIRMA[a.barindirma]);

// Secilen secenek: izin verilenler icinde kanit gucu en yuksek, esitlikte riski en dusuk olan.
export function secim(a) {
  const uygun = a.secenek.filter((s) => izinli(a, s));
  if (uygun.length === 0) return null;
  return uygun.sort((x, y) => {
    const g = (s) => (SECENEK[s].kanit === 'kesin' ? 1 : 0);
    return g(y) - g(x) || SECENEK[x].risk - SECENEK[y].risk;
  })[0];
}

// Sonuc: kanit | yokluk-kaniti | belirsiz-olumsuz | guclu-aday | zayif-aday | dogrulanamadi
export function sonuc(a) {
  const s = secim(a);
  if (!s) return { secenek: '-', sonuc: 'dogrulanamadi', dk: 0, kayit: 0, uyari: 0 };
  const o = SECENEK[s];
  let d;
  if (o.kanit === 'kesin') {
    if (a.acik && (a.kosul || !o.kosullu)) d = 'kanit';
    else if (a.acik) d = 'belirsiz-olumsuz';        // acik ama deneme olumsuz dondu
    else d = o.olumsuz === 'yokluk' ? 'yokluk-kaniti' : 'belirsiz-olumsuz';
  } else d = a.belirti ? 'guclu-aday' : 'zayif-aday';
  return { secenek: s, sonuc: d, dk: o.dk, kayit: o.kayit, uyari: o.uyari };
}

export function toplam() {
  const t = { kanit: 0, 'yokluk-kaniti': 0, 'belirsiz-olumsuz': 0, 'guclu-aday': 0,
    'zayif-aday': 0, dogrulanamadi: 0, dk: 0, kayit: 0, uyari: 0, kanitlanamayanAcik: 0 };
  for (const a of ADAY) {
    const r = sonuc(a);
    t[r.sonuc] += 1; t.dk += r.dk; t.kayit += r.kayit; t.uyari += r.uyari;
    if (r.sonuc !== 'kanit' && a.acik) t.kanitlanamayanAcik += 1;
  }
  return t;
}
```

#### On Altı Aday, Altı Sonuç Türü

```js
// cerceve/olc.mjs — on alti aday, cercevenin neyi kanitladigi ve neyi kanitlamadigi.
import { SECENEK, BARINDIRMA, IZIN_RISK, ADAY, secim, sonuc, toplam } from './sinir.mjs';

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

console.log(`${ADAY.length} aday (${ADAY.filter((a) => a.acik).length} gercekte acik), ` +
  `${Object.keys(SECENEK).length} dogrulama secenegi, izin verilen en yuksek risk ${IZIN_RISK}`);

const A = [-24, 6, 6, 7, 7, 9, 11];
console.log('\n1. secenek turleri');
y(A, 'secenek', 'risk', 'dk', 'kayit', 'uyari', 'kosullu', 'olumsuz');
for (const [s, o] of Object.entries(SECENEK))
  y(A, s, o.risk, o.dk, o.kayit, o.uyari, o.kosullu ? 'evet' : 'hayir', o.olumsuz);

const B = [-6, 8, 9, 7, 12, 25, 18];
console.log('\n2. aday basina secilen secenek ve sonuc');
y(B, 'aday', 'gercek', 'belirti', 'kosul', 'barindirma', 'secilen', 'sonuc');
for (const a of ADAY) {
  const r = sonuc(a);
  y(B, a.ad, a.acik ? 'acik' : 'kapali', a.belirti ? 'evet' : 'hayir',
    a.kosul ? 'evet' : 'hayir', a.barindirma, r.secenek, r.sonuc);
}

const t = toplam();
console.log('\n3. cercevenin urettigi karar dagilimi');
for (const k of ['kanit', 'yokluk-kaniti', 'belirsiz-olumsuz', 'guclu-aday', 'zayif-aday',
  'dogrulanamadi']) console.log(`  ${k.padEnd(18)} ${String(t[k]).padStart(3)}`);

console.log('\n4. neyi kanitlamaz');
const belirsizOlumsuz = ADAY.filter((a) => sonuc(a).sonuc === 'belirsiz-olumsuz');
const yanlisKapanirdi = ADAY.filter((a) => ['belirsiz-olumsuz', 'zayif-aday'].includes(sonuc(a).sonuc) && a.acik);
console.log(`  olumsuz sonucun yokluk kaniti sayildigi secenek  ` +
  `${Object.values(SECENEK).filter((o) => o.olumsuz === 'yokluk').length} / ${Object.keys(SECENEK).length}`);
console.log(`  olumsuz cikan ama hicbir sey gostermeyen aday    ${belirsizOlumsuz.length}`);
console.log(`  bunlarin gercekte acik olani                    ` +
  `${belirsizOlumsuz.filter((a) => a.acik).length}`);
console.log(`  olumsuz ve zayif sonuc 'acik degil' okunursa yanlis kapanan aday ` +
  `${yanlisKapanirdi.length}`);
console.log(`  gercekte acik olup kanitlanamayan aday          ${t.kanitlanamayanAcik} / ` +
  `${ADAY.filter((a) => a.acik).length}`);

console.log('\n5. bedel ve iz');
console.log(`  toplam dogrulama suresi     ${t.dk} dk`);
console.log(`  hedefte uretilen kayit      ${t.kayit}`);
console.log(`  hedefte uretilen uyari      ${t.uyari}`);
console.log(`  kapsam disi kaldigi icin hic dokunulmayan hedef ` +
  `${ADAY.filter((a) => a.barindirma === 'yonetilen').length}`);
console.log(`  paylasilan ortamda risk siniri dusurulen hedef  ` +
  `${ADAY.filter((a) => a.barindirma === 'paylasilan').length}`);
```

```
16 aday (9 gercekte acik), 4 dogrulama secenegi, izin verilen en yuksek risk 2

1. secenek turleri
secenek                   risk    dk  kayit  uyari  kosullu    olumsuz
belirti-eslesmesi            0     5      1      0    hayir   belirsiz
yan-etkisiz-dogrulama        1    15      2      1    hayir     yokluk
durum-degistiren             2    30      4      3     evet   belirsiz
kesinti-riskli               3    45      6      5     evet   belirsiz

2. aday basina secilen secenek ve sonuc
aday    gercek  belirti  kosul  barindirma                  secilen             sonuc
c01       acik     evet   evet       kendi    yan-etkisiz-dogrulama             kanit
c02       acik     evet   evet       kendi         durum-degistiren             kanit
c03       acik    hayir   evet       kendi    yan-etkisiz-dogrulama             kanit
c04       acik     evet  hayir       kendi         durum-degistiren  belirsiz-olumsuz
c05       acik     evet   evet  paylasilan        belirti-eslesmesi        guclu-aday
c06       acik    hayir  hayir       kendi         durum-degistiren  belirsiz-olumsuz
c07       acik     evet   evet   yonetilen                        -     dogrulanamadi
c08       acik     evet   evet       kendi        belirti-eslesmesi        guclu-aday
c09     kapali     evet   evet       kendi    yan-etkisiz-dogrulama     yokluk-kaniti
c10     kapali     evet   evet       kendi         durum-degistiren  belirsiz-olumsuz
c11     kapali    hayir   evet       kendi    yan-etkisiz-dogrulama     yokluk-kaniti
c12     kapali     evet   evet       kendi        belirti-eslesmesi        guclu-aday
c13     kapali     evet   evet  paylasilan    yan-etkisiz-dogrulama     yokluk-kaniti
c14     kapali    hayir   evet       kendi        belirti-eslesmesi        zayif-aday
c15     kapali     evet   evet   yonetilen                        -     dogrulanamadi
c16       acik    hayir   evet       kendi        belirti-eslesmesi        zayif-aday

3. cercevenin urettigi karar dagilimi
  kanit                3
  yokluk-kaniti        3
  belirsiz-olumsuz     3
  guclu-aday           3
  zayif-aday           2
  dogrulanamadi        2

4. neyi kanitlamaz
  olumsuz sonucun yokluk kaniti sayildigi secenek  1 / 4
  olumsuz cikan ama hicbir sey gostermeyen aday    3
  bunlarin gercekte acik olani                    2
  olumsuz ve zayif sonuc 'acik degil' okunursa yanlis kapanan aday 3
  gercekte acik olup kanitlanamayan aday          6 / 9

5. bedel ve iz
  toplam dogrulama suresi     220 dk
  hedefte uretilen kayit      31
  hedefte uretilen uyari      17
  kapsam disi kaldigi icin hic dokunulmayan hedef 2
  paylasilan ortamda risk siniri dusurulen hedef  2
```

#### Neyi Kanıtlar

Üçüncü blok altı sonuç türünü sayıyor ve ilk satır beklenenden küçüktür: on altı adayın **üçü**
kanıta dönüşüyor. Dokuz aday gerçekte açıktır; çerçeve bunların üçte birini kanıtlar.

Kanıta dönenlerin ikisi yan etkisiz doğrulamayla, biri durum değiştiren bir denemeyle
belirlenmiştir. Bu dağılım yön verir: kesin kanıt üretmenin en ucuz yolu deneme değil, **koşul
sınamasıdır**. On beş dakika, iki kayıt, bir uyarı karşılığında hem kanıt hem de — açık değilse —
yokluk kanıtı üretir. Durum değiştiren bir deneme aynı kesinliği otuz dakika, dört kayıt ve üç
uyarı karşılığında verir ve olumsuz döndüğünde hiçbir şey söylemez.

İkinci satır, kursta az konuşulan bir ürünü sayıyor: **üç yokluk kanıtı**. Bu üç aday listeden
kesin olarak düşer; düzeltme ekibine gitmez ve bir daha bakılmaz. Önceki derslerde elenen yanlış
pozitiflerle aynı işi görürler, farkı gerekçenin belirlenimci olmasıdır.

#### Neyi Kanıtlamaz

Dördüncü blok bu dersin asıl konusudur. Dört doğrulama seçeneğinden yalnız **biri** olumsuz
sonucunu yokluk kanıtı sayabilir. Kalan üçünde olumsuz sonuç bir bilgi taşımaz.

Üç aday olumsuz döndü ve **ikisi gerçekte açık**. `c04` ile `c06` için gereken ortam koşulu deneme
sırasında sağlanmamıştı; deneme olumsuz döndü, açık yerinde duruyor. Bunlar rapora "açık
bulunamadı" diye girerse iki gerçek açık kapanır. Doğru satır "doğrulama denendi, olumsuz döndü,
sonuç belirsiz" biçimindedir ve düzeltme önceliğinde adaylık statüsünü korur.

Aynı yanılgının ikinci biçimi zayıf sonuçlardadır. `c16` gerçekte açıktır, pasif belirtisi eşleşmez
ve kesin doğrulama seçeneği kesinti riski taşıdığı için kullanılamaz. Sonuç "zayıf aday"dır. Olumsuz
ve zayıf sonuçların tümü "açık değil" diye okunursa **üç aday yanlış kapanır**.

Toplamda dokuz açık adayın **altısı** kanıtlanamıyor. Nedenleri farklıdır ve raporda ayrı ayrı
yazılır: ikisinde deneme koşulu sağlanmadı, ikisinde risk sınırı kesin seçeneği kapattı, birinde
zaten kesin bir seçenek yok, birinde hedef kapsam dışı. Hiçbiri "açık yok" değildir.

#### Zarar Riski ve Kapsam

Beşinci blok bedeli veriyor: 220 dakika, 31 kayıt, 17 uyarı. Uyarı sayısı önceki derslerin
tümünden yüksektir ve nedeni açıktır — kesin kanıt üreten seçeneklerin hepsi hedefe dokunur.

İki hedefe hiç dokunulmadı. Üçüncü tarafın işlettiği bir hizmet üzerinde çalışan iki aday, kapsam
dışı olduğu için hiçbir seçenekle sınanmadı; bunlardan biri gerçekte açıktır ve bulgu olarak
değil, **değerlendirme dışında kalmış risk** olarak raporlanır. Paylaşılan ortamdaki iki hedefte
risk sınırı düşürüldü: aynı ortamdaki başka kiracıları etkileyebilecek her seçenek kapandı;
birinde elde yalnız belirti eşleşmesi kaldı, ötekinde yan etkisiz doğrulama hâlâ izinliydi.

Tabloda görünmeyen bir risk kalemi daha vardır ve kapsam denetiminin neden her denemeden önce
programlı çalıştırıldığını açıklar. Bir denemenin hedefi elle ya da bir listeden gelir; liste eski,
bir kayıt taşınmış ya da bir adres yeniden atanmış olabilir. Yanlış hedefe yöneltilmiş bir deneme,
niyet ne olursa olsun yetkisiz erişimdir ve verilen yetkiyi geçersiz kılar. Hedefin kimliğinin
denemeden hemen önce doğrulanması bu yüzden bir alışkanlık değil, bir denetim adımıdır.

Kesinti riskli seçenek katılım kuralları izin vermediği için hiçbir adayda kullanılmadı. Bu, ölçüm
ağı gibi bir ortamda olağan karardır: bir sayaç toplayıcının hizmet dışı kalması saha ekiplerinin
işini durdurur ve faturalama döngüsünü kaydırır. Kanıtın bedeli, kanıtladığı şeyin değerinden büyük
olduğunda deneme yapılmaz — adayın adaylıkla kalması kabul edilir ve gerekçesi yazılır.

#### Özet

- On altı adayın dokuzu gerçekte açıktır; çerçeve bunların yalnız üçünü kanıtlar. Kesin kanıtın en
  ucuz yolu deneme değil, belirlenimci koşul sınamasıdır.
- Dört doğrulama seçeneğinden yalnız birinin olumsuz sonucu açığın yokluğunu gösterir; kalan üçünde
  olumsuz sonuç hiçbir bilgi taşımaz.
- Olumsuz dönen üç adayın ikisi gerçekte açıktır; olumsuz ve zayıf sonuçlar "açık değil" diye
  okunursa üç aday yanlış kapanır.
- Kanıtlanamayan altı açık adayın gerekçesi ayrı ayrı yazılır: koşul sağlanmadı, risk sınırı
  kapattı, kesin seçenek yok, hedef kapsam dışı. Hiçbiri "açık yok" değildir.
- Üç yokluk kanıtı listeden kesin olarak düşer ve elenen yanlış pozitiflerle aynı işi görür.
- Doğrulama 220 dakika, 31 kayıt ve 17 uyarı üretir; iki hedefe kapsam nedeniyle hiç dokunulmaz,
  ikisinde risk sınırı düşürülür ve kesinti riskli seçenek hiçbir adayda kullanılmaz.

#### Sonraki Adım

Bu derste ölçülen her şey — kaç istek, hangi risk sınıfı, hangi seçenek, ne kadar uyarı — bir
yerde öğrenilmiş olmalıdır. Doğrulama sırasında ilk kez denenen bir adım, hem hedefe hem de
değerlendirmenin kendisine risk yükler. Alıştırmanın yeri gerçek bir kurum ağı değildir.

Sonraki ders yasal alıştırma ortamlarını kapsam cinsinden ele alır ve konuyu kapatır. Ölçülen şey
bu ortamların ne öğrettiği değil, **ne öğretmediğidir**: yedi dersin ürettiği beceri listesi
çıkarılır, her ortamın kapsadığı kalem sayılır ve hiçbir ortamın kapsamadığı kalemler ayrı yazılır.
Gerçek bir değerlendirmeyle laboratuvar arasındaki farkın kaç kalemde durduğu, bu konunun son
sayısıdır.

### Test Dağıtımları ve Laboratuvarlar

Source: https://academia.sh/tr/kurslar/sizma-testi/test-dagitimlari-ve-laboratuvarlar

Yasal alıştırma ortamlarının kapsam cinsinden ölçülmesi: konunun altı dersinden çıkan 18 beceri kaleminin üç laboratuvar türünün birleşiminde 13'ünün kapsanması, hiçbir tek türün 10'u geçmemesi, güvenlik odaklı bir test dağıtımının tek başına sıfır beceri kapsaması ve kapsanmayan beş kalemin gerçek kayıt ile gerçek riskin bulunmamasından kaynaklanması.

Önceki ders doğrulama denemelerini risk sınıfı, kanıt gücü ve olumsuz sonucun anlamıyla ölçtü.
Bütün bu ölçüler bir yerde öğrenilmiş olmalıdır; doğrulama sırasında ilk kez denenen bir adım hem
hedefe hem de değerlendirmenin kendisine risk yükler. Alıştırmanın yeri gerçek bir kurum ağı
değildir. Başkasının sistemine yazılı izin olmadan yöneltilen bir deneme, öğrenme amacıyla yapılmış
olsa da yetkisiz erişimdir ve yasal sonuç doğurur.

Bu ders yasal alıştırma ortamlarını **kapsam** cinsinden ölçer ve sorduğu şey ne öğrettikleri değil,
**ne öğretmedikleridir**. Konunun altı dersinden çıkan beceri kalemleri listelenir, her ortam türünün
kapsadığı kalem sayılır ve hiçbirinin kapsamadığı kalemler ayrı yazılır.

#### Kapsam Bir Küme Farkıdır

Dört ortam türü ele alınır. **Kendi kurduğun yalıtık laboratuvar** kendi donanımın üzerinde kurulan,
dış ağa çıkmayan bir ortamdır: topolojiyi sen kurarsın, dolayısıyla nereden yakalama yapılacağını da
sen seçersin. **Hazır açıklı imaj kümesi** önceden hazırlanmış hedeflerden oluşur; kurulum ucuzdur,
topoloji verilidir. **Senaryo tabanlı alıştırma ortamı** bir sağlayıcının işlettiği, kapsamı ve
kuralları önceden tanımlanmış bir ortamdır; kullanım koşulu bir sözleşmedir ve okunması alıştırmanın
parçasıdır. **Güvenlik odaklı test dağıtımı** bir araç kümesidir; kurulum süresini kısaltır.

Beşinci satır ölçünün referansıdır: **yetkilendirilmiş gerçek değerlendirme**. Tanım gereği bütün
kalemleri kapsar, kurulum istemez ve yazılı sözleşme ile tanımlı kapsam ister.

- **AA42.** Beceri listesi, ortam türleri ve kapsam kümeleri **modeldir**; gerçek bir platform,
  dağıtım ya da sağlayıcı adı yazılmaz.
- **AA43.** Beceri kalemleri bu konunun altı dersinden çıkarıldı; `surec` kaynaklı dört kalem
  hiçbir derste ölçülmedi ve listeye sınır olarak konuldu.
- **AA44.** Bir ortamın bir beceriyi kapsaması, o becerinin orada **sonucuyla birlikte** çalışılabildiği
  anlamına gelir; aracı çalıştırabilmek yeterli değildir.
- **AA45.** Kurulum süreleri ortam türü başına elle yazıldı.
- **AA46.** Laboratuvarların birleşimi üç alıştırma türünü kapsar; gerçek değerlendirme birleşime
  katılmaz, karşılaştırma tarafıdır.
- **AA47.** Laboratuvarda üretilen gerçek kayıt ve taşınan gerçek risk sıfırdır.

```js
// lab/kapsam.mjs — yasal alistirma ortamlarinin KAPSAM modelidir. Hicbir platform,
// dagitim ya da urun adi yazilmaz; ortamlar turuyle anilir.
// Beceri listesi bu konunun alti dersinden cikarildi; 'surec' kaynakli olanlar
// hicbir derste olculmedi ve buraya sinir olarak konuldu.
export const BECERI = `
  b01 yakalama-noktasi-secimi      01
  b02 alan-sinifi-ayirma           01
  b03 cozumleyici-etiketi-dogrulama 02
  b04 meta-veri-cikarim-siniri     02
  b05 dogrulama-plani-kurma        03
  b06 istek-risk-sinifi-atama      03
  b07 kapsam-denetimi-kosturma     03
  b08 sanal-alan-hazirligi         04
  b09 gizlenen-davranis-okuma      04
  b10 cogunluk-esigi-secimi        05
  b11 gizlilik-sinifi-karari       05
  b12 dogrulama-secenegi-secimi    06
  b13 olumsuz-sonuc-yorumu         06
  b14 hedef-kimligi-dogrulama      06
  b15 kapsam-pazarligi             surec
  b16 musteri-iletisimi            surec
  b17 uretim-etkisi-tasima         surec
  b18 bulgu-raporlama              surec
`.trim().split('\n').map((r) => {
  const [ad, is, kaynak] = r.trim().split(/\s+/);
  return { ad, is, kaynak };
});

// Ortam turu: hangi becerileri kapsiyor, kurulum kac saat, yasal kosulu ne.
// 'guvenlik-odakli-test-dagitimi' bir arac kumesidir, bir alistirma ortami degildir:
// kurulum suresini kisaltir, tek basina hicbir beceriyi kapsamaz.
export const ORTAM = {
  'kendi-kurdugun-yalitik-lab': { kurulumSaat: 24, yasal: 'kendi-donanimin',
    kapsar: ['b01', 'b02', 'b03', 'b04', 'b05', 'b06', 'b08', 'b09', 'b12', 'b13'] },
  'hazir-acikli-imaj-kumesi': { kurulumSaat: 3, yasal: 'kendi-donanimin',
    kapsar: ['b03', 'b04', 'b05', 'b06', 'b12', 'b13'] },
  'senaryo-tabanli-alistirma-ortami': { kurulumSaat: 0, yasal: 'saglayici-kullanim-kosulu',
    kapsar: ['b03', 'b04', 'b05', 'b06', 'b07', 'b09', 'b10', 'b12', 'b13', 'b14'] },
  'guvenlik-odakli-test-dagitimi': { kurulumSaat: 1, yasal: 'kendi-donanimin', kapsar: [] },
  'yetkilendirilmis-gercek-degerlendirme': { kurulumSaat: 0, yasal: 'yazili-sozlesme-ve-kapsam',
    kapsar: BECERI.map((b) => b.ad) },
};

export const LABORATUVAR = Object.keys(ORTAM).filter((o) => o !== 'yetkilendirilmis-gercek-degerlendirme');

export function birlesim(ortamlar) {
  const k = new Set();
  for (const o of ortamlar) for (const b of ORTAM[o].kapsar) k.add(b);
  return k;
}

export function dersBasina(kapsanan) {
  const m = new Map();
  for (const b of BECERI) {
    if (!m.has(b.kaynak)) m.set(b.kaynak, { toplam: 0, kapsanan: 0 });
    const s = m.get(b.kaynak);
    s.toplam += 1;
    if (kapsanan.has(b.ad)) s.kapsanan += 1;
  }
  return m;
}
```

#### On Sekiz Beceri, Dört Ortam

```js
// lab/olc.mjs — dort ortam turu ve gercek degerlendirme, on sekiz beceri uzerinde.
import { BECERI, ORTAM, LABORATUVAR, birlesim, dersBasina } from './kapsam.mjs';

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

console.log(`${BECERI.length} beceri kalemi, ${Object.keys(ORTAM).length} ortam turu; ` +
  `beceriler bu konunun alti dersinden ve surecten cikarildi`);

const A = [-38, 10, 11, 28];
console.log('\n1. ortam basina kapsam');
y(A, 'ortam', 'kapsanan', 'kurulum s', 'yasal kosul');
for (const [o, v] of Object.entries(ORTAM))
  y(A, o, `${v.kapsar.length}/${BECERI.length}`, v.kurulumSaat, v.yasal);

const lab = birlesim(LABORATUVAR);
const acik = BECERI.filter((b) => !lab.has(b.ad));

const B = [-10, 9, 11, 12];
console.log('\n2. kaynak ders basina kapsam (uc laboratuvar turunun birlesimi)');
y(B, 'kaynak', 'beceri', 'kapsanan', 'kapsanmaz');
for (const [k, s] of dersBasina(lab)) y(B, k, s.toplam, s.kapsanan, s.toplam - s.kapsanan);

const C = [-8, -32, 8, 15];
console.log('\n3. hicbir laboratuvarda kapsanmayan beceri');
y(C, 'kalem', 'beceri', 'kaynak', 'nerede var');
for (const b of acik) y(C, b.ad, b.is, b.kaynak, 'yalniz gercek');

console.log('\n4. laboratuvar ile gercek degerlendirme farki');
console.log(`  uc laboratuvar turunun birlesimi   ${lab.size} / ${BECERI.length}`);
console.log(`  fark                               ${acik.length} kalem`);
console.log(`  en genis tek laboratuvar turu      ` +
  `${Math.max(...LABORATUVAR.map((o) => ORTAM[o].kapsar.length))} / ${BECERI.length}`);
console.log(`  test dagitiminin tek basina kapsami ${ORTAM['guvenlik-odakli-test-dagitimi'].kapsar.length}`);
console.log(`  toplam kurulum suresi (dort ortam)  ` +
  `${LABORATUVAR.reduce((t, o) => t + ORTAM[o].kurulumSaat, 0)} saat`);

console.log('\n5. iz ve sonuc');
console.log(`  laboratuvarda uretilen gercek kayit   0`);
console.log(`  laboratuvarda tasinan gercek risk     0`);
console.log(`  gercek degerlendirmede yetki kosulu   ` +
  `${ORTAM['yetkilendirilmis-gercek-degerlendirme'].yasal}`);
console.log(`  kapsanmayan ${acik.length} kalemin kaynagi: ` +
  `${[...new Set(acik.map((b) => b.kaynak))].join(', ')}`);
```

```
18 beceri kalemi, 5 ortam turu; beceriler bu konunun alti dersinden ve surecten cikarildi

1. ortam basina kapsam
ortam                                   kapsanan  kurulum s                 yasal kosul
kendi-kurdugun-yalitik-lab                 10/18         24             kendi-donanimin
hazir-acikli-imaj-kumesi                    6/18          3             kendi-donanimin
senaryo-tabanli-alistirma-ortami           10/18          0   saglayici-kullanim-kosulu
guvenlik-odakli-test-dagitimi               0/18          1             kendi-donanimin
yetkilendirilmis-gercek-degerlendirme      18/18          0   yazili-sozlesme-ve-kapsam

2. kaynak ders basina kapsam (uc laboratuvar turunun birlesimi)
kaynak       beceri   kapsanan   kapsanmaz
01                2          2           0
02                2          2           0
03                3          3           0
04                2          2           0
05                2          1           1
06                3          3           0
surec             4          0           4

3. hicbir laboratuvarda kapsanmayan beceri
kalem   beceri                            kaynak     nerede var
b11     gizlilik-sinifi-karari                05  yalniz gercek
b15     kapsam-pazarligi                   surec  yalniz gercek
b16     musteri-iletisimi                  surec  yalniz gercek
b17     uretim-etkisi-tasima               surec  yalniz gercek
b18     bulgu-raporlama                    surec  yalniz gercek

4. laboratuvar ile gercek degerlendirme farki
  uc laboratuvar turunun birlesimi   13 / 18
  fark                               5 kalem
  en genis tek laboratuvar turu      10 / 18
  test dagitiminin tek basina kapsami 0
  toplam kurulum suresi (dort ortam)  28 saat

5. iz ve sonuc
  laboratuvarda uretilen gercek kayit   0
  laboratuvarda tasinan gercek risk     0
  gercek degerlendirmede yetki kosulu   yazili-sozlesme-ve-kapsam
  kapsanmayan 5 kalemin kaynagi: 05, surec
```

#### Dağıtım Bir Ortam Değildir

Birinci tablonun en açık satırı dördüncüsüdür: güvenlik odaklı bir test dağıtımı on sekiz beceri
kaleminin **sıfırını** kapsar. Bu bir eksiklik değil, bir tanım sorunudur. Dağıtım bir araç
kümesidir; araçları kurmanın süresini bir saate indirir ve orada durur. Araçları kurmuş olmak bir
beceri değildir; beceri, aracın ürettiği adayı kanıttan ayırabilmektir ve bunun için bir hedef, bir
kapsam ve bir sonuç gerekir.

Kalan üç satır kurulum ile kapsam arasında beklenmedik bir ilişki gösteriyor. Yirmi dört saatlik
kurulum isteyen kendi laboratuvarın 10 kalem kapsıyor; sıfır kurulum isteyen senaryo tabanlı ortam
da 10 kalem kapsıyor. Ama kapsadıkları kalemler aynı değildir. Kendi laboratuvarında topolojiyi sen
kurduğun için **yakalama noktası seçimi** ve **alan sınıfı ayırma** çalışılabilir; hazır bir
senaryoda topoloji verilidir ve o iki kalem düşer. Buna karşılık senaryo bir kapsam tanımı taşıdığı
için **kapsam denetimi koşturma**, **hedef kimliği doğrulama** ve **çoğunluk eşiği seçimi**
çalışılabilir; kendi laboratuvarında kapsam kavramı yoktur, çünkü her şey senindir.

İkisi birlikte kullanıldığında birleşim 13 kaleme çıkıyor. Hazır açıklı imaj kümesi birleşime yeni
bir kalem eklemiyor; katkısı kapsam değil, üç saatlik kurulumla tekrar sayısını artırmaktır. Yirmi
sekiz saatlik toplam kurulum üç laboratuvar türü ile test dağıtımının birlikte bedelidir ve tek
seferliktir.

Kapsam sayısının bir beceriyi ölçmediğini burada söylemek gerekir. Tablo bir kalemin
çalışılabildiğini söyler, ne kadar iyi çalışıldığını söylemez. Doğrulama planı kurmak üç ortamda da
kapsanan bir kalemdir; bir plan kurmuş olmakla yirmi plan kurup hangilerinin kısaldığını görmüş
olmak aynı şey değildir. Hazır imaj kümesinin katkısı tam olarak buradadır: kapsam sütununa hiçbir
şey eklemez, tekrar sayısını ucuzlatır. Kapsam bir ön koşuldur, yeterlilik değildir.

İkinci tablo becerileri kaynak derse göre topluyor ve teknik tarafın neredeyse tamamının
laboratuvarda çalışılabildiğini gösteriyor: altı dersin beşinde kapsanmayan kalem yoktur. Tek
istisna beşinci derstir ve orada da kapsanmayan kalem teknik değildir. Bu dağılım, laboratuvarın
sınırının araç yeteneğiyle ilgili olmadığını doğruluyor.

#### Laboratuvarın Öğretemediği Beş Kalem

Üçüncü tablo bu dersin sonucudur. Beş kalem hiçbir laboratuvarda kapsanmıyor ve dördü doğrudan
süreç kaynaklıdır: kapsam pazarlığı, müşteri iletişimi, üretim etkisi taşıma, bulgu raporlama.
Beşincisi teknik bir dersten gelir ve tam da bu yüzden dikkat çeker: **gizlilik sınıfı kararı**.

Bir laboratuvarda abone verisi yoktur. Bir dosyayı dışarıya göndermemeye karar vermek orada bedelsiz
bir tercihtir; kararı zorlaştıran şey, gönderirsen ne olacağıdır ve laboratuvarda hiçbir şey olmaz.
Aynı yapı öteki dört kalemde de görülür. Kapsam pazarlığı, karşı tarafta bir kurum olduğunda
anlamlıdır. Üretim etkisi taşımak, gerçekten duran bir hizmet olduğunda öğrenilir. Bulgu raporlamak,
raporu okuyan birinin bütçesi kaydığında öğrenilir.

Beşinci blok bunu tek satırda veriyor: laboratuvarda üretilen gerçek kayıt sıfır, taşınan gerçek
risk sıfır. **Laboratuvarın öğretemediği şey, laboratuvar olmasının nedenidir.** Sıfır risk
alıştırmayı yasal ve tekrarlanabilir yapar; aynı sıfır, sonucu olan kararları listenin dışında
bırakır.

Buradan çıkan pratik sonuç, ortam seçimiyle ilgili değildir. Üç laboratuvar türünün hepsi
kullanılsa bile beş kalem açık kalır ve bu kalemler bir sonraki ortamdan değil, bir **süreçten**
gelir. Yetkilendirilmiş gerçek değerlendirme satırının kapsamı 18'dir, ama koşulu yazılı sözleşme
ve tanımlı kapsamdır; o koşul olmadan aynı işi yapmak alıştırma değil, suçtur.

#### Laboratuvarın Tek Başına Verdiği Şey

Fark listesi tek yönlü okunmamalıdır. Laboratuvarın gerçek değerlendirmede bulunmayan bir üstünlüğü
vardır ve bu konunun ölçü ekseniyle doğrudan ilgilidir: laboratuvarda **gerçek durum bilinir**.

Bu konunun bütün modellerinde bir `gercek` alanı vardı — kalemin açık olup olmadığı, kötü olup
olmadığı. Model o alanı yalnız sonucu hesaplayabilmek için taşıyordu; gerçek bir değerlendirmede
öyle bir alan yoktur. Bir aday kanıtlanmadığında, açığın var olup da gösterilemediği mi yoksa hiç
var olmadığı mı bilinemez. Laboratuvarda hedefin durumu önceden bilinir; dolayısıyla kendi yanlış
pozitif ve yanlış negatif oranını **ölçmek** mümkündür.

Bu, ölçülebilir tek alıştırma biçimidir. On hedefin kaçında doğru karar verildiği, kaç adayın
gereksiz doğrulandığı, hangi adımın kaç kez atlandığı laboratuvarda sayılabilir; gerçek bir
değerlendirmede ancak yıllar sonra, bir olay geriye doğru okunduğunda anlaşılır. Kapsam tablosunun
13 kalemlik bölümü bu yüzden "daha az" değil, "ölçülebilir" biçimde çalışılan bölümdür.

Buradan bir kullanım kuralı çıkar. Laboratuvarın işi bir tekniği görmek değil, o teknikte kendi
hata oranını öğrenmektir. Aynı hedef kümesinde iki kez çalışıp ikisinde de aynı kararı vermek bir
şey öğretmez; hedef kümesini değiştirip karar dağılımını karşılaştırmak öğretir.

#### Yasal Sınır ve Kullanım Koşulu

Üç laboratuvar türünün yasal koşulu aynı değildir. Kendi donanımında kurduğun bir ortamda sınır
kendi donanımının sınırıdır; dışarı çıkan tek bir bağlantı bile bu sınırı aşar ve yalıtımın
kurulmasının nedeni budur. Senaryo tabanlı bir ortamda sınırı sağlayıcının kullanım koşulu çizer:
hangi hedeflere dokunulabileceği, hangi tekniklerin yasak olduğu ve bulunan bir açığın nasıl
bildirileceği orada yazılıdır. O metni okumak, alıştırmanın kendisinin bir parçasıdır — çünkü
gerçek bir değerlendirmede karşılığı katılım kurallarıdır ve okunmaması aynı sonucu doğurur.

Kendi kurduğun laboratuvarda yalıtımın kurulmaması yalnız bir yasal sorun değildir; ölçümü de
bozar. Dördüncü derste bir ortam ipucunun hiçbir yapılandırmada gizlenemediği görülmüştü, çünkü
gizlemek incelenen kalemin gerçek bir hedefe ulaşmasını gerektiriyordu. Alıştırma ortamında aynı
sınır aynı biçimde durur: bir kalemin dışarıya çıkmasına izin vermek, hem yalıtımı hem de yasal
zemini aynı anda kaldırır. Laboratuvarın dış bağlantısının denetimli olması, alıştırmanın kendisinin
bir parçasıdır ve gerçek bir değerlendirmede kapsam belgesinin karşılığıdır.

Bu, konunun yedi dersini tek bir çizgide toplar. Araçlar aday üretti, doğrulama adımları o adayların
bir bölümünü kanıta çevirdi, her adım savunmada bir iz bıraktı ve her aşamada bir kapsam sınırı
kaç kalemi listenin dışında tuttuğunu yazdı. Kapsam sınırı yedi derste de aynı biçimde davrandı:
bir aracın yeteneğini değil, o yeteneği kullanma **iznini** ölçtü.

#### Özet

- On sekiz beceri kaleminin üç laboratuvar türünün birleşiminde 13'ü kapsanır; hiçbir tek tür 10'u
  geçmez ve fark beş kalemdir.
- Güvenlik odaklı bir test dağıtımı tek başına sıfır beceri kapsar: bir araç kümesi kurulum
  süresini kısaltır, alıştırma ortamı yerine geçmez.
- Kendi kurduğun laboratuvar ile senaryo tabanlı ortam aynı sayıda kalem kapsar ama farklı
  kalemleri: birincisi topolojiyi, ikincisi kapsam tanımını verir.
- Kapsanmayan beş kalemin dördü süreçten, biri gizlilik kararından gelir; hepsinin ortak yanı
  sonucu olan bir karar gerektirmesidir.
- Laboratuvarda gerçek kayıt ve gerçek risk sıfırdır; bu sıfır alıştırmayı yasal ve tekrarlanabilir
  yapar ve aynı sıfır beş kalemi listenin dışında bırakır.
- Yasal sınır ortam türüne göre değişir: kendi donanımının sınırı ya da sağlayıcının kullanım
  koşulu. Kullanım koşulunu okumak, gerçek değerlendirmedeki katılım kurallarının karşılığıdır.

#### Sonraki Adım

Bu konu yedi araç sınıfının ne ürettiğini ve neyi kanıtlayamadığını saydı. Paket yakalama iddiaları
üç sınıfa ayırdı, protokol çözümleyici şifreli akışta meta veriye düştü, vekil araç doğrulamayı
istek sayısı ve risk sınıfı cinsinden ölçtü, sanal alan gizlenen davranışı saydı, itibar servisi
çoğunluk kararının sınırını gösterdi, istismar çerçevesi neyi kanıtlamadığını yazdı ve bu ders
bütün bunların nerede öğrenilebileceğini kapsam cinsinden ölçtü.

Her derste aynı sütun eksik kaldı. Kapsam sınırı defalarca devreye girdi — kapsam dışı hedefe giden
istek sıfır tutuldu, iki akış çözümlenmeden bırakıldı, on kalem hiç sorulmadı, iki hedefe hiç
dokunulmadı — ama o sınırı **kimin, hangi yetkiyle ve hangi belgeyle** çizdiği hiç yazılmadı.
Ölçülen her izin, her uyarının ve her kanıtın hangi biçimde raporlanacağı da yazılmadı.

Sonraki konu **Test Süreci** bu boşluğu doldurur: katılım kurallarının ölçülebilir kalemlere
çevrilmesi, kara, gri ve beyaz kutu değerlendirmelerinin farkı, yanlış pozitifin elenmesi, bulgunun
iş etkisiyle ifade edilmesi, yeniden üretim adımlarının yazımı ve sorumlu açıklamanın süresi.

## Test Süreci

Yetkilendirilmiş bir değerlendirmenin süreci: kapsam tanımının programlı denetime çevrilmesi ve kapsam dışı kalemin yakalanması, kara, gri ve beyaz kutu değerlendirmelerinin ürettiği aday farkı, aday listesinin doğrulama kurallarından geçirilip yanlış pozitifin elenmesi, aynı bulgunun iki iş bağlamında puanlanması, raporun yeniden üretilebilirlik cinsinden ölçülmesi ve sorumlu açıklamanın süre ile adım olarak hesaplanması.

### Katılım Kuralları

Source: https://academia.sh/tr/kurslar/sizma-testi/katilim-kurallari

64 kalemlik kurgu bir envanterde yazılı kapsam tanımı programlı denetime çevriliyor: 20 kalem kapsamda, 11 kalem sınırda, 33 kalem dışında çıkıyor. Beş paylaşılan ön yüz üzerinden 29 kapsam dışı ve sınırdaki kaleme yanlışlıkla dokunulabiliyor; bunların 11'i katılım kurallarında adıyla yasaklanmış. Kaba pencere planlanan işi 4 saat aşarken sayaç okuma aralığı düşünce 6 saat eksik kalıyor, dört eşiğin ikisinde nöbet karşılığı yok ve bunların birinde gerçekleşen bildirim süresi sözleşmede yazanın bir buçuk katına çıkıyor.

Bir önceki konu araçların ne ürettiğini ve neyi kanıtlayamadığını gösterdi: paket kümesinden
çıkarılan akış, vekil aracın değiştirdiği istek, sanal alanın gözleyebildiği davranış, itibar
servislerinin çoğunluk kararı. Hepsi aynı sessiz varsayımı taşıyordu — o araçların çalıştırıldığı
hedef üzerinde çalıştırma hakkı vardı. Bu hakkın nereden geldiği, nerede bittiği ve bittiği yeri
kimin ölçtüğü hiç yazılmadı.

**Katılım kuralları** (rules of engagement) o hakkın yazılı biçimidir: neye dokunulabileceğini,
ne zaman dokunulabileceğini ve bir şey ters gittiğinde kimin ne kadar sürede haber alacağını
belirler. Yazılı bir cümle ise bir denetim değildir. "Abone portalı kapsamdadır, şube ağı kapsam
dışıdır" cümlesi elde bir hedef listesi varken tek tek karara dönüşmek zorundadır ve bu ders o
dönüşümü koşturur. **Kapsam dışı bir hedefe dokunmak yetkiyi geçersiz kılar: o andan sonra yapılan
işlem yazılı izne değil izinsiz erişime dönüşür, hem yasal sonuç doğurur hem de değerlendirmenin
tamamını kullanılamaz kılar.**

- **TS1.** Bölgesel ölçüm ağı envanteri 64 kalemdir; dört birime, üç ortama ve sekiz ön yüze
  dağılır. Envanter de kapsam tanımı da **kurgudur**, gerçek hedef yoktur.
- **TS2.** Kapsam tanımı üç izin ölçütü (ağ bloku, birim, ortam) ve iki dışlama ölçütünden
  oluşur; toplam altı izin, üç dışlama kalemi.
- **TS3.** Denetim üç karar üretir: **kapsamda**, **sınırda**, **dışında**. Sınırda demek,
  ölçütlerin yalnız bir bölümünün tuttuğu ya da kalemin hem izin hem dışlama kuralına girdiği
  anlamına gelir; bu kalemler ayrı ve yazılı onay olmadan dokunulamaz.
- **TS4.** **Ön yüz**, birden çok kalemi aynı noktadan yayımlayan ortak giriştir. Bir ön yüze
  gönderilen istek, o ön yüzün arkasındaki her kaleme ulaşabilir.
- **TS5.** Test penceresi beş gece, gecede sekiz saat, iki kişidir. Gecenin bir saati sayaç okuma
  aralığıdır ve o aralıkta hiçbir kaleme dokunulmaz.
- **TS6.** İletişim protokolü dört eşik tanımlar; örnek olay gecenin 02:30'unda oluşur, mesai
  09:00'da başlar. Bütün süreler kurgudur.

#### Kapsam Tanımı Bir Denetim Olarak

```js
// kapsam.mjs — kapsam tanimini programli denetime ceviren model.
// MODELDIR; envanter de kapsam da kurgudur, gercek hedef yoktur.
export const TOHUM = 20260806;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Her kalem bir birime, bir ortama, bir ic ag blokuna ve bir on yuze baglidir.
const BIRIM = ["abone-portali", "saha-uygulamasi", "sube-agi", "sayac-toplayici"];
const ORTAM = ["uretim", "hazirlik", "gelistirme"];
const HAVUZ = {                                     // hangi birim hangi on yuzu kullaniyor
  "abone-portali": ["onyuz-a1", "onyuz-a2", "onyuz-ortak-1"],
  "saha-uygulamasi": ["onyuz-s1", "onyuz-ortak-1", "onyuz-ortak-2"],
  "sube-agi": ["onyuz-b1", "onyuz-ortak-2"],
  "sayac-toplayici": ["onyuz-t1", "onyuz-t2", "onyuz-ortak-2"],
};
export const HEDEF = Array.from({ length: 64 }, (_, i) => {
  const birim = BIRIM[Math.floor(r() * 4)], havuz = HAVUZ[birim];
  return { ad: `${birim}-${String(i + 1).padStart(2, "0")}`, birim,
    ortam: ORTAM[Math.floor(r() * 3)],
    blok: `10.${20 + Math.floor(r() * 4)}.${Math.floor(r() * 6)}.0/24`,
    onyuz: havuz[Math.floor(r() * havuz.length)] };
});

// Katilim kurallarinda yazan kapsam tanimi: uc izin olcutu, iki dislama olcutu.
export const KAPSAM = {
  izinliBlok: ["10.20.", "10.21."],
  izinliBirim: ["abone-portali", "saha-uygulamasi"],
  izinliOrtam: ["uretim", "hazirlik"],
  dislananAd: ["sayac-toplayici", "sube-agi"],
  dislananOrtam: ["gelistirme"],
};

// Denetim: uc olcute ayri ayri bakilir. Hepsi tutarsa kapsamda, hicbiri tutmazsa
// disinda, bir bolumu tutarsa ya da dislama ile cakisirsa SINIRDA.
export function kararVer(h, k = KAPSAM) {
  const olcut = [k.izinliBlok.some((b) => h.blok.startsWith(b)),
    k.izinliBirim.includes(h.birim), k.izinliOrtam.includes(h.ortam)];
  const dislandi = k.dislananAd.some((a) => h.ad.startsWith(a)) ||
    k.dislananOrtam.includes(h.ortam);
  const tutan = olcut.filter(Boolean).length;
  if (dislandi) return tutan === 3 ? "sinirda" : "disinda";
  return tutan === 3 ? "kapsamda" : tutan === 0 ? "disinda" : "sinirda";
}
export const KARAR = new Map(HEDEF.map((h) => [h.ad, kararVer(h)]));

// Paylasilan on yuz: kapsam ici bir kalemle ayni on yuzu kullanan kapsam disi
// kalem varsa, o on yuze gonderilen istek ona da ulasir.
export function paylasilanRisk() {
  const onyuzler = new Map();
  for (const h of HEDEF) onyuzler.set(h.onyuz, [...(onyuzler.get(h.onyuz) ?? []), h]);
  const riskli = [];
  for (const [ad, liste] of onyuzler) {
    const d = (k) => liste.filter((h) => KARAR.get(h.ad) === k).length;
    const yasak = liste.filter((h) => KAPSAM.dislananAd.some((a) => h.ad.startsWith(a))).length;
    if (d("kapsamda") && liste.length > d("kapsamda")) {
      riskli.push({ onyuz: ad, ici: d("kapsamda"), disi: d("disinda"),
        sinirda: d("sinirda"), yasak });
    }
  }
  return riskli.sort((a, b) => b.disi - a.disi || a.onyuz.localeCompare(b.onyuz));
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([18, 10, 10, 10, 12]);
  const say = (d) => HEDEF.filter((h) => KARAR.get(h.ad) === d).length;
  console.log(`model (tohum ${TOHUM}): ${HEDEF.length} hedef, ${BIRIM.length} birim, ` +
    `${new Set(HEDEF.map((h) => h.onyuz)).size} on yuz`);
  console.log("\n" + yz(["birim", "kapsamda", "sinirda", "disinda", "toplam"]));
  for (const b of BIRIM) {
    const l = HEDEF.filter((h) => h.birim === b);
    const c = (d) => l.filter((h) => KARAR.get(h.ad) === d).length;
    console.log(yz([b, c("kapsamda"), c("sinirda"), c("disinda"), l.length]));
  }
  console.log(yz(["TOPLAM", say("kapsamda"), say("sinirda"), say("disinda"), HEDEF.length]));

  const riskli = paylasilanRisk(), yz2 = gen([15, 12, 12, 11, 13]);
  console.log("\n" + yz2(["on yuz", "kapsam ici", "kapsam disi", "sinirda", "adiyla yasak"]));
  for (const x of riskli) console.log(yz2([x.onyuz, x.ici, x.disi, x.sinirda, x.yasak]));
  const t = (alan) => riskli.reduce((a, x) => a + x[alan], 0);
  console.log(`\npaylasilan on yuz ${riskli.length}; bu on yuzlere gonderilen istek ` +
    `${t("disi") + t("sinirda")} kapsam disi ve sinirdaki kaleme de ulasabilir, ` +
    `${t("yasak")}'i katilim kurallarinda adiyla yasaklanmis`);
}
```

```
model (tohum 20260806): 64 hedef, 4 birim, 8 on yuz

birim               kapsamda   sinirda   disinda      toplam
abone-portali             11         5         1          17
saha-uygulamasi            9         6         6          21
sube-agi                   0         0         9           9
sayac-toplayici            0         0        17          17
TOPLAM                    20        11        33          64

on yuz           kapsam ici kapsam disi    sinirda adiyla yasak
onyuz-ortak-2             1          14          2           11
onyuz-ortak-1             7           3          5            0
onyuz-a1                  3           1          0            0
onyuz-a2                  5           0          3            0
onyuz-s1                  4           0          1            0

paylasilan on yuz 5; bu on yuzlere gonderilen istek 29 kapsam disi ve sinirdaki kaleme de ulasabilir, 11'i katilim kurallarinda adiyla yasaklanmis
```

Üstteki tablo, iki cümlelik bir kapsam tanımının 64 kalem üzerinde neye karşılık geldiğini yazıyor.
Yazılı metin iki birimi içeri, iki birimi dışarı alıyor; sayı ise üç sütuna dağılıyor. **20 kalem
kapsamda, 33 kalem dışında, 11 kalem sınırda.** Sınırdaki 11 kalemin tamamı izinli birimlerden
geliyor: birim ölçütü tutuyor ama ağ bloku ya da ortam ölçütü tutmuyor. Yazılı tanım bu kalemler
için bir karar üretmez, çünkü tanımı yazan kişi bir birimin üç ayrı blokta ve üç ayrı ortamda
kalemi olabileceğini hesaba katmamıştır. Ölçüm bu boşluğu ada indirger: kapsamın belirsiz olduğu
kalem sayısı, kapsamda olduğu kalemin yarısından biraz fazladır.

Üçüncü kararın ayrı bir sütun olması bir ayrıntı değil, denetimin taşıdığı asıl bilgidir. Sınırdaki
kalem "kapsamda" sayılırsa yetki sınırı aşılır; "dışında" sayılırsa değerlendirme kendi kapsamını
gereğinden dar tutar ve gerçekten test edilmesi gereken kalemler hiç görülmez. İki yanlıştan
birincisi yasal sonuç doğurur, ikincisi kurumun parasını boşa harcar. Doğru işlem üçüncü bir
kararla kalemi işaretlemek ve kararı yazan tarafa geri göndermektir. Bir kapsam denetiminin
değeri de burada ölçülür: kaç kalemi otomatik onayladığı değil, **kaç kalemi insana geri
gönderdiği**.

Alttaki tablo daha sert bir sonuç veriyor. Sekiz ön yüzün beşi kapsam içi ve kapsam dışı kalemi
aynı noktada topluyor. En ağırı `onyuz-ortak-2`: arkasında **tek** bir kapsam içi kalem var, buna
karşılık 14 kapsam dışı ve 2 sınırdaki kalem duruyor ve 14'ün 11'i katılım kurallarında birim
adıyla yasaklanmış kalemlerdir. O tek kalem için o ön yüze gönderilen istek, adıyla yasaklanmış 11
kaleme de ulaşır. Toplamda beş ön yüz üzerinden **29 kalem** yanlışlıkla dokunulabilir durumdadır.

Bu, kapsam tanımının bir kalem listesi olarak yazılmasının neden yetmediğini gösterir. Kapsam
kalemle değil, **erişim noktasıyla** kesişir; bir noktanın arkasında kaç kalem olduğu envanterin
değil, altyapının kararıdır. Buradaki doğru işlem `onyuz-ortak-2` arkasındaki tek kalemi
değerlendirme dışına çıkarmaktır: bir kalemin getirisi, 11 yasak kaleme dokunma riskinin yanında
ölçülemeyecek kadar küçüktür. Sınırdaki 11 kalem ise ayrı bir yazılı onaya bağlanır ve onay
gelmeden hiçbir adım koşturulmaz.

#### Zaman Penceresi ve İletişim Protokolü

```js
// pencere.mjs — zaman penceresi ve iletisim protokolu kalem olarak sayilir.
import { HEDEF, KARAR } from "./kapsam.mjs";

const kapsamda = HEDEF.filter((h) => KARAR.get(h.ad) === "kapsamda").length;
const ADIM = [["kesif", 0.4], ["tarama", 1.1], ["dogrulama", 2.3]];   // saat/kalem, kurgu
const GECE = 5, SAAT = 8, KISI = 2, YASAK = 1;      // gecenin bir saati sayac okuma araligi

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const y1 = gen([12, 10, 12, 14]);
const planlanan = ADIM.reduce((a, [, s]) => a + s * kapsamda, 0);
const kaba = GECE * SAAT * KISI, net = GECE * (SAAT - YASAK) * KISI;

console.log(`${kapsamda} kapsam ici kalem, ${ADIM.length} adim sinifi`);
console.log(y1(["adim", "kalem", "sure/kalem", "toplam saat"]));
for (const [ad, s] of ADIM) {
  console.log(y1([ad, kapsamda, s.toFixed(1), (s * kapsamda).toFixed(1)]));
}
console.log(y1(["PLANLANAN", "", "", planlanan.toFixed(1)]));
console.log(`pencere: ${GECE} gece x ${SAAT} saat x ${KISI} kisi = ${kaba} kisi-saat; ` +
  `sayac okuma araligi (${YASAK} saat/gece) dusunce ${net} kisi-saat`);
console.log(`kaba pencere planlanani ${(kaba - planlanan).toFixed(1)} saat asiyor, ` +
  `net pencere ${(planlanan - net).toFixed(1)} saat eksik kaliyor`);

// Iletisim protokolu: her esik icin sozlesme suresi, nobet karsiligi ve taraflar.
const ESIK = [
  ["kritik bulgu", 1, true, ["test ekibi", "kurum guvenlik"], false],
  ["hizmet kesintisi", 0.25, true, ["test ekibi", "kurum guvenlik", "sistem sahibi"], true],
  ["kapsam disina tasma", 4, false, ["test ekibi", "kurum guvenlik", "sistem sahibi",
    "hukuk"], true],
  ["ucuncu taraf verisi", 24, false, ["test ekibi", "kurum guvenlik", "hukuk",
    "veri sahibi", "duzenleyici"], true],
];
const OLAY = 2.5, MESAI = 9;                        // olay saati ve mesai baslangici
const y2 = gen([22, 10, 8, 12, 9, 9]);
console.log("\n" + y2(["esik", "sozlesme", "nobet", "gerceklesen", "taraf", "durdur"]));
let sozToplam = 0, gercekToplam = 0;
for (const [ad, soz, nobet, taraf, durdur] of ESIK) {
  const gercek = nobet ? soz : Math.max(soz, MESAI - OLAY);
  sozToplam += soz; gercekToplam += gercek;
  console.log(y2([ad, `${soz} sa`, nobet ? "var" : "yok", `${gercek.toFixed(2)} sa`,
    taraf.length, durdur ? "evet" : "hayir"]));
}
const taraflar = new Set(ESIK.flatMap(([, , , t]) => t));
console.log(`\n${ESIK.length} esik, ${taraflar.size} ayri taraf, ` +
  `${ESIK.filter((e) => e[4]).length} esikte test durdurulur`);
console.log(`gecenin ${OLAY.toFixed(2)}'unda olusan olayda sozlesme toplam ` +
  `${sozToplam.toFixed(2)} saat vaat ediyor, gerceklesen ${gercekToplam.toFixed(2)} saat`);
```

```
20 kapsam ici kalem, 3 adim sinifi
adim             kalem  sure/kalem   toplam saat
kesif               20         0.4           8.0
tarama              20         1.1          22.0
dogrulama           20         2.3          46.0
PLANLANAN                                   76.0
pencere: 5 gece x 8 saat x 2 kisi = 80 kisi-saat; sayac okuma araligi (1 saat/gece) dusunce 70 kisi-saat
kaba pencere planlanani 4.0 saat asiyor, net pencere 6.0 saat eksik kaliyor

esik                    sozlesme   nobet gerceklesen    taraf   durdur
kritik bulgu                1 sa     var     1.00 sa        2    hayir
hizmet kesintisi         0.25 sa     var     0.25 sa        3     evet
kapsam disina tasma         4 sa     yok     6.50 sa        4     evet
ucuncu taraf verisi        24 sa     yok    24.00 sa        5     evet

4 esik, 6 ayri taraf, 3 esikte test durdurulur
gecenin 2.50'unda olusan olayda sozlesme toplam 29.25 saat vaat ediyor, gerceklesen 31.75 saat
```

Zaman penceresi kâğıt üzerinde yeterlidir ve gerçekte değildir. Beş gece, iki kişi ve gecede sekiz
saat 80 kişi-saat verir; planlanan iş 76 saattir, yani pencere işi dört saat aşar. Sayaç okuma
aralığı düşüldüğünde kullanılabilir süre 70 saate iner ve aynı plan **altı saat eksik** kalır.
Aradaki fark bir yönetim kararı değil, aritmetiktir: dokunulmaz aralık pencerenin sekizde biridir
ve planın payı da o oranda düşer. Süreyi kurtarmanın tek yolu adım sayısını azaltmaktır ve
doğrulama 46 saatle en pahalı sınıf olduğu için kesinti oradan gelir — bu da bir sonraki dersin
sorusudur.

İkinci tablo iletişimi ölçüyor. Dört eşiğin ikisinde nöbet karşılığı vardır ve o ikisinde
gerçekleşen bildirim süresi sözleşmede yazana eşittir. Kalan ikisinde karşı taraf yalnız mesai
saatlerinde ulaşılabilirdir; gecenin 02:30'unda oluşan bir olayda kapsam dışına taşma şüphesi için
sözleşme dört saat yazarken gerçekleşen süre 6,5 saattir. Bu, protokolün en yavaş iki eşiğinin
aynı zamanda testi durduran eşikler olması demektir: testi durduran üç eşikten ikisi mesaiye
bağlıdır. Dört eşik toplamda altı ayrı tarafı ilgilendirir ve en çok tarafı ilgilendiren eşik aynı
zamanda en uzun sürendir, çünkü protokol tarafların hepsine ulaşmayı şart koşar.

Durdurma sütunu da ayrıca okunmalıdır. Üç eşikte test durur ve durma anı bir karar değil bir
yükümlülüktür: kapsam dışına taşma şüphesi doğduğunda o şüphe giderilene kadar hiçbir yeni adım
koşturulmaz. Bu, pencerede kaybedilen saati doğrudan artırır — gecenin 02:30'unda duran bir test
09:00'a kadar bekliyorsa o gecenin kalan 3,5 saati iki kişi için yedi kişi-saat eder ve zaten altı
saat eksik olan plana eklenir. Katılım kurallarının zaman ve iletişim bölümleri bu yüzden ayrı
belgeler değildir; biri ötekinin girdisidir.

Sonuç tek cümleye iner: katılım kuralları üç ayrı sayı üretir — dokunulabilir kalem sayısı,
kullanılabilir saat sayısı ve bildirimin gerçekleşme süresi. Üçü de yazılı metinde değil, envanter
ve takvim üzerinde koşturulduğunda ortaya çıkar.

#### Özet

- 64 kalemlik envanterde iki cümlelik kapsam tanımı 20 kalemi kapsamda, 33'ünü dışında bırakıyor
  ve **11 kalemi sınırda** — kararsız — bırakıyor; sınırdaki kalemlerin tamamı izinli birimlerden,
  izinsiz blok ya da ortamdan geliyor.
- Sekiz ön yüzün beşi kapsam içi ve kapsam dışı kalemi aynı noktada topluyor; bu ön yüzler
  üzerinden 29 kaleme yanlışlıkla dokunulabiliyor ve 11'i katılım kurallarında adıyla yasaklanmış.
- `onyuz-ortak-2` arkasında tek bir kapsam içi kalem için 11 yasak kalem riski taşıyor; doğru
  karar o tek kalemi değerlendirme dışına çıkarmaktır.
- Pencere kaba hesapta planlanan işi 4 saat aşarken sayaç okuma aralığı düşünce 6 saat eksik
  kalıyor; kesinti 46 saatlik doğrulama sınıfından gelmek zorundadır.
- Dört iletişim eşiğinin ikisinde nöbet karşılığı yok; gecenin 02:30'unda kapsam dışına taşma
  şüphesi sözleşmede 4 saat, gerçekte 6,5 saat sürüyor ve dört ayrı tarafı ilgilendiriyor; dört
  eşik toplamda altı tarafa ulaşıyor.

#### Sonraki Adım

Kapsam sayıya çevrildi, pencere hesaplandı ve bildirim süreleri yazıldı. Bu üç sayı neyin
yapılabileceğini belirler, ama **nasıl** yapılacağını belirlemez. Aynı 20 kalem üzerinde
değerlendirme hiçbir ön bilgi verilmeden de yürütülebilir, kimlik bilgisi ve mimari belgesi
verilerek de. İki yol aynı süreyi harcamaz ve aynı sayıda aday üretmez. Sonraki ders kara, gri ve
beyaz kutu değerlendirmelerini aday üretimi cinsinden karşılaştırır: aynı hedefte her tür kaç aday
çıkarıyor, kaçı kanıta dönüşüyor ve aradaki süre farkı neye mal oluyor.

### Test Türleri

Source: https://academia.sh/tr/kurslar/sizma-testi/test-turleri

Aynı 20 kalem ve aynı 41 kurgu açık üzerinde kara, gri ve beyaz kutu değerlendirmesi koşturuluyor. Kara kutu 78 aday üretip 6 kanıt bırakıyor (%7,7), gri kutu 63 adaydan 20, beyaz kutu 60 adaydan 31 kanıt çıkarıyor; 10 açık hiçbir türde kanıtlanamıyor çünkü kanıtı katılım kurallarının yasakladığı bir eylem gerektiriyor. Kanıt başına süre 8,82 saatten 1,87 saate, kanıt başına savunma kaydı 78'den 2,9'a iniyor; beyaz kutunun 31 kanıtının 17'si ancak içeriden anlamlı.

Bir önceki ders kapsamı sayıya çevirdi: 20 kalem kapsamda, 11 kalem sınırda, net pencere 70
kişi-saat. O hesap neyin yapılabileceğini yazdı ama nasıl yapılacağını yazmadı. Aynı 20 kalem hiçbir
ön bilgi verilmeden de değerlendirilebilir, kimlik bilgisi verilerek de, yapılandırma ve kaynak
erişimi açılarak da. Üç yol aynı adı taşımaz ve aynı sonucu vermez.

Bu ders üç yolu tek bir hedefte karşılaştırır. **Kara kutu değerlendirmesi** hiçbir iç bilgi
almadan başlar, **gri kutu** kimlik bilgisi ve sınırlı belge alır, **beyaz kutu** yapılandırmayı ve
kaynağı görür. Karşılaştırmanın ölçüsü bulgu sayısı değildir; bulgu sayısı türden türe yanıltıcı
biçimde değişir. Ölçü, üretilen **aday** ile kanıta dönüşen bulgu arasındaki farktır.

- **TS7.** Değerlendirme, önceki dersteki 20 kapsam içi kalem üzerinde yürür. Kalem kümesi de
  açık kümesi de **kurgudur**.
- **TS8.** Her açık iki ayrı erişim düzeyi taşır: onu **görmek** için gereken düzey ve onu
  **kanıtlamak** için gereken düzey. Düzeyler `dis`, `kimlik` ve `ic` biçiminde sıralıdır.
- **TS9.** Bazı açıkların kanıt düzeyi `etki`dir: kanıtı ancak hizmeti etkileyecek bir eylemle
  alınabilir. Katılım kuralları bu eylemi yasakladığı için **hiçbir tür** bu düzeye erişemez.
- **TS10.** Her kalem bir **gürültü tabanı** taşır: doğrulanmadan aday sayılan belirti sayısı.
  Tür ne kadar az iç bilgi görüyorsa gürültü çarpanı o kadar yüksektir.
- **TS11.** Süre iki kalemden oluşur: kalem başına hazırlık ve aday başına doğrulama. Bütün
  süreler kurgudur ve kişi-saat cinsindendir.
- **TS12.** **İz kaydı**, adımın savunma tarafında ürettiği kayıt sayısıdır. Aday başına iz
  çarpanı türe bağlıdır; belge okuyarak ilerleyen tür daha az kayıt üretir.

#### Aynı Hedefte Üç Tür

```js
// turler.mjs — ayni hedefte kara, gri ve beyaz kutu degerlendirmesinin aday uretimi.
// MODELDIR; kalem kumesi de acik kumesi de kurgudur.
export const TOHUM = 20260811, KALEM = 20;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Her acik iki ayri erisim duzeyi tasir: GORME icin gereken ve KANIT icin gereken.
// Kanit duzeyi gorme duzeyinden yuksek olabilir; aday ile kanit farki buradan cikar.
const DUZEY = ["dis", "kimlik", "ic"];
export const ACIK = [];
for (let k = 0; k < KALEM; k++) {
  const n = 1 + Math.floor(r() * 3);                // kalem basina 1-3 gercek acik
  for (let j = 0; j < n; j++) {
    const g = Math.floor(r() * 3);
    // "etki": kaniti ancak hizmeti etkileyecek bir eylemle alinabilen acik. Katilim
    // kurallari bunu yasakladigi icin hicbir tur bu duzeye erisemez.
    const kanit = r() < 0.15 ? "etki" : DUZEY[Math.min(2, g + (r() < 0.42 ? 1 : 0))];
    ACIK.push({ kalem: k, gorme: DUZEY[g], kanit });
  }
}
// Kalem basina gurultu tabani: dogrulanmadan aday sayilan belirti sayisi.
export const GURULTU = Array.from({ length: KALEM }, () => 1 + Math.floor(r() * 5));

// Tur tanimi: gordugu duzeyler, gurultu carpani, kalem basina hazirlik ve aday
// basina dogrulama suresi (saat), aday basina savunmada birakilan kayit.
export const TUR = [
  { ad: "kara kutu", gorus: ["dis"], gurultu: 1.0, hazirlik: 0.5, dogrulama: 0.55, iz: 6.0 },
  { ad: "gri kutu", gorus: ["dis", "kimlik"], gurultu: 0.6, hazirlik: 1.1, dogrulama: 0.40,
    iz: 3.5 },
  { ad: "beyaz kutu", gorus: ["dis", "kimlik", "ic"], gurultu: 0.3, hazirlik: 2.0,
    dogrulama: 0.30, iz: 1.5 },
];

// Bir tur, verilen kalem kumesinde olculur; kalem listesi verilmezse tamami.
export function olc(t, kalemler = [...Array(KALEM).keys()]) {
  const kume = new Set(kalemler);
  const acik = ACIK.filter((a) => kume.has(a.kalem));
  const gorulen = acik.filter((a) => t.gorus.includes(a.gorme));
  const kanit = gorulen.filter((a) => t.gorus.includes(a.kanit));
  const yanlis = kalemler.reduce((s, k) => s + Math.round(GURULTU[k] * t.gurultu), 0);
  const aday = gorulen.length + yanlis;
  const sure = kalemler.length * t.hazirlik + aday * t.dogrulama;
  return { aday, kanit: kanit.length, yanlis, askida: gorulen.length - kanit.length,
    kacan: acik.length - gorulen.length, sure, iz: Math.round(aday * t.iz) };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([13, 7, 8, 9, 9, 9, 9, 11]);
  console.log(`model (tohum ${TOHUM}): ${KALEM} kapsam ici kalem, ${ACIK.length} gercek acik`);
  const d = (k) => ACIK.filter((a) => a.gorme === k).length;
  console.log(`gorme duzeyine gore: dis ${d("dis")}, kimlik ${d("kimlik")}, ic ${d("ic")}; ` +
    `${ACIK.filter((a) => a.gorme !== a.kanit).length} acikta kanit duzeyi gormeden yuksek`);
  console.log("\n" + yz(["tur", "aday", "kanit", "yanlis+", "askida", "kacan", "saat",
    "kanit/saat"]));
  for (const t of TUR) {
    const o = olc(t);
    console.log(yz([t.ad, o.aday, o.kanit, o.yanlis, o.askida, o.kacan, o.sure.toFixed(1),
      (o.kanit / o.sure).toFixed(2)]));
  }
  const [a, b, c] = TUR.map((t) => olc(t));
  console.log(`\nkanit orani: kara ${(100 * a.kanit / a.aday).toFixed(1)}%, gri ` +
    `${(100 * b.kanit / b.aday).toFixed(1)}%, beyaz ${(100 * c.kanit / c.aday).toFixed(1)}%`);
}
```

```
model (tohum 20260811): 20 kapsam ici kalem, 41 gercek acik
gorme duzeyine gore: dis 16, kimlik 11, ic 14; 19 acikta kanit duzeyi gormeden yuksek

tur             aday   kanit  yanlis+   askida    kacan     saat kanit/saat
kara kutu         78       6       62       10       25     52.9       0.11
gri kutu          63      20       36        7       14     47.2       0.42
beyaz kutu        60      31       19       10        0     58.0       0.53

kanit orani: kara 7.7%, gri 31.7%, beyaz 51.7%
```

Tablonun ilk sütunu bu kursun en yanıltıcı sayısıdır. **En çok adayı en az kanıt üreten tür
çıkarıyor.** Kara kutu 78 aday bırakıyor, bunların 62'si yanlış pozitif, 10'u görülüp
kanıtlanamayan kalem, geriye 6 kanıt kalıyor: yüzde 7,7. Aynı hedefte beyaz kutu 60 adaydan 31
kanıt çıkarıyor. Bir raporun kapağına yazılan "78 bulgu" ile "60 bulgu" arasındaki fark, kurumun
gerçekte aldığı şeyle ters yöndedir.

Bu farkın kaynağı ikinci satırdadır: 41 açığın 19'unda kanıt düzeyi görme düzeyinden yüksektir.
Bir açığı **görmek** ile onu **kanıtlamak** ayrı erişim gerektirir ve keşif aşamasının ürettiği
her belirti bu ayrımın yanlış tarafında durur. Kara kutu dışarıdan görünen 16 açığın tamamını
görebilir, ama bunların yalnız 6'sının kanıtına dışarıdan ulaşabilir; kalan 10'u askıda kalır.
Askıda kalan aday rapora girerse doğrulanmamış bir iddiadır; girmezse kurum onu hiç duymaz. İkisi
de tek başına doğru değildir ve bu dersin ölçtüğü şey tam olarak bu üçüncü sütunun büyüklüğüdür.

Gri kutunun yeri de bu tabloda okunuyor. 63 aday, 20 kanıt ve 14 kaçan açıkla iki uç arasında
duruyor, ama asıl katkısı sayıda değildir: gri kutu, kimlik bilgisi ele geçirilmiş bir hesabın
nereye ulaşabildiği sorusunun karşılığıdır. Kara kutu bu soruyu hiç soramaz, çünkü kimlik düzeyine
erişemez; beyaz kutu sorabilir ama yanıtı yapılandırmadan okur, oysa soru koşum zamanına aittir.
Gri kutunun 6 içeriden kanıtı tam olarak bu sınıftadır ve bir kimlik ele geçirme senaryosunun
sınırını çizer.

Beyaz kutunun 10 askıda kalemi ayrı bir sınıftır. Beyaz kutu her düzeyi görür, dolayısıyla onun
askıda bıraktığı 10 aday **kanıtı yalnız hizmeti etkileyecek bir eylemle alınabilen** açıklardır.
Katılım kuralları bu eylemi yasaklar ve yasak kalktığı an değerlendirme değil kesinti üretilir.
Bu 10 kalem hiçbir türde kanıtlanamaz; raporda "kanıtlanmış bulgu" değil, "koşulları yazılı aday"
olarak durmak zorundadır. Kaçan sütunu ise bunun tersini gösterir: kara kutu 25 gerçek açığı hiç
görmez, gri kutu 14'ünü, beyaz kutu hiçbirini kaçırmaz.

#### İzin Bedeli ve Kanıtın Anlamı

```js
// karsilastir.mjs — turlerin biraktigi iz ve kanitin disaridan erisilebilirligi.
import { TUR, KALEM, ACIK, olc } from "./turler.mjs";

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([13, 8, 10, 11, 8, 10, 11]);
const tam = [...Array(KALEM).keys()];

// Kanitlanan aciklarin kaci disaridan gorulebilir duzeyde: bir saldirganin ilk
// erisim olmadan ulasabilecegi kanit ile ancak iceriden anlamli olan kanit ayrilir.
const dagit = (t) => {
  const kanit = ACIK.filter((a) => t.gorus.includes(a.gorme) && t.gorus.includes(a.kanit));
  return { dis: kanit.filter((a) => a.gorme === "dis").length,
    ic: kanit.filter((a) => a.gorme !== "dis").length };
};
console.log(`${KALEM} kalem, ${ACIK.length} gercek acik; iz kaydi savunma tarafinda sayilan ` +
  `kayittir`);
console.log(yz(["tur", "kanit", "iz kaydi", "iz / kanit", "distan", "iceriden", "saat/kanit"]));
for (const t of TUR) {
  const o = olc(t), d = dagit(t);
  console.log(yz([t.ad, o.kanit, o.iz, (o.iz / o.kanit).toFixed(1), d.dis, d.ic,
    (o.sure / o.kanit).toFixed(2)]));
}

// Karma: ilk m kalemde beyaz kutu, kalan kalemlerde gri kutu.
const [, gri, beyaz] = TUR;
const karma = (m) => {
  const a = olc(beyaz, tam.slice(0, m)), b = olc(gri, tam.slice(m));
  return { aday: a.aday + b.aday, kanit: a.kanit + b.kanit, askida: a.askida + b.askida,
    kacan: a.kacan + b.kacan, sure: a.sure + b.sure, iz: a.iz + b.iz };
};
const y2 = gen([17, 8, 8, 8, 8, 9, 10]);
console.log("\n" + y2(["karma beyaz / gri", "aday", "kanit", "askida", "kacan", "saat",
  "iz kaydi"]));
for (let m = 0; m <= KALEM; m += 4) {
  const k = karma(m);
  console.log(y2([`${m} / ${KALEM - m}`, k.aday, k.kanit, k.askida, k.kacan, k.sure.toFixed(1),
    k.iz]));
}
const s = karma(0), b20 = karma(KALEM);
console.log(`\ngri kutudan beyaz kutuya gecmek ${(b20.sure - s.sure).toFixed(1)} saat ekliyor, ` +
  `kaniti ${s.kanit}'den ${b20.kanit}'e cikariyor, kacan acigi ${s.kacan}'ten 0'a indiriyor`);
console.log(`ayni gecis iz kaydini ${s.iz}'den ${b20.iz}'a dusuruyor; askida kalan aday ` +
  `${s.askida}'den ${b20.askida}'a cikiyor, cunku beyaz kutu daha cok acik goruyor`);
```

```
20 kalem, 41 gercek acik; iz kaydi savunma tarafinda sayilan kayittir
tur             kanit  iz kaydi iz / kanit  distan  iceriden saat/kanit
kara kutu           6       468       78.0       6         0       8.82
gri kutu           20       221       11.1      14         6       2.36
beyaz kutu         31        90        2.9      14        17       1.87

karma beyaz / gri    aday   kanit  askida   kacan     saat  iz kaydi
0 / 20                 63      20       7      14     47.2       221
4 / 16                 64      24       7      10     49.9       199
8 / 12                 62      26       7       8     51.6       169
12 / 8                 63      30       7       4     54.2       145
16 / 4                 61      31       8       2     55.8       114
20 / 0                 60      31      10       0     58.0        90

gri kutudan beyaz kutuya gecmek 10.8 saat ekliyor, kaniti 20'den 31'e cikariyor, kacan acigi 14'ten 0'a indiriyor
ayni gecis iz kaydini 221'den 90'a dusuruyor; askida kalan aday 7'den 10'a cikiyor, cunku beyaz kutu daha cok acik goruyor
```

Süre sütunu önceki dersin kaba planını düzeltiyor. Orada 20 kalem için 76 saatlik tek bir plan
vardı ve tür ayrımı yoktu; tür ayrıldığında aynı 20 kalem 47,2 ile 58,0 saat arasında değişiyor ve
**üçü de 70 saatlik net pencereye sığıyor**. Yani seçim bir süre kısıtı değildir. Kanıt başına
süreye bakıldığında fark açılıyor: kara kutuda bir kanıt 8,82 saat, beyaz kutuda 1,87 saat tutuyor.
Kara kutunun süresi doğrulamaya değil, 62 yanlış pozitifi elemeye gidiyor.

İz sütunu mavi takım tarafını yazıyor. Kara kutu savunmada 468 kayıt bırakıyor, beyaz kutu 90.
Aradaki oran 5,2'dir ve nedeni yalnız aday sayısı değildir: kara kutu her adayı ağ üzerinden
sınamak zorundadır, beyaz kutu adayların bir bölümünü belgede kapatır. Kanıt başına iz 78'den 2,9'a
iniyor. Bir değerlendirmenin savunmayı ne kadar meşgul ettiğini ölçmenin doğru birimi budur:
toplam kayıt sayısı değil, **kanıt başına kayıt**.

Son iki sütun ise beyaz kutunun sınırını gösteriyor. 31 kanıtın 17'si ancak içeriden anlamlıdır:
yapılandırmada var olduğu gösterilmiştir, ama dışarıdan bir isteğin oraya ulaşabildiği
gösterilmemiştir. Kara kutunun 6 kanıtının 6'sı ise dışarıdan erişilebilir sınıftadır. İki tür
farklı sorulara yanıt verir — biri "bu açık var mı", öteki "bu açığa dışarıdan ulaşılıyor mu" — ve
bir düzeltme kuyruğunda bu ikisi aynı sıraya konamaz.

Bu ayrım tür seçimini bir tercih olmaktan çıkarıp bir soru eşleştirmesine dönüştürür. Sorulan şey
"dışarıdan bakan biri ne görüyor ve nereye ulaşabiliyor" ise kara kutu doğru araçtır ve 6 kanıtı
bu soruya doğrudan yanıt verir; 468 kayıt ise savunmanın bu tür bir denemeyi görüp görmediğinin
ölçüsü olarak ayrıca değerlidir. Sorulan şey "envanterde kaç açık var ve hangisi düzeltme
kuyruğuna girmeli" ise beyaz kutu doğru araçtır, çünkü kaçan sütununu sıfırlayan tek türdür.
İkisini aynı sözleşmede aynı ölçütle değerlendirmek, iki farklı soruya verilen yanıtları aynı
tabloya yazmak olur.

Karma tablo aradaki geçişi tek eksende gösteriyor. Beyaz kutuya kayan her dört kalem kaçan açığı
azaltıyor ve iz kaydını düşürüyor; karşılığında süre artıyor. Askıda kalan aday ilk üç geçişte
yediden kıpırdamıyor, son iki geçişte sekize ve ona çıkıyor, çünkü daha çok açık görüldükçe kanıtı
yasak olan kalemlerin de daha çoğu görünür oluyor. Beyaz kutunun asıl bedeli tabloda görünmez:
kurumun yapılandırmayı ve kaynağı test ekibine açması gerekir ve bu bir süre kalemi değil bir
kurumsal karardır. Tablonun ara satırları da bu yüzden işe yarar — bütün envanteri açmak yerine
dört ya da sekiz kalemi açmak, kaçan açığı 14'ten 10'a ve 8'e indirirken açılan belge miktarını
beşte bir düzeyinde tutar. Hangi kalemlerin açılacağı ise teknik değil, iş tarafında verilen bir
karardır.

#### Özet

- Aynı 20 kalemde kara kutu 78 aday üretip 6 kanıt bırakıyor, beyaz kutu 60 adaydan 31 kanıt
  çıkarıyor; aday sayısı ile kanıt sayısı ters yönde hareket ediyor.
- Farkın kaynağı, 41 açığın 19'unda kanıt düzeyinin görme düzeyinden yüksek olmasıdır: bir açığı
  görmek ile kanıtlamak ayrı erişim gerektirir.
- 10 açık hiçbir türde kanıtlanamıyor, çünkü kanıtı ancak hizmeti etkileyecek bir eylemle
  alınabiliyor ve katılım kuralları bunu yasaklıyor; bu kalemler raporda kanıt değil, koşulları
  yazılı aday olarak durur.
- Üç tür de 70 saatlik pencereye sığıyor; ayrım kanıt başına süredir — 8,82 saate karşı 1,87 saat.
- Kara kutu savunmada 468, beyaz kutu 90 kayıt bırakıyor; kanıt başına iz 78'den 2,9'a iniyor.
- Beyaz kutunun 31 kanıtının 17'si ancak içeriden anlamlıdır; kara kutunun 6 kanıtının tamamı
  dışarıdan erişilebilir sınıftadır ve iki tür farklı sorulara yanıt verir.

#### Sonraki Adım

Üç türün de ortak bir kalıntısı var: yanlış pozitif. Kara kutuda 62, gri kutuda 36, beyaz kutuda
19 aday gerçek bir açığa karşılık gelmiyor ve bu sayılar bu derste tek bir çarpanla üretildi.
Gerçekte hangi adayın eleneceği çarpanla değil, adayın hangi kanıta dayandığıyla belirlenir: sürüm
bilgisine bakarak üretilen bir aday ile davranışı gözlenerek üretilen bir aday aynı ağırlıkta
değildir. Sonraki ders aday listesini doğrulama kurallarından geçirir ve elenen yanlış pozitifi
tek tek sayar: kaç aday yalnız sürüm bilgisine dayanıyor, kaçı davranışla doğrulanıyor ve
doğrulamanın kendisi hedefe ne kadar risk ekliyor.

### Açık Doğrulama

Source: https://academia.sh/tr/kurslar/sizma-testi/acik-dogrulama

240 ham aday dört doğrulama kuralından geçiriliyor: tekilleştirme 101 adayı hiçbir bulgu düşürmeden siliyor, sürüm desteği kuralı 23, etki sınırı 9 adayı çıkarıyor, doğrulama 46 yanlış pozitifi eliyor ve geriye 61 kanıt kalıyor. Adayların yüzde 43'ü sürüm bilgisinden geliyor ama bu sınıfın yalnız yüzde 16,3'ü gerçek. Doğrulama sırası zincire bağlandığında koşturulan aday 107'den 74'e, risk 17,8'den 11,9'a, savunmadaki iz 461'den 313 kayda iniyor; bedeli önkoşulu kapalı sayılan 16 gerçek açığın kanıtsız kalmasıdır.

Bir önceki ders üç değerlendirme türünü karşılaştırdı ve hepsinde aynı kalıntıyı buldu: kara
kutuda 62, gri kutuda 36, beyaz kutuda 19 aday gerçek bir açığa karşılık gelmiyordu. O sayılar tek
bir gürültü çarpanıyla üretilmişti. Gerçekte hangi adayın eleneceğini çarpan değil, adayın hangi
belirtiye dayandığı belirler.

Bu ders bir aday listesini doğrulama kurallarından geçirir ve her kuralın kaç adayı çıkardığını,
kaç gerçek bulguyu birlikte götürdüğünü sayar. **Yanlış pozitif** (false positive), gerçek bir
açığa karşılık gelmeyen adaydır; **doğrulama**, adayı kanıta çeviren adımdır. Doğrulama adımı
kâğıt üzerinde kalmaz, hedefe gerçekten dokunur: **yazılı yetki ve tanımlı kapsam olmadan bu
adımı atmak hem yasadışı hem meslek dışıdır.**

- **TS13.** Aday listesi 240 ham kalemdir ve önceki iki dersin 20 kapsam içi kalemi üzerinde
  durur. Liste de açık kümesi de **kurgudur**; hiçbir hedefe işlem yapılmaz.
- **TS14.** Bir **yer**, bir kalemin bir zincir adımıdır. 20 kalem ve 4 adım 80 yer verir;
  yerlerin bir bölümünde gerçekten açık vardır. Bu küme modelin doğrusudur, değerlendirme onu
  bilmez.
- **TS15.** Her aday bir **belirti sınıfı** taşır: sürüm bilgisi, yanıt farkı, yapılandırma ya da
  davranış. Zayıf sınıflar adayların çoğunu temiz yerlere dağıtır.
- **TS16.** Bir **bulgu**, bir yerdeki gerçek açıktır; aynı bulguya birden çok aday işaret
  edebilir. **Kayıp**, hiçbir adayı kalmayan gerçek bulgu sayısıdır.
- **TS17.** Doğrulamanın üç bedeli vardır: süre, hedefe eklenen **risk puanı** ve savunmada
  bırakılan **iz kaydı**. Üçü de aday başına ve belirti sınıfına göre değişir.
- **TS18.** Zincir modeli önceki kurstan girdi olarak alınır: bir adımda açık bulunamazsa o
  kalemin sonraki adımları ulaşılamaz sayılabilir.

#### Eleme Hattı

```js
// eleme.mjs — aday listesini dogrulama kurallarindan gecirip yanlis pozitifi sayar.
// MODELDIR; aday listesi kurgudur, hicbir hedefe islem yapilmaz.
export const TOHUM = 20260214, KALEM = 20;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Belirti sinifi: adayin hangi kanita dayandigi ve o kanitin gercek cikma orani.
// Surum bilgisi en zayif belirtidir, cunku duzeltme geriye tasinmis olabilir.
export const SINIF = [
  { ad: "surum bilgisi", pay: 0.46, gercek: 0.17, sure: 0.15, risk: 0.0, iz: 2 },
  { ad: "yanit farki", pay: 0.24, gercek: 0.44, sure: 0.35, risk: 0.1, iz: 5 },
  { ad: "yapilandirma", pay: 0.18, gercek: 0.71, sure: 0.50, risk: 0.0, iz: 1 },
  { ad: "davranis", pay: 0.12, gercek: 0.88, sure: 0.90, risk: 0.6, iz: 9 },
];
const sinifSec = (u) => { let t = 0;
  for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); };

// Yer: bir kalemin bir zincir adimi. 20 kalem x 4 adim = 80 yer; bir bolumunde
// gercekten acik var. Bu kume modelin dogrusudur, degerlendirme onu bilmez.
const YER = [];
for (let k = 0; k < KALEM; k++) for (let z = 1; z <= 4; z++) YER.push({ k, z, acik: r() < 0.35 });
const ACIK_YER = YER.filter((y) => y.acik), TEMIZ_YER = YER.filter((y) => !y.acik);
const sec = (l) => l[Math.floor(r() * l.length)];

// 240 ham aday. Zayif belirti siniflari adaylarin cogunu temiz yerlere dagitir.
export const ADAY = Array.from({ length: 240 }, (_, i) => {
  const s = sinifSec(r()), y = r() < s.gercek ? sec(ACIK_YER) : sec(TEMIZ_YER);
  return { no: i, kalem: y.k, zincir: y.z, sinif: s.ad, gercek: y.acik, etki: r() < 0.08 };
});

// Bir bulgu, bir kalemin bir zincir adimindaki gercek aciktir; ayni bulguya birden
// cok aday isaret edebilir. Kayip, hicbir adayi kalmayan gercek bulgu sayisidir.
export const BULGU = new Set(ADAY.filter((a) => a.gercek).map((a) => `${a.kalem}|${a.zincir}`));
const kayip = (l) => BULGU.size -
  new Set(l.filter((a) => a.gercek).map((a) => `${a.kalem}|${a.zincir}`)).size;

export function hat() {
  const adim = [];
  const gecir = (ad, liste, kalir) => {
    const kalan = [], elenen = [];
    for (const a of liste) (kalir(a) ? kalan : elenen).push(a);
    adim.push({ ad, giren: liste.length, elenen: elenen.length, kalan: kalan.length,
      kayip: kayip(kalan) });
    return kalan;
  };
  let l = ADAY;
  // K1: ayni kalemde ayni belirtiden ayni zincir adimina birden cok aday tekillestirilir.
  const gorulen = new Set();
  l = gecir("tekillestirme", l, (a) => {
    const k = `${a.kalem}|${a.sinif}|${a.zincir}`;
    if (gorulen.has(k)) return false;
    gorulen.add(k); return true;
  });
  // K2: yalniz surum bilgisine dayanan aday, ayni kalemin ayni zincir adiminda
  // davranis ya da yanit belirtisi yoksa elenir. Surum eslesmesi kanit degildir.
  const destekli = new Set(l.filter((a) => a.sinif === "davranis" || a.sinif === "yanit farki")
    .map((a) => `${a.kalem}|${a.zincir}`));
  l = gecir("surum destegi", l,
    (a) => a.sinif !== "surum bilgisi" || destekli.has(`${a.kalem}|${a.zincir}`));
  // K3: kaniti hizmeti etkileyecek eylem gerektiren aday dogrulanmaz, askida kalir.
  const askida = l.filter((a) => a.etki);
  l = gecir("etki siniri", l, (a) => !a.etki);
  // K4: kalan adaylar dogrulanir; gercek olmayanlar elenen yanlis pozitiftir.
  const dogrulanacak = l;
  l = gecir("dogrulama", l, (a) => a.gercek);
  return { adim, kanit: l, askida, dogrulanacak };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const { adim, kanit, askida } = hat();
  console.log(`model (tohum ${TOHUM}): ${ADAY.length} ham aday, ${KALEM} kalem, ` +
    `${ADAY.filter((a) => a.gercek).length} tanesi gercekte acik`);
  const y1 = gen([16, 9, 9, 9, 13]);
  console.log("\n" + y1(["kural", "giren", "elenen", "kalan", "kayip bulgu"]));
  for (const a of adim) console.log(y1([a.ad, a.giren, a.elenen, a.kalan, a.kayip]));
  console.log(y1(["kalan sonuc", "", `${askida.length} askida`, `${kanit.length} kanit`, ""]));

  const y2 = gen([16, 8, 9, 10, 9, 8]);
  console.log("\n" + y2(["belirti sinifi", "aday", "gercek", "gercek %", "kanit", "elenen"]));
  for (const s of SINIF) {
    const l = ADAY.filter((a) => a.sinif === s.ad);
    const k = kanit.filter((a) => a.sinif === s.ad).length;
    console.log(y2([s.ad, l.length, l.filter((a) => a.gercek).length,
      `${(100 * l.filter((a) => a.gercek).length / l.length).toFixed(1)}%`, k, l.length - k]));
  }
  console.log(`\n${ADAY.length} adaydan ${ADAY.length - kanit.length - askida.length}'i ` +
    `eleniyor, ${kanit.length}'i kanit oluyor, ${askida.length}'i askida kaliyor`);
  console.log(`${BULGU.size} gercek bulgunun ${adim.at(-1).kayip}'i eleme sirasinda ` +
    `kayboluyor; surum destegi kurali ${adim[1].kayip - adim[0].kayip}, etki siniri ` +
    `${adim[2].kayip - adim[1].kayip} tanesini goturuyor`);
}
```

```
model (tohum 20260214): 240 ham aday, 20 kalem, 114 tanesi gercekte acik

kural               giren   elenen    kalan  kayip bulgu
tekillestirme         240      101      139            0
surum destegi         139       23      116            1
etki siniri           116        9      107            2
dogrulama             107       46       61            2
kalan sonuc               9 askida 61 kanit

belirti sinifi      aday   gercek  gercek %    kanit  elenen
surum bilgisi        104       17     16.3%        7      97
yanit farki           60       33     55.0%       18      42
yapilandirma          37       30     81.1%       17      20
davranis              39       34     87.2%       19      20

240 adaydan 170'i eleniyor, 61'i kanit oluyor, 9'i askida kaliyor
29 gercek bulgunun 2'i eleme sirasinda kayboluyor; surum destegi kurali 1, etki siniri 1 tanesini goturuyor
```

Hattın dört kuralı çok farklı işler yapıyor. **Tekilleştirme tek başına 101 adayı, yani listenin
yüzde 42'sini siliyor ve hiçbir bulgu düşürmüyor.** Bu, hattın en ucuz kuralıdır: aynı kalemin aynı
zincir adımında aynı belirtiden üretilmiş yinelenen adaylar tek bir kaleme iner. Bir rapordaki
"240 bulgu" sayısının neredeyse yarısı, bu tek işlemle ortadan kalkabilecek bir sayım hatasıdır.

Sürüm desteği kuralı 23 aday eliyor ve karşılığında **1 gerçek bulgu** götürüyor. Etki sınırı 9
adayı askıya alıyor, bir bulgu daha düşüyor. Asıl doğrulama adımı 46 adayı eliyor — bunlar hattın
gerçek yanlış pozitifleridir. Geriye 61 kanıt kalıyor: 240 ham adaydan yüzde 25,4.

Dördüncü sütun hattın kendi hatasını yazıyor. **29 gerçek bulgunun 2'si eleme sırasında
kayboluyor**, yani yüzde 6,9. Bir eleme hattının değeri yalnız kaç aday sildiğiyle ölçülemez; her
kural bir eşiktir ve eşik hem gürültüyü hem sinyali keser. Bu iki sayı bir arada raporlanmazsa
agresif bir eleme hattı, kapsamı daralttığı halde kaliteli görünür.

İkinci tablo adayların nereden geldiğini gösteriyor ve hattın niçin bu sırayla kurulduğunu
açıklıyor. Sürüm bilgisi 104 adayla listenin en büyük kaynağıdır ama yalnız yüzde 16,3'ü gerçektir
ve yalnız 7 kanıt bırakır: adayların yüzde 43'ü, kanıtların yüzde 11,5'i. Nedeni bir ölçüm kusuru
değildir — bir düzeltme geriye taşındığında sürüm dizesi değişmeden açık kapanır, dolayısıyla
sürüm eşleşmesi kanıt taşımaz. Davranış sınıfı ise 39 adayla en küçük ikinci kaynak olduğu halde 19
kanıtla en büyük katkıyı verir: gözlenen davranış, çıkarım değil ölçümdür.

#### Doğrulama Sırası ve Eklenen Risk

```js
// sira.mjs — dogrulama sirasi: zincirin onkosul adimi once dogrulanirsa
// sonraki adimlarin adaylari hic kosturulmadan karara baglanir.
import { SINIF, hat } from "./eleme.mjs";

const bilgi = (ad) => SINIF.find((s) => s.ad === ad);
const LISTE = hat().dogrulanacak;                   // eleme kurallarindan gecmis adaylar

const topla = (l) => l.reduce((o, a) => {
  const s = bilgi(a.sinif);
  return { sayi: o.sayi + 1, saat: o.saat + s.sure, risk: o.risk + s.risk, iz: o.iz + s.iz };
}, { sayi: 0, saat: 0, risk: 0, iz: 0 });

// Kesme adimlari: hangi zincir adiminda olumsuz sonuc alinirsa kalemin geri kalani
// ulasilamaz sayilir. Bos kume = her aday tek tek dogrulanir.
function kosum(kesme) {
  const kosan = [], atlanan = [];
  for (const k of new Set(LISTE.map((a) => a.kalem))) {
    const kalemAdayi = LISTE.filter((a) => a.kalem === k);
    let kesildi = false;
    for (let z = 1; z <= 4; z++) {
      const adimAdayi = kalemAdayi.filter((a) => a.zincir === z);
      if (kesildi) { atlanan.push(...adimAdayi); continue; }
      kosan.push(...adimAdayi);
      if (kesme.has(z) && adimAdayi.length && !adimAdayi.some((a) => a.gercek)) kesildi = true;
    }
  }
  return { ...topla(kosan), kanit: kosan.filter((a) => a.gercek).length, atlanan,
    kacan: atlanan.filter((a) => a.gercek).length, kosan };
}

const YOL = [["sirasiz", new Set()], ["yalniz onkosul", new Set([1])],
  ["tam zincir", new Set([1, 2, 3, 4])]];
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([16, 12, 8, 10, 16, 8, 8, 10]);
console.log(`dogrulama hattina ${LISTE.length} aday giriyor; risk puani bir dogrulama ` +
  `adiminin hizmeti etkileme agirligidir`);
console.log(yz(["dogrulama sirasi", "dogrulanan", "kanit", "atlanan", "atlanan gercek",
  "saat", "risk", "iz kaydi"]));
const sonuc = {};
for (const [ad, kesme] of YOL) {
  const o = kosum(kesme); sonuc[ad] = o;
  console.log(yz([ad, o.sayi, o.kanit, o.atlanan.length, o.kacan, o.saat.toFixed(1),
    o.risk.toFixed(1), o.iz]));
}

const y2 = gen([16, 12, 14, 14, 12]);
console.log("\n" + y2(["belirti sinifi", "risk/aday", "hattaki aday", "tam zincirde",
  "kosulmayan"]));
for (const s of SINIF) {
  const a = LISTE.filter((x) => x.sinif === s.ad).length;
  const b = sonuc["tam zincir"].kosan.filter((x) => x.sinif === s.ad).length;
  console.log(y2([s.ad, s.risk.toFixed(1), a, b, a - b]));
}
const [d, o1, o2] = YOL.map(([ad]) => sonuc[ad]);
console.log(`\nonkosul kesmesi ${o1.atlanan.length} adayi kosturmuyor: riski ` +
  `${d.risk.toFixed(1)}'ten ${o1.risk.toFixed(1)}'e, izi ${d.iz}'ten ${o1.iz}'e indiriyor`);
console.log(`tam zincir kesmesi ${o2.atlanan.length} adayi kosturmuyor ve riski ` +
  `${(100 * (1 - o2.risk / d.risk)).toFixed(1)}% dusuruyor; bedeli, onkosulu kapali sayilan ` +
  `${o2.kacan} gercek acigin kanitsiz kalmasidir`);
```

```
dogrulama hattina 107 aday giriyor; risk puani bir dogrulama adiminin hizmeti etkileme agirligidir
dogrulama sirasi  dogrulanan   kanit   atlanan  atlanan gercek    saat    risk  iz kaydi
sirasiz                  107      61         0               0    48.9    17.8       461
yalniz onkosul            89      53        18               8    41.3    15.2       383
tam zincir                74      45        33              16    33.3    11.9       313

belirti sinifi     risk/aday  hattaki aday  tam zincirde  kosulmayan
surum bilgisi            0.0            26            19           7
yanit farki              0.1            34            23          11
yapilandirma             0.0            23            16           7
davranis                 0.6            24            16           8

onkosul kesmesi 18 adayi kosturmuyor: riski 17.8'ten 15.2'e, izi 461'ten 383'e indiriyor
tam zincir kesmesi 33 adayi kosturmuyor ve riski 33.1% dusuruyor; bedeli, onkosulu kapali sayilan 16 gercek acigin kanitsiz kalmasidir
```

Üç satır aynı 107 adayı üç ayrı sırayla ele alıyor ve üçü de farklı bir şey satın alıyor. Sırasız
doğrulama en çok kanıtı veriyor — 61 — ama en pahalı olanıdır: 48,9 saat, 17,8 risk puanı ve
savunmada 461 kayıt. Tam zincir sırası koşturulan aday sayısını 74'e indiriyor; risk yüzde 33,1
düşüyor, iz 313 kayda iniyor ve 15,6 saat kazanılıyor.

Kazancın nereden geldiği ikinci tabloda yazıyor. Risk puanının neredeyse tamamı davranış
sınıfındadır; sürüm ve yapılandırma adaylarının hedefe eklediği risk sıfırdır, çünkü ikisi de
gözlemdir. Tam zincir sırası 24 davranış adayının 8'ini hiç koşturmuyor ve düşen riskin büyük
bölümü bu sekiz koşumun yapılmamasından geliyor. Aynı mantık iz sütununda da işler: davranış adayı
başına 9 kayıt üretilirken yapılandırma adayı başına 1 kayıt üretilir.

Bedeli dördüncü sütundadır: tam zincir sırasında 33 aday hiç koşturulmaz ve bunların 16'sı
gerçekte açıktır. Bu 16 kalem bir kayıp mıdır, sorunun yanıtı zincir modelinin doğruluğuna
bağlıdır. Model doğruysa o açıklara giden önkoşul kapalıdır ve bir saldırgan da oraya ulaşamaz —
o zaman 16 koşum gereksiz risktir. Model eksikse, yani aynı yere ikinci bir yol varsa, 16 gerçek
açık kanıtsız kalır. Ara satır bu yüzden vardır: yalnız önkoşul adımında kesmek riski 17,8'den
15,2'ye indirirken atlanan gerçek açığı 8'de tutar.

Hangi sıra seçilirse seçilsin rapor tarafında değişmeyen bir kural kalır. Koşturulmayan aday
listeden silinmez; "önkoşulu kapalı sayıldığı için doğrulanmadı" kaydıyla ve hangi adımın hangi
sonucu verdiği yazılarak durur. Aksi durumda rapor, kapsamı olduğundan geniş gösterir.

#### Özet

- 240 ham aday dört kuraldan geçip 61 kanıta iniyor; tekilleştirme tek başına 101 adayı, listenin
  yüzde 42'sini, hiçbir bulgu düşürmeden siliyor.
- Eleme hattı kendi hatasını da üretiyor: 29 gerçek bulgunun 2'si kurallar sırasında kayboluyor,
  bu yüzden silinen aday sayısı ile düşen bulgu sayısı birlikte raporlanmalıdır.
- Adayların yüzde 43'ü sürüm bilgisinden geliyor ama bu sınıfın yalnız yüzde 16,3'ü gerçek ve
  kanıtların yalnız yüzde 11,5'ini veriyor; düzeltme geriye taşındığında sürüm dizesi değişmez.
- Davranış sınıfı en küçük ikinci kaynak olduğu halde en çok kanıtı veriyor — 39 adaydan 19 — çünkü
  gözlenen davranış çıkarım değil ölçümdür.
- Doğrulama sırası zincire bağlandığında koşturulan aday 107'den 74'e, risk 17,8'den 11,9'a ve iz
  461'den 313 kayda iniyor; düşüşün büyük bölümü koşturulmayan 8 davranış adayından geliyor.
- Tam zincir sırasının bedeli, önkoşulu kapalı sayılan 16 gerçek açığın kanıtsız kalmasıdır; bu
  kalemler rapordan silinmez, doğrulanmama gerekçesiyle birlikte yazılır.

#### Sonraki Adım

Elde 61 kanıt, 9 askıda aday ve doğrulanmadan bırakılmış bir liste var. Bu üç küme bir düzeltme
kuyruğuna girecekse sıraya konmak zorundadır ve sıralamanın ölçütü henüz yazılmadı. Teknik
ağırlık bir sıra üretir: erişim kolaylığı, etkinin genişliği, düzeltmenin zorluğu. Aynı liste iş
tarafından bakıldığında başka bir sıra üretir, çünkü bir kalemin taşıdığı iş bir başkasınınkiyle
aynı değildir. Sonraki ders aynı bulgu kümesini iki ayrı iş bağlamında puanlar ve iki sıralamanın
kaç sırada ayrıştığını sayar.

### Etki Değerlendirmesi

Source: https://academia.sh/tr/kurslar/sizma-testi/etki-degerlendirmesi

61 kanıtlanmış bulgu önce teknik ağırlıkla, sonra iki ayrı iş bağlamında puanlanıyor. İki iş sıralaması arasında aynı sırada kalan tek bulgu yok, ortalama kayma 22,23 sıra ve ilk on listeleri ortak tek bulgu içermiyor; ikili karşılaştırmaların yüzde 41,6'sı ters dönüyor. 40 adam-günlük bütçede teknik sıralama 12 bulgu düzeltip saha bağlamının yüzde 24,6'sını kapatırken kendi sırası yüzde 28,8'ini kapatıyor, iş puanını düzeltme gününe bölen sıralama ise yüzde 39,4'ünü.

Bir önceki ders 61 kanıt, 9 askıda aday ve doğrulanmadan bırakılmış bir liste üretti. Bu küme bir
düzeltme kuyruğuna girecekse sıraya konmak zorundadır. Sıralama teknik ölçütlerle yapılabilir:
açığa dışarıdan mı yoksa ancak içeriden mi ulaşılıyor, kaç kalemi etkiliyor, ne kadar yetki
kazandırıyor. Bu üç ölçüt tek bir sayı verir ve o sayı bir sıra üretir.

Bu ders o sıranın tek sıra olmadığını gösterir. Aynı bulgu, hangi işi taşıyan bir varlıkta
durduğuna göre farklı ağırlık taşır ve "hangi iş önemlidir" sorusunun yanıtı kuruma göre değişir.
**İş etkisi** (business impact), bulgunun teknik ağırlığının o varlığın taşıdığı işle
çarpılmasıdır. Ölçülecek şey iki puanlamanın hangisinin doğru olduğu değil, aynı listeyi **kaç
sırada farklı dizdikleridir**.

- **TS19.** Bulgu kümesi önceki dersin 61 kanıtıdır ve her bulgu beş varlık sınıfından birine
  bağlıdır. Küme de ağırlıklar da **kurgudur**.
- **TS20.** Teknik puan üç bileşenden gelir: erişim düzeyi (ağırlık 0,45), etki genişliği (0,30)
  ve kazanılan yetki (0,25). Sonuç 0 ile 10 arasına ölçeklenir.
- **TS21.** **İş ağırlığı**, bir varlık sınıfının o bağlamdaki değeridir. İki bağlam tanımlıdır:
  gelir ve abone verisi önceliği ile saha kesintisizliği önceliği.
- **TS22.** İş puanı, teknik puan ile iş ağırlığının çarpımıdır. Aynı bulgu iki bağlamda iki ayrı
  iş puanı taşır ve teknik puanı ikisinde de aynı kalır.
- **TS23.** İki sıralamanın farkı dört ölçüyle yazılır: aynı sırada kalan bulgu sayısı, ortalama
  sıra kayması, ilk on listesinin ortak üyesi ve ters düşen ikili karşılaştırma oranı.
- **TS24.** Düzeltme bütçesi 40 adam-gündür ve bütün küme 286 adam-gün tutar. Kuyruk sıradan
  alır, bütçeye sığmayan bulguyu atlar.

#### Bir Liste, Üç Sıra

```js
// puan.mjs — ayni kanitlanmis bulgu kumesi teknik agirlikla ve iki ayri is
// baglaminda puanlanir. MODELDIR; bulgu kumesi ve agirliklar kurgudur.
export const TOHUM = 20260222, N = 61;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Bir onceki dersin 61 kaniti. Her bulgu bir varlik sinifina baglidir.
export const VARLIK = ["abone verisi", "faturalama", "olcum dogrulugu", "saha operasyonu",
  "ic yonetim"];
const ERISIM = { dis: 1.0, kimlik: 0.6, ic: 0.3 };
export const BULGU = Array.from({ length: N }, (_, i) => {
  const e = ["dis", "kimlik", "ic"][Math.floor(r() * 3)];
  const genislik = Math.round(r() * 18) / 20, yetki = Math.round(r() * 20) / 20;
  return { no: i + 1, varlik: VARLIK[Math.floor(r() * VARLIK.length)], erisim: e,
    genislik, yetki, gun: 1 + Math.floor(r() * 8),   // duzeltme maliyeti (adam-gun)
    teknik: +(10 * (0.45 * ERISIM[e] + 0.30 * genislik + 0.25 * yetki)).toFixed(2) };
});

// Is agirligi: bir varlik sinifinin o baglamdaki agirligi. Ayni bulgu, ayni teknik
// puanla, iki baglamda farkli is etkisi tasir.
export const BAGLAM = {
  "gelir ve abone verisi": { "abone verisi": 1.0, "faturalama": 0.9, "olcum dogrulugu": 0.6,
    "saha operasyonu": 0.35, "ic yonetim": 0.3 },
  "saha kesintisizligi": { "abone verisi": 0.4, "faturalama": 0.45, "olcum dogrulugu": 0.85,
    "saha operasyonu": 1.0, "ic yonetim": 0.5 },
};
export const isPuan = (b, ad) => +(b.teknik * BAGLAM[ad][b.varlik]).toFixed(2);

// Siralama: puana gore azalan; esitlikte bulgu numarasi.
export const sirala = (anahtar) => [...BULGU]
  .sort((a, b) => anahtar(b) - anahtar(a) || a.no - b.no).map((b) => b.no);
export const yer = (s) => new Map(s.map((no, i) => [no, i + 1]));

// Iki siralama arasindaki fark: ayni sirada kalan, ortalama kayma, en buyuk kayma,
// ilk on ortak ve ters cift orani.
export function fark(s1, s2) {
  const y1 = yer(s1), y2 = yer(s2);
  const kayma = s1.map((no) => Math.abs(y1.get(no) - y2.get(no)));
  const ilk10 = new Set(s1.slice(0, 10));
  let ters = 0, cift = 0;
  for (let i = 0; i < s1.length; i++) for (let j = i + 1; j < s1.length; j++) {
    cift++;
    if ((y1.get(s1[i]) - y1.get(s1[j])) * (y2.get(s1[i]) - y2.get(s1[j])) < 0) ters++;
  }
  return { ayni: kayma.filter((k) => k === 0).length, enBuyuk: Math.max(...kayma),
    ort: kayma.reduce((a, k) => a + k, 0) / kayma.length,
    ortak10: s2.slice(0, 10).filter((no) => ilk10.has(no)).length,
    ters: +(100 * ters / cift).toFixed(1) };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const ADLAR = Object.keys(BAGLAM);
  const y1 = gen([18, 8, 12, 23, 21]);
  console.log(`model (tohum ${TOHUM}): ${N} kanitlanmis bulgu, ${VARLIK.length} varlik sinifi`);
  console.log("\n" + y1(["varlik sinifi", "bulgu", "ort teknik", ...ADLAR]));
  for (const v of VARLIK) {
    const l = BULGU.filter((b) => b.varlik === v);
    const ot = l.reduce((a, b) => a + b.teknik, 0) / l.length;
    console.log(y1([v, l.length, ot.toFixed(2), ...ADLAR.map((ad) => BAGLAM[ad][v].toFixed(2))]));
  }

  const sT = sirala((b) => b.teknik), sA = sirala((b) => isPuan(b, ADLAR[0]));
  const sB = sirala((b) => isPuan(b, ADLAR[1]));
  const y2 = gen([24, 10, 12, 12, 14, 13]);
  console.log("\n" + y2(["karsilastirma", "ayni sira", "ort kayma", "en buyuk", "ilk 10 ortak",
    "ters cift %"]));
  for (const [ad, x, y] of [["teknik - gelir baglami", sT, sA],
    ["teknik - saha baglami", sT, sB], ["gelir - saha baglami", sA, sB]]) {
    const f = fark(x, y);
    console.log(y2([ad, f.ayni, f.ort.toFixed(2), f.enBuyuk, `${f.ortak10}/10`, f.ters]));
  }

  const yT = yer(sT), yA = yer(sA), yB = yer(sB);
  const y3 = gen([8, 18, 9, 8, 9, 9, 9]);
  console.log("\n" + y3(["bulgu", "varlik", "teknik", "sira T", "sira A", "sira B", "A-B fark"]));
  const ilgi = [...BULGU].sort((a, b) => Math.abs(yA.get(b.no) - yB.get(b.no)) -
    Math.abs(yA.get(a.no) - yB.get(a.no))).slice(0, 6);
  for (const b of ilgi) {
    console.log(y3([b.no, b.varlik, b.teknik.toFixed(2), yT.get(b.no), yA.get(b.no),
      yB.get(b.no), yA.get(b.no) - yB.get(b.no)]));
  }
}
```

```
model (tohum 20260222): 61 kanitlanmis bulgu, 5 varlik sinifi

varlik sinifi        bulgu  ort teknik  gelir ve abone verisi  saha kesintisizligi
abone verisi            16        5.06                   1.00                 0.40
faturalama              13        5.37                   0.90                 0.45
olcum dogrulugu         14        5.77                   0.60                 0.85
saha operasyonu          5        5.24                   0.35                 1.00
ic yonetim              13        5.94                   0.30                 0.50

karsilastirma            ayni sira   ort kayma    en buyuk  ilk 10 ortak  ters cift %
teknik - gelir baglami           2       14.79          39          5/10         31.3
teknik - saha baglami            1       10.00          30          2/10         20.6
gelir - saha baglami             0       22.23          43          0/10         41.6

bulgu               varlik   teknik  sira T   sira A   sira B A-B fark
6          saha operasyonu     6.40      21       47        4       43
17         saha operasyonu     7.05      17       42        2       40
16         saha operasyonu     3.60      51       58       21       37
33         saha operasyonu     7.50      10       38        1       37
34            abone verisi     5.22      37       13       46      -33
31            abone verisi     5.28      33       12       44      -32
```

İlk tablonun son iki sütunu bu dersin asıl konusudur. Aynı varlık sınıfı, iki bağlamda 0,30 ile
1,00 arasında değişen bir ağırlık taşıyor ve ağırlıklar ortalama teknik puanla hiç ilişkili değil.
En dikkat çeken satır iç yönetim: ortalama teknik puanı 5,94 ile listenin en yükseği, ama gelir
bağlamında listenin en düşük ağırlığını (0,30) taşıyor; saha bağlamında ortancada (0,50) kalıyor.
Teknik sıralamada en üste çıkan kalemler, iş tarafında en alta düşebilir.

İkinci tablo bunun sayısal karşılığıdır. İki iş bağlamı karşılaştırıldığında **61 bulgunun hiçbiri
aynı sırada kalmıyor**, ortalama sıra kayması 22,23 ve en büyük kayma 43 sıradır. İlk on listeleri
**ortak tek bir bulgu içermiyor**. İkili karşılaştırmaların yüzde 41,6'sı ters dönüyor, yani iki
bulguyu alıp "hangisi daha önemli" diye sorduğunda iki bağlam neredeyse her iki soruda bir ayrı
yanıt veriyor.

Teknik sıralamanın iki bağlama uzaklığı ise eşit değil: gelir bağlamıyla ilk on listesinde 5, saha
bağlamıyla 2 ortak bulgu var; ters ikili oranı yüzde 31,3'e karşı yüzde 20,6. **Bağlamsız
sunulan bir sıralama bağlamsız değildir; sessizce bir bağlam seçmiştir** ve hangi bağlamı seçtiği
raporda yazmaz.

Bu, ağırlık tablosunun kim tarafından doldurulacağı sorusunu doğuruyor. Test ekibi teknik puanı
kendi ölçtüğü verilerden çıkarabilir, ama bir varlık sınıfının kurum için ne kadar değerli olduğunu
ölçemez; o sayı iş tarafından gelir. Buradan çıkan kural biçimseldir: rapor tek bir sıralanmış
liste değil, **teknik puan, varlık sınıfı ve ağırlık tablosu birlikte** verilmelidir. Ağırlıklar
yazılıysa sıralama yeniden üretilebilir; yazılı değilse liste, gerekçesi görünmeyen bir karardır.

Üçüncü tablo tek tek kalemleri gösteriyor. Bulgu 33, saha bağlamında **birinci** sırada duruyor;
teknik sıralamada 10., gelir bağlamında 38. sırada. Bulgu 6 saha bağlamında 4., gelir bağlamında
47. sırada — 43 sıralık bir fark. Bunlar bir puanlama hatası değil, iki farklı sorunun iki farklı
yanıtıdır.

#### Bütçe Altında Sıralamanın Bedeli

```js
// butce.mjs — sinirli duzeltme butcesi altinda hangi siralamanin ne kapattigi.
import { BULGU, BAGLAM, isPuan, sirala } from "./puan.mjs";

const BUTCE = 40;                                   // duzeltme butcesi (adam-gun, kurgu)
const ADLAR = Object.keys(BAGLAM);
const kayit = new Map(BULGU.map((b) => [b.no, b]));
const toplam = (ad) => BULGU.reduce((a, b) => a + isPuan(b, ad), 0);

// Butce bitene kadar siradan al; sigmayan bulgu atlanir.
function kuyruk(siraliNo) {
  const secilen = []; let gun = 0;
  for (const no of siraliNo) {
    const b = kayit.get(no);
    if (gun + b.gun <= BUTCE) { secilen.push(b); gun += b.gun; }
  }
  return { secilen, gun };
}

const YOL = [["teknik agirlik", sirala((b) => b.teknik)],
  ["gelir baglami", sirala((b) => isPuan(b, ADLAR[0]))],
  ["saha baglami", sirala((b) => isPuan(b, ADLAR[1]))],
  ["gelir verimi", sirala((b) => isPuan(b, ADLAR[0]) / b.gun)],
  ["saha verimi", sirala((b) => isPuan(b, ADLAR[1]) / b.gun)]];

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([17, 12, 7, 24, 22]);
console.log(`butce ${BUTCE} adam-gun; ${BULGU.length} bulgunun tamami ` +
  `${BULGU.reduce((a, b) => a + b.gun, 0)} adam-gun tutuyor`);
console.log(yz(["siralama", "duzeltilen", "gun", `${ADLAR[0]} %`, `${ADLAR[1]} %`]));
const sonuc = {};
for (const [ad, s] of YOL) {
  const { secilen, gun } = kuyruk(s);
  const kapanan = ADLAR.map((x) =>
    100 * secilen.reduce((a, b) => a + isPuan(b, x), 0) / toplam(x));
  sonuc[ad] = kapanan;
  console.log(yz([ad, secilen.length, gun, kapanan[0].toFixed(1), kapanan[1].toFixed(1)]));
}

// Yanlis eksende siralamanin bedeli: her baglamda kendi sirasi ile teknik siralama
// arasindaki kapanan is etkisi farki.
const y2 = gen([24, 14, 18, 14]);
console.log("\n" + y2(["baglam", "teknik ile", "kendi sirasi ile", "kayip puan"]));
for (const [i, ad] of ADLAR.entries()) {
  const t = sonuc["teknik agirlik"][i], k = sonuc[i === 0 ? "gelir baglami" : "saha baglami"][i];
  console.log(y2([ad, `${t.toFixed(1)}%`, `${k.toFixed(1)}%`, `${(k - t).toFixed(1)} puan`]));
}
const enUst = [sirala((b) => isPuan(b, ADLAR[0]))[0], sirala((b) => isPuan(b, ADLAR[1]))[0]];
const yerT = new Map(sirala((b) => b.teknik).map((no, i) => [no, i + 1]));
for (const [i, no] of enUst.entries()) {
  const b = kayit.get(no);
  console.log(`${ADLAR[i]} baglaminda birinci sirada olan bulgu ${no} (${b.varlik}, ` +
    `teknik ${b.teknik.toFixed(2)}) teknik siralamada ${yerT.get(no)}. sirada`);
}
```

```
butce 40 adam-gun; 61 bulgunun tamami 286 adam-gun tutuyor
siralama           duzeltilen    gun gelir ve abone verisi % saha kesintisizligi %
teknik agirlik             12     40                    27.0                  24.6
gelir baglami               9     40                    28.8                  14.1
saha baglami                9     40                    14.5                  28.8
gelir verimi               18     40                    40.8                  31.3
saha verimi                20     40                    33.9                  39.4

baglam                      teknik ile  kendi sirasi ile    kayip puan
gelir ve abone verisi            27.0%             28.8%      1.8 puan
saha kesintisizligi              24.6%             28.8%      4.2 puan
gelir ve abone verisi baglaminda birinci sirada olan bulgu 10 (abone verisi, teknik 9.57) teknik siralamada 1. sirada
saha kesintisizligi baglaminda birinci sirada olan bulgu 33 (saha operasyonu, teknik 7.50) teknik siralamada 10. sirada
```

Bütçe 61 bulgunun yalnız yedide birini karşılıyor ve tablo bu darlıkta sıralamanın ne kadar iş
yaptığını gösteriyor. İlk üç satır aynı 40 günü üç ayrı biçimde harcıyor. Saha bağlamı kendi
sırasıyla kendi etkisinin yüzde 28,8'ini kapatırken gelir sırasıyla yalnız yüzde 14,1'ini
kapatıyor: **yanlış eksenle sıralamak, aynı bütçeyi yarı verimle harcamak demektir.**

Teknik sıralamanın iki bağlama bedeli de eşit değil. Gelir bağlamında kendi sırasına göre 1,8
puan, saha bağlamında 4,2 puan geride kalıyor. Teknik ağırlık "yansız" görünür, ama yansızlığı bir
bağlama ötekinin iki buçuk katına yakın pahalıya patlıyor.

Son iki satır tek başına daha ilginçtir. İş puanını düzeltme gününe bölen sıralama aynı 40 günde
18 ve 20 bulgu kapatıyor ve **her iki bağlamda da öteki üç sıralamayı geçiyor** — gelir bağlamında
yüzde 40,8, saha bağlamında yüzde 39,4. Nedeni tabloda görünüyor: saf iş etkisiyle sıralamak
bütçeyi dokuz pahalı kaleme yatırıyor, maliyete bölmek ise aynı bütçeye iki katından fazla kalem
sığdırıyor. Bir raporun "kritik" etiketli ilk on kalemi, düzeltme maliyeti yazılmadığında bu
karşılaştırmayı olanaksız kılar.

Son iki satırın gösterdiği bir başka şey de sıralamaların hepsinin aynı yerde başlamadığıdır:
gelir bağlamının birinci kalemi teknik sıralamada da birincidir, saha bağlamının birinci kalemi
ise teknik sıralamada onuncudur. Rapor tek bir sıra dayattığında bu ikinci kalemin dokuz sıra
geride kalması bir karar değil, bir yan etkidir.

#### Özet

- Aynı 61 bulgu iki iş bağlamında puanlandığında aynı sırada kalan tek bulgu yok; ortalama sıra
  kayması 22,23, en büyük kayma 43 sıra ve ilk on listeleri ortak üye içermiyor.
- İkili karşılaştırmaların yüzde 41,6'sı iki bağlam arasında ters dönüyor; teknik sıralamanın
  bağlamlara uzaklığı ise eşit değil (5/10 ve 2/10 ortak), yani bağlamsız bir sıra sessizce bir
  bağlam seçmiştir.
- İş ağırlığı ile teknik puan ilişkili değildir: iç yönetim sınıfı 5,94 ile en yüksek ortalama
  teknik puana sahipken gelir bağlamında listenin en düşük ağırlığını taşıyor.
- 40 adam-günlük bütçede saha bağlamı kendi sırasıyla etkisinin yüzde 28,8'ini, gelir sırasıyla
  yüzde 14,1'ini kapatıyor; yanlış eksenle sıralamak aynı bütçeyi yarı verimle harcatıyor.
- Teknik sıralama gelir bağlamında 1,8, saha bağlamında 4,2 puan geride kalıyor: yansız görünen
  eksenin bedeli bağlama göre iki kat değişiyor.
- İş puanını düzeltme gününe bölen sıralama aynı bütçede 18–20 bulgu kapatıp her iki bağlamda da
  öteki sıralamaları geçiyor; düzeltme maliyeti yazılmayan bir liste bu karşılaştırmayı
  olanaksız kılar.

#### Sonraki Adım

Bulgular kanıtlandı ve iki ayrı eksende sıraya kondu. Sıradaki kalem ise bir düzeltme ekibine
gidecek ve o ekip bulguyu ilk kez okuyacak. Elde kanıt olması, o kanıtın karşı tarafta yeniden
görülebileceği anlamına gelmez: hangi ön koşulla, hangi girdiyle ve hangi ortamda gözlendiği
yazılmamışsa düzeltmenin doğrulanması da olanaksızdır. Sonraki ders raporu **yeniden
üretilebilirlik** cinsinden ölçer: kaç bulgu adım adım yeniden üretilebiliyor, kaçı ortama bağlı
kalıyor ve düzeltme önerisinin kaç kalemi doğrudan uygulanabilir durumda.

### Raporlama

Source: https://academia.sh/tr/kurslar/sizma-testi/raporlama

61 rapor kaydı yeniden üretilebilirlik cinsinden denetleniyor. Beş zorunlu alanın her biri ayrı ayrı yüksek oranda dolu olduğu halde beşinin birlikte dolu olma oranı yüzde 31,1; ikinci bir okuyucunun yeniden üretebildiği bulgu 8, yeniden test turunda kapandı denebilen bulgu 3. Eksik alanların yazılması 9,4 saat tutuyor ve kapandı denebilen bulguyu 49'a çıkarıyor; 12 bulgu ortam değişkeni taşıdığı için hiçbir durumda adım adım yeniden üretilemiyor. Düzeltme önerisi 29 bulguda doğrudan uygulanabilir, 22'sinde ayrı bir karar gerektiriyor, 10'unda hiç yok.

Bir önceki ders 61 kanıtı iki ayrı eksende sıraya koydu ve 40 adam-günlük bir düzeltme bütçesinin
neyi kapattığını ölçtü. Sıradaki adım bulgunun bir düzeltme ekibine gitmesidir ve o ekip bulguyu
ilk kez okuyacaktır. Test ekibinin elinde kanıt olması, o kanıtın karşı tarafta yeniden
görülebileceği anlamına gelmez.

Bu ders raporu tek bir ölçüyle sınar: **yeniden üretilebilirlik**. Bir bulgu, onu üretmemiş bir
kişi tarafından aynı sonuçla gözlenebiliyorsa yeniden üretilebilir; gözlenemiyorsa düzeltmenin
işe yarayıp yaramadığı da hiçbir zaman doğrulanamaz. **Yeniden üretim adımları** (reproduction
steps) bu yüzden bir anlatı değil, bir rapor kalemidir. Bu derste hiçbir örnek adım yazılmaz;
ölçülen şey adımın **hangi bilgileri taşıması gerektiği** ve o bilgilerin kaç kayıtta gerçekten
bulunduğudur.

- **TS25.** Rapor kümesi önceki dersin 61 bulgusudur. Kayıtlar **kurgudur** ve hiçbir saldırı
  adımı içermez; sayılan şey alan adlarıdır.
- **TS26.** Sekiz alan tanımlıdır: ön koşul, girdi tanımı, gözlenen sonuç, zaman damgası, kanıt
  kimliği, ortam bilgisi, beklenen davranış ve düzeltme önerisi.
- **TS27.** İlk beş alan yeniden üretim için **zorunludur**. Kalan üçü kaydı tamamlar ama adım
  kümesinin kendisine girmez.
- **TS28.** Bir kayıt **ortam değişkeni** taşıyabilir: ortam bilgisi yazılı olsa bile değeri
  koşumdan koşuma değişir. Bu kayıtlar adım adım yeniden üretilemez.
- **TS29.** İkinci bir okuyucu bir bulguyu ancak adım kümesi tamsa, ortam bilgisi yazılıysa ve
  ortam değişkeni yoksa yeniden üretebilir.
- **TS30.** Bir bulgu, yeniden test turunda ancak yeniden üretilebiliyorsa **ve** beklenen
  davranışı yazılıysa "kapandı" denebilir. Alan yazım süreleri kurgudur.

#### Alan Denetimi

```js
// rapor.mjs — rapor kayitlarinin yeniden uretilebilirlik denetimi.
// MODELDIR; kayitlar kurgudur ve hicbir saldiri adimi icermez, yalnizca
// bir adimin tasimasi gereken ALAN ADLARI sayilir.
export const TOHUM = 20260519, N = 61;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Yeniden uretim adimi bir rapor kalemidir. Alanlar, adimin tasimasi gereken
// bilgilerdir; doluluk orani kurgudur ve alan zorlugunu yansitir.
export const ALAN = [
  { ad: "onkosul", doluluk: 0.82, zorunlu: true, dakika: 4 },
  { ad: "girdi tanimi", doluluk: 0.74, zorunlu: true, dakika: 6 },
  { ad: "gozlenen sonuc", doluluk: 0.91, zorunlu: true, dakika: 5 },
  { ad: "zaman damgasi", doluluk: 0.88, zorunlu: true, dakika: 1 },
  { ad: "kanit kimligi", doluluk: 0.63, zorunlu: true, dakika: 3 },
  { ad: "ortam bilgisi", doluluk: 0.57, zorunlu: false, dakika: 4 },
  { ad: "beklenen davranis", doluluk: 0.49, zorunlu: false, dakika: 7 },
  { ad: "duzeltme onerisi", doluluk: 0.86, zorunlu: false, dakika: 12 },
];
// Duzeltme onerisi sinifi: dogrudan uygulanabilir, karar gerektiren, yapisal.
const ONERI = [["dogrudan", 0.41], ["karar gerektiren", 0.34], ["yapisal", 0.25]];
const oneriSec = (u) => { let t = 0;
  for (const [ad, p] of ONERI) { t += p; if (u < t) return ad; } return ONERI.at(-1)[0]; };

export const KAYIT = Array.from({ length: N }, (_, i) => {
  const dolu = {};
  for (const a of ALAN) dolu[a.ad] = r() < a.doluluk;
  return { no: i + 1, dolu, oneri: dolu["duzeltme onerisi"] ? oneriSec(r()) : "yok",
    // Ortama bagli: kayit ortam bilgisi tasisa bile degeri kosumdan kosuma degisiyor.
    degisken: r() < 0.23 };
});

const ZORUNLU = ALAN.filter((a) => a.zorunlu).map((a) => a.ad);
export const tamAdim = (k) => ZORUNLU.every((ad) => k.dolu[ad]);
// Ikinci bir okuyucu bulguyu ancak adim kumesi tamsa, ortam bilgisi varsa ve
// ortam degiskeni yoksa yeniden uretebilir.
export const yenidenUretilir = (k) => tamAdim(k) && k.dolu["ortam bilgisi"] && !k.degisken;

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([20, 10, 9, 10, 16, 12]);
  console.log(`model (tohum ${TOHUM}): ${N} rapor kaydi, ${ALAN.length} alan, ` +
    `${ZORUNLU.length} tanesi yeniden uretim icin zorunlu`);
  console.log("\n" + yz(["alan", "zorunlu", "dolu", "eksik", "tek eksik olan", "dk/bulgu"]));
  for (const a of ALAN) {
    const dolu = KAYIT.filter((k) => k.dolu[a.ad]).length;
    // Tek eksik olan: bu alan dolsaydi kayit adim kumesini tamamlayacak olanlar.
    const tek = KAYIT.filter((k) => !k.dolu[a.ad] && a.zorunlu &&
      ZORUNLU.filter((z) => !k.dolu[z]).length === 1).length;
    console.log(yz([a.ad, a.zorunlu ? "evet" : "hayir", dolu, N - dolu, tek, a.dakika]));
  }

  const tam = KAYIT.filter(tamAdim), uretilir = KAYIT.filter(yenidenUretilir);
  const ortamsiz = tam.filter((k) => !k.dolu["ortam bilgisi"]).length;
  const degisken = tam.filter((k) => k.dolu["ortam bilgisi"] && k.degisken).length;
  const y2 = gen([34, 9, 9]);
  console.log("\n" + y2(["kayit sinifi", "bulgu", "yuzde"]));
  for (const [ad, s] of [["adim kumesi tam", tam.length],
    ["adim eksik", N - tam.length],
    ["tam ama ortam bilgisi yok", ortamsiz],
    ["tam, ortam yazili, degeri degisken", degisken],
    ["ikinci okuyucu yeniden uretebilir", uretilir.length]]) {
    console.log(y2([ad, s, `${(100 * s / N).toFixed(1)}`]));
  }
  const eksikSay = ZORUNLU.map((z) => [z, KAYIT.filter((k) => !k.dolu[z]).length])
    .sort((a, b) => b[1] - a[1])[0];
  console.log(`\nen cok eksik kalan zorunlu alan "${eksikSay[0]}" ` +
    `(${eksikSay[1]} kayitta yok); kayit basina tam alan yazimi ` +
    `${ALAN.reduce((a, x) => a + x.dakika, 0)} dakika tutuyor`);
}
```

```
model (tohum 20260519): 61 rapor kaydi, 8 alan, 5 tanesi yeniden uretim icin zorunlu

alan                   zorunlu     dolu     eksik  tek eksik olan    dk/bulgu
onkosul                   evet       55         6               1           4
girdi tanimi              evet       41        20               9           6
gozlenen sonuc            evet       56         5               2           5
zaman damgasi             evet       54         7               1           1
kanit kimligi             evet       36        25              11           3
ortam bilgisi            hayir       37        24               0           4
beklenen davranis        hayir       30        31               0           7
duzeltme onerisi         hayir       51        10               0          12

kayit sinifi                          bulgu    yuzde
adim kumesi tam                          19     31.1
adim eksik                               42     68.9
tam ama ortam bilgisi yok                 7     11.5
tam, ortam yazili, degeri degisken        4      6.6
ikinci okuyucu yeniden uretebilir         8     13.1

en cok eksik kalan zorunlu alan "kanit kimligi" (25 kayitta yok); kayit basina tam alan yazimi 42 dakika tutuyor
```

İlk tabloya alan alan bakıldığında rapor iyi görünüyor: gözlenen sonuç 61 kayıttan 56'sında,
ön koşul 55'inde, zaman damgası 54'ünde yazılı. Tek tek hiçbir alan felaket değildir. İkinci tablo
ise **beş zorunlu alanın birlikte dolu olduğu kayıt sayısını 19'da**, yani yüzde 31,1'de
bırakıyor. Bağımsız eksiklikler toplanmaz, çarpılır: her alanı ayrı ayrı yüksek oranda dolduran
bir ekip, birleşik ölçüde yine de üçte bir düzeyinde kalabilir. Rapor niteliği alan başına değil,
**kayıt başına** ölçülmelidir.

"Tek eksik olan" sütunu en ucuz kazancın nerede olduğunu söylüyor. Kanıt kimliği 11 kayıtta tek
başına eksik olan alandır: yalnız o alan doldurulduğunda adım kümesi tam olan kayıt 19'dan 30'a
çıkar. Alanın maliyeti kayıt başına 3 dakikadır ve eksik olduğu 25 kayıt için 75 dakika tutar —
yüzde elli yedilik bir artış, bir buçuk saatin altında bir işle. Girdi tanımı 9 kayıtta tek
eksiktir ve eksik olduğu 20 kayıt 120 dakika tutar. Sütunun boş kalması da bilgi taşıyor: ortam
bilgisi, beklenen davranış ve düzeltme önerisi hiçbir kayıtta tek eksik değildir, çünkü zorunlu
alan kümesine girmezler ve adım kümesini tek başlarına tamamlayamazlar.

Üçüncü sayı asıl uyarıdır. Adım kümesi tam olan 19 kayıttan yalnız **8'i** ikinci bir okuyucu
tarafından yeniden üretilebiliyor. Kalanların 7'sinde ortam bilgisi hiç yazılmamış, 4'ünde ortam
yazılı ama değeri koşumdan koşuma değişiyor. Yeniden üretilebilirlik, adımların yazılmış olmasıyla
bitmiyor; adımların **aynı koşullarda** yürütülebilir olmasını da gerektiriyor.

#### Tamamlamanın Bedeli ve Yeniden Test

```js
// kapanis.mjs — eksik alanlari tamamlamanin bedeli ve yeniden test turunda
// kac bulgunun "kapandi" denebildigi.
import { KAYIT, ALAN, tamAdim, yenidenUretilir } from "./rapor.mjs";

const N = KAYIT.length;
const dk = (ad) => ALAN.find((a) => a.ad === ad).dakika;
const ZORUNLU = ALAN.filter((a) => a.zorunlu).map((a) => a.ad);
const eksikDakika = (alanlar) => KAYIT.reduce((a, k) =>
  a + alanlar.filter((ad) => !k.dolu[ad]).reduce((s, ad) => s + dk(ad), 0), 0);

// Bir bulgu ancak yeniden uretilebiliyorsa ve beklenen davranisi yaziliysa
// yeniden test turunda "kapandi" denebilir.
const kapanir = (k) => yenidenUretilir(k) && k.dolu["beklenen davranis"];
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([28, 12, 11, 18, 16]);

const ADIMLAR = [
  ["bugunku rapor", [], (k) => yenidenUretilir(k), kapanir],
  ["zorunlu alanlar tamamlanir", ZORUNLU,
    (k) => k.dolu["ortam bilgisi"] && !k.degisken,
    (k) => k.dolu["ortam bilgisi"] && !k.degisken && k.dolu["beklenen davranis"]],
  ["ortam bilgisi de yazilir", [...ZORUNLU, "ortam bilgisi"],
    (k) => !k.degisken, (k) => !k.degisken && k.dolu["beklenen davranis"]],
  ["beklenen davranis da yazilir", [...ZORUNLU, "ortam bilgisi", "beklenen davranis"],
    (k) => !k.degisken, (k) => !k.degisken],
];
console.log(`${N} bulgu; eksik alan yazimi kayit basina alan suresi kadar ek yuk getiriyor`);
console.log(yz(["tamamlama adimi", "ek dakika", "ek saat", "yeniden uretilir", "kapandi denir"]));
for (const [ad, alanlar, u, kap] of ADIMLAR) {
  const d = eksikDakika(alanlar);
  console.log(yz([ad, d, (d / 60).toFixed(1), KAYIT.filter(u).length, KAYIT.filter(kap).length]));
}
const degisken = KAYIT.filter((k) => k.degisken).length;
console.log(`butun alanlar yazilsa bile ${degisken} bulgu ortam degiskeni tasidigi icin ` +
  `adim adim yeniden uretilemiyor; bunlar icin kanit kaydinin kendisi tek dayanaktir`);

// Duzeltme onerisi sinifi: kac kalem dogrudan uygulanabilir.
const SINIF = ["dogrudan", "karar gerektiren", "yapisal", "yok"];
const y2 = gen([20, 9, 18, 16, 18]);
console.log("\n" + y2(["oneri sinifi", "bulgu", "yeniden uretilir", "kapandi denir",
  "ek karar gerekir"]));
for (const s of SINIF) {
  const l = KAYIT.filter((k) => k.oneri === s);
  console.log(y2([s, l.length, l.filter(yenidenUretilir).length, l.filter(kapanir).length,
    s === "dogrudan" || s === "yok" ? 0 : l.length]));
}
console.log(`\n${N} bulgunun ${KAYIT.filter((k) => k.oneri === "dogrudan").length}'inde oneri ` +
  `dogrudan uygulanabilir; ${KAYIT.filter((k) => k.oneri === "karar gerektiren" ||
  k.oneri === "yapisal").length}'i duzeltmeden once ayri bir karar gerektiriyor, ` +
  `${KAYIT.filter((k) => k.oneri === "yok").length}'inde oneri hic yok`);
console.log(`yeniden test turunda kapandi denebilecek bulgu ${KAYIT.filter(kapanir).length}; ` +
  `adim kumesi tam olan ${KAYIT.filter(tamAdim).length} bulgunun bile bir bolumu bu esigi ` +
  `gecmiyor`);
```

```
61 bulgu; eksik alan yazimi kayit basina alan suresi kadar ek yuk getiriyor
tamamlama adimi                ek dakika    ek saat  yeniden uretilir   kapandi denir
bugunku rapor                          0        0.0                 8               3
zorunlu alanlar tamamlanir           251        4.2                27              14
ortam bilgisi de yazilir             347        5.8                49              25
beklenen davranis da yazilir         564        9.4                49              49
butun alanlar yazilsa bile 12 bulgu ortam degiskeni tasidigi icin adim adim yeniden uretilemiyor; bunlar icin kanit kaydinin kendisi tek dayanaktir

oneri sinifi            bulgu  yeniden uretilir   kapandi denir  ek karar gerekir
dogrudan                   29                 5               1                 0
karar gerektiren           12                 1               1                12
yapisal                    10                 1               1                10
yok                        10                 1               0                 0

61 bulgunun 29'inde oneri dogrudan uygulanabilir; 22'i duzeltmeden once ayri bir karar gerektiriyor, 10'inde oneri hic yok
yeniden test turunda kapandi denebilecek bulgu 3; adim kumesi tam olan 19 bulgunun bile bir bolumu bu esigi gecmiyor
```

İlk satır bu kursun en keskin sayısını veriyor: bugünkü rapordaki **61 bulgunun 3'ü** yeniden test
turunda kapandı denebilir durumdadır. Kalan 58 bulgu için düzeltme uygulandıktan sonra "işe yaradı
mı" sorusuna yanıt verecek bir dayanak yoktur; düzeltme yapılır, kaynak harcanır ve sonuç
ölçülemez.

Merdivenin geri kalanı bu boşluğun fiyatını yazıyor. Zorunlu alanları tamamlamak 251 dakika, yani
4,2 saat tutuyor ve kapandı denebilen bulguyu 14'e çıkarıyor. Ortam bilgisi de yazıldığında toplam
5,8 saatte 25 bulguya, beklenen davranış da yazıldığında 9,4 saatte **49 bulguya** ulaşılıyor.
Önceki dersin düzeltme bütçesi 40 adam-gündü; 9,4 saat, o bütçenin yaklaşık yüzde üçüdür. Rapor
yazımı bir ek yük olarak görüldüğünde kesilen ilk kalem olur, oysa kesilen şey düzeltme
bütçesinin ölçülebilirliğidir.

12 bulgu bu merdivenin dışında kalıyor. Bunlarda ortam değişkeni vardır ve bütün alanlar yazılsa
bile adım adım yeniden üretim aynı sonucu vermez. Bu kayıtlar için tek dayanak, gözlem anında
alınmış **kanıt kaydının kendisidir**: hangi kimlikle saklandığı, ne zaman alındığı ve
bütünlüğünün nasıl gösterildiği. Yeniden üretilemeyen bir bulgu rapordan silinmez; "ortama bağlı"
etiketiyle ve kanıt kimliğiyle durur. Bu, kanıt kimliği alanının niçin en ucuz alanlardan biri
olduğu halde en çok eksik kalan zorunlu alan olmasını da açıklıyor: yazması üç dakika sürer, ama
yazılmadığında hem adım kümesini bozar hem de ortama bağlı bulguların tek dayanağını ortadan
kaldırır. Kayıtta yalnız bir kimlik dizesi durur; o kimliğin gösterdiği kanıtın nerede saklandığı
ve nasıl doğrulanacağı ayrı bir kalemdir.

İkinci tablo iki ekseni birbirinden ayırıyor. Düzeltme önerisi 29 bulguda doğrudan uygulanabilir
durumdadır, ama bu 29'un yalnız 5'i yeniden üretilebiliyor ve yalnız 1'i kapandı denebiliyor.
**Öneri niteliği ile kanıt niteliği bağımsız iki eksendir**: iyi yazılmış bir öneri, doğrulanamayan
bir bulguya bağlıysa uygulanır ama sonucu ölçülemez. Ters durum da vardır — 10 bulguda hiç öneri
yoktur ve bunlar düzeltme kuyruğuna girdiklerinde ilk adımda durur.

Kalan 22 bulgu düzeltmeden önce ayrı bir karar gerektiriyor: 12'sinde öneri bir seçim sunuyor,
10'unda yapısal bir değişiklik gerekiyor. Bu ayrımın raporda yazılı olması, düzeltme ekibinin
kuyruğu doğru sıralaması için gereklidir; "karar gerektiren" bir kalem, doğrudan uygulanabilir bir
kalemle aynı sprint içine konamaz.

#### Özet

- Beş zorunlu alanın her biri ayrı ayrı yüksek oranda dolu olduğu halde beşi birlikte yalnız 19
  kayıtta, yani yüzde 31,1'inde dolu: bağımsız eksiklikler toplanmaz, çarpılır.
- Kanıt kimliği 11 kayıtta tek eksik olan alandır ve tamamlandığında adım kümesi tam olan kayıt
  19'dan 30'a çıkar; maliyeti 25 eksik kayıt için 75 dakikadır.
- Adım kümesi tam olan 19 kayıttan yalnız 8'i ikinci bir okuyucu tarafından yeniden
  üretilebiliyor; 7'sinde ortam bilgisi yok, 4'ünde ortam yazılı ama değeri değişken.
- Bugünkü raporda 61 bulgunun 3'ü yeniden test turunda kapandı denebilir; eksik alanların yazımı
  9,4 saat tutuyor ve bu sayıyı 49'a çıkarıyor — düzeltme bütçesinin yaklaşık yüzde üçü.
- 12 bulgu ortam değişkeni taşıdığı için hiçbir durumda adım adım yeniden üretilemiyor; bunlar
  için tek dayanak kanıt kaydının kimliği, zamanı ve bütünlüğüdür.
- Öneri niteliği ile kanıt niteliği bağımsızdır: doğrudan uygulanabilir öneri taşıyan 29 bulgunun
  yalnız 1'i kapandı denebiliyor, 22 bulgu ise düzeltmeden önce ayrı bir karar gerektiriyor.

#### Sonraki Adım

Rapor yazıldı ve hangi bulgunun doğrulanabilir olduğu sayıldı. Bütün bu ölçüm tek bir varsayıma
dayanıyordu: raporun gideceği yer bellidir ve orada bir düzeltme ekibi vardır. Bulgu kurumun kendi
sözleşmeli değerlendirmesinden değil de dışarıdan geldiğinde bu varsayım düşer. O zaman kime,
hangi kanaldan ve ne kadar süre içinde bildirileceği; düzeltmenin ne kadar bekleneceği ve
bulgunun ne zaman yayımlanabileceği ayrı bir sürecin konusu olur. Sonraki ders sorumlu açıklamayı
süre ve adım olarak ölçer ve kursu kapatır.

### Sorumlu Açıklama

Source: https://academia.sh/tr/kurslar/sizma-testi/sorumlu-aciklama

Bildirimden yayına giden süre altı aşamada ölçülüyor: tek tarafı ilgilendiren bulgu ortalama 12,7 günde, dört tarafı ilgilendiren 96,0 günde kapanıyor ve en uzun aşama düzeltmedir. Üç yayın politikası karşılaştırıldığında sabit 90 günlük pencere 13 bulguyu düzeltilmeden yayımlıyor, düzeltmeye bağlı pencere hiçbirini yayımlamıyor ama en geç yayını 226. güne itiyor, uzatmalı pencere 3'te kalıyor. Ders kursu kapatır ve on sekiz dersin aday, kanıt ve iz sayılarını tek tabloda toplar.

Bir önceki ders raporu yeniden üretilebilirlik cinsinden ölçtü ve tek bir varsayıma dayandı:
raporun gideceği yer bellidir, orada bir düzeltme ekibi vardır ve o ekip bulguyu bekliyordur.
Sözleşmeli bir değerlendirmede bu varsayım tutar. Bulgu dışarıdan geldiğinde — bağımsız bir
araştırmadan, bir üçüncü taraf bileşeninde görülen bir kalemden — düşer.

**Sorumlu açıklama** (responsible disclosure), o durumda kime, hangi kanaldan, ne kadar süre içinde
bildirileceğini ve bulgunun ne zaman yayımlanabileceğini belirleyen süreçtir. Bu ders onu iki sayı
cinsinden ölçer: **kaç gün** ve **kaç taraf**. Ölçüm bir modeldir ve bütün süreler kurgudur;
gerçek bir kurum, gerçek bir bileşen ya da gerçek bir açık kimliği yazılmaz.

- **TS31.** Bulgu kümesi önceki dersin 61 kaydıdır. Her bulgu dört bildirim sınıfından birine
  düşer ve sınıf, sürece giren taraf sayısını belirler.
- **TS32.** Süreç altı aşamadır: bildirim kanalının bulunması, alındı onayı, teknik doğrulama,
  düzeltme, dağıtım ve doğrulama turu. Süreler gün cinsindendir.
- **TS33.** Düzeltme süresi sınıf tabanından 0,6 ile 1,6 kat arasında sapar; bulguların bir
  bölümünde düzeltme **takılır** ve süre dört katına çıkar.
- **TS34.** **Hazır günü**, düzeltmenin dağıtılıp doğrulandığı gündür. Düzeltmenin yazılmış
  olması ile uygulanmış olması ayrı iki tarihtir.
- **TS35.** Üç yayın politikası karşılaştırılır: bildirimden 90 gün sonra sabit yayın; düzeltme
  hazır olduktan 14 gün sonra yayın; 90 gün ama düzeltme sürüyorsa bir kez 30 gün uzatma.
- **TS36.** Bir bulgu, yayın gününde hazır değilse **düzeltilmeden yayımlanmış** sayılır ve
  aradaki gün sayısı yayın sonrası açık kalan süredir.

#### Bildirimden Yayına

```js
// aciklama.mjs — sorumlu aciklama sureci: bildirimden yayina kac gun, kac taraf.
// MODELDIR; bulgu kumesi, sureler ve taraflar kurgudur.
export const TOHUM = 20260714, N = 61;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Asamalar: bildirim kanalinin bulunmasindan yayina kadar. Sureler gun cinsinden
// ve sinifa gore degisir; her sinif ayri sayida tarafi ilgilendirir.
export const ASAMA = ["kanal bulma", "alindi onayi", "teknik dogrulama", "duzeltme",
  "dagitim", "dogrulama turu"];
const KISA = ["kanal", "onay", "inceleme", "duzeltme", "dagitim", "tur"];
export const SINIF = [
  { ad: "kurum yapilandirmasi", pay: 0.34, taraf: ["kurum"], gun: [1, 1, 2, 3, 2, 2] },
  { ad: "kurum yazilimi", pay: 0.28, taraf: ["kurum", "gelistirme ekibi"],
    gun: [1, 2, 4, 14, 7, 3] },
  { ad: "ucuncu taraf bilesen", pay: 0.23,
    taraf: ["kurum", "gelistirme ekibi", "bilesen saglayicisi"], gun: [5, 7, 10, 45, 21, 5] },
  { ad: "paylasilan altyapi", pay: 0.15,
    taraf: ["kurum", "gelistirme ekibi", "altyapi isleticisi", "duzenleyici"],
    gun: [3, 5, 8, 30, 30, 7] },
];
const sinifSec = (u) => { let t = 0;
  for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); };

// Her bulgu bir sinifa duser; duzeltme suresi sinif tabanindan sapar, bir bolumunde takilir.
export const BULGU = Array.from({ length: N }, (_, i) => {
  const s = sinifSec(r()), carpan = 0.6 + r(), takilan = r() < 0.12;
  const gun = s.gun.map((g, j) => (j === 3 ? Math.round(g * carpan * (takilan ? 4 : 1)) : g));
  return { no: i + 1, sinif: s.ad, taraf: s.taraf, gun, takilan,
    hazir: gun.reduce((a, g) => a + g, 0) };
});

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([22, 7, 8, 7, 10, 10, 9, 6, 10, 7]);
  console.log(`model (tohum ${TOHUM}): ${N} bulgu, ${SINIF.length} bildirim sinifi`);
  console.log("\n" + yz(["bulgu sinifi", "bulgu", ...KISA, "ort gun", "taraf"]));
  for (const s of SINIF) {
    const l = BULGU.filter((b) => b.sinif === s.ad);
    const ort = l.reduce((a, b) => a + b.hazir, 0) / l.length;
    console.log(yz([s.ad, l.length, ...s.gun, ort.toFixed(1), s.taraf.length]));
  }
  const taraflar = new Set(SINIF.flatMap((s) => s.taraf));
  const enUzun = ASAMA.map((a, j) => [a, SINIF.reduce((x, s) => x + s.gun[j], 0)])
    .sort((a, b) => b[1] - a[1])[0];
  console.log(`\ndort sinif toplam ${taraflar.size} ayri tarafi ilgilendiriyor; ` +
    `en uzun asama "${enUzun[0]}" (dort sinifta toplam ${enUzun[1]} gun)`);
  const dagitim = SINIF.reduce((a, s) => a + s.gun[4], 0);
  console.log(`duzeltme yazildiktan sonra dagitim tek basina ${dagitim} gun tutuyor: ` +
    `duzeltmenin var olmasi ile uygulanmis olmasi ayri iki tarihtir`);
}
```

```
model (tohum 20260714): 61 bulgu, 4 bildirim sinifi

bulgu sinifi            bulgu   kanal   onay  inceleme  duzeltme  dagitim   tur   ort gun  taraf
kurum yapilandirmasi       26       1      1         2         3        2     2      12.7      1
kurum yazilimi             15       1      2         4        14        7     3      40.3      2
ucuncu taraf bilesen       11       5      7        10        45       21     5     113.2      3
paylasilan altyapi          9       3      5         8        30       30     7      96.0      4

dort sinif toplam 5 ayri tarafi ilgilendiriyor; en uzun asama "duzeltme" (dort sinifta toplam 92 gun)
duzeltme yazildiktan sonra dagitim tek basina 60 gun tutuyor: duzeltmenin var olmasi ile uygulanmis olmasi ayri iki tarihtir
```

Son iki sütun bir arada okunduğunda ilişki tek yönlü değildir ama uçlar açıktır: ortalama süre
12,7 günden 113,2 güne, yani dokuz kata yakın büyüyor; yalnız dört taraflı sınıf 96,0 günle üç
taraflının altında kalıyor. Tek tarafı ilgilendiren bir yapılandırma bulgusu 12,7 günde, üç tarafı
ilgilendiren bir bileşen bulgusu 113,2 günde kapanıyor. Kaynağı yalnız düzeltme değildir: kanal
bulma 1 günden 5 güne, alındı onayı 1 günden 7 güne çıkıyor, çünkü her yeni taraf kendi bildirim
kanalını, onayını ve teknik incelemesini ekliyor.

En uzun aşama düzeltmedir ve dört sınıfta 92 gün tutar. Ama tek başına düzeltmeye bakmak
yanıltıcıdır: **dağıtım tek başına 60 gün tutuyor.** Bir düzeltmenin yazılmış olması ile
uygulanmış olması ayrı iki tarihtir ve arada açık hâlâ açıktır. Paylaşılan altyapı sınıfında
dağıtım düzeltmeyle eşit süre tutuyor, çünkü değişiklik tek bir yerde değil, işletilen bütün
kalemlerde uygulanmak zorundadır.

Kanal bulma aşaması küçüktür ama bir şey söyler: bildirimi yapacak kişi önce **kime
bildireceğini** aramak zorundadır. Yayımlanmış bir bildirim adresi olmayan kurum, kendi düzeltme
süresine baştan gün ekler.

#### Yayın Penceresi ve Taraf Sayısı

```js
// yayin.mjs — yayin politikasi: sabit pencere, duzeltmeye bagli pencere, uzatmali pencere.
import { BULGU, SINIF } from "./aciklama.mjs";

const N = BULGU.length, PENCERE = 90, UZATMA = 30, BEKLEME = 14;
// Her politika bir bulgu icin yayin gunu dondurur.
const POLITIKA = [
  ["sabit pencere", () => PENCERE],
  ["duzeltmeye bagli", (b) => b.hazir + BEKLEME],
  ["uzatmali pencere", (b) => (b.hazir <= PENCERE ? PENCERE : PENCERE + UZATMA)],
];
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([20, 11, 11, 13, 16, 20]);
console.log(`${N} bulgu; pencere ${PENCERE} gun, uzatma ${UZATMA} gun, ` +
  `duzeltme sonrasi bekleme ${BEKLEME} gun (kurgu)`);
console.log(yz(["politika", "ort yayin", "en gec", "duzeltilmis", "duzeltilmeden",
  "yayin sonrasi acik"]));
for (const [ad, f] of POLITIKA) {
  const gun = BULGU.map(f), duzeltilmis = BULGU.filter((b) => b.hazir <= f(b)).length;
  console.log(yz([ad, (gun.reduce((a, g) => a + g, 0) / N).toFixed(1), Math.max(...gun),
    duzeltilmis, N - duzeltilmis,
    (BULGU.reduce((a, b) => a + Math.max(0, b.hazir - f(b)), 0) / N).toFixed(1)]));
}

// Taraf sayisi ile pencereyi asma arasindaki iliski.
const y2 = gen([22, 8, 10, 14, 16, 14]);
console.log("\n" + y2(["bulgu sinifi", "taraf", "bulgu", "90 gunu asan", "120 gunu asan",
  "takilan"]));
for (const s of SINIF) {
  const l = BULGU.filter((b) => b.sinif === s.ad);
  console.log(y2([s.ad, s.taraf.length, l.length, l.filter((b) => b.hazir > PENCERE).length,
    l.filter((b) => b.hazir > PENCERE + UZATMA).length, l.filter((b) => b.takilan).length]));
}
const asan = BULGU.filter((b) => b.hazir > PENCERE);
const cokTaraf = BULGU.filter((b) => b.taraf.length >= 3);
console.log(`\n${N} bulgunun ${asan.length}'i ${PENCERE} gunluk pencereyi asiyor; ` +
  `bunlarin ${asan.filter((b) => b.taraf.length >= 3).length}'i uc ya da daha cok tarafi ` +
  `ilgilendiren siniflardan geliyor`);
console.log(`uc ve daha cok tarafli ${cokTaraf.length} bulgunun ` +
  `${(100 * cokTaraf.filter((b) => b.hazir > PENCERE).length / cokTaraf.length).toFixed(1)}%'i ` +
  `pencereyi asiyor; tek tarafli ${BULGU.filter((b) => b.taraf.length === 1).length} bulgunun ` +
  `${BULGU.filter((b) => b.taraf.length === 1 && b.hazir > PENCERE).length}'i asiyor`);
const takilan = BULGU.filter((b) => b.takilan);
console.log(`duzeltmesi takilan ${takilan.length} bulgu, duzeltmeye bagli politikada ortalama ` +
  `${(takilan.reduce((a, b) => a + b.hazir + BEKLEME, 0) / takilan.length).toFixed(1)} gun ` +
  `yayimlanmadan bekliyor; sabit pencerede ${PENCERE}. gun yayimlanir`);
```

```
61 bulgu; pencere 90 gun, uzatma 30 gun, duzeltme sonrasi bekleme 14 gun (kurgu)
politika              ort yayin     en gec  duzeltilmis   duzeltilmeden  yayin sonrasi acik
sabit pencere              90.0         90           48              13                 5.9
duzeltmeye bagli           63.9        226           61               0                 0.0
uzatmali pencere           96.4        120           58               3                 3.1

bulgu sinifi             taraf     bulgu  90 gunu asan   120 gunu asan       takilan
kurum yapilandirmasi         1        26             0               0             3
kurum yazilimi               2        15             0               0             3
ucuncu taraf bilesen         3        11             9               2             2
paylasilan altyapi           4         9             4               1             1

61 bulgunun 13'i 90 gunluk pencereyi asiyor; bunlarin 13'i uc ya da daha cok tarafi ilgilendiren siniflardan geliyor
uc ve daha cok tarafli 20 bulgunun 65.0%'i pencereyi asiyor; tek tarafli 26 bulgunun 0'i asiyor
duzeltmesi takilan 9 bulgu, duzeltmeye bagli politikada ortalama 106.9 gun yayimlanmadan bekliyor; sabit pencerede 90. gun yayimlanir
```

Üç politika üç ayrı şeyi koruyor ve hiçbiri ötekini kapsamıyor. Sabit pencere kesin bir tarih
verir ve kurumu süreye bağlar, ama 13 bulguyu düzeltilmeden yayımlar ve bunlar ortalama 5,9 gün
boyunca hem açık hem herkese açıktır. Düzeltmeye bağlı pencere hiçbir bulguyu düzeltilmeden
yayımlamaz; ortalama yayın günü 63,9 ile en erkendir, çünkü bulguların çoğu hızlı kapanır. Bedeli
son sütunda değil "en geç" sütunundadır: **226. gün.** Düzeltme takıldığında yayın süresiz
ertelenebilir ve kararı bildirimi alan taraf verir.

Uzatmalı pencere ikisinin arasındadır: düzeltilmeden yayımlananı 13'ten 3'e, yayın sonrası açık
süreyi 5,9 günden 3,1 güne indirirken en geç yayını 120 günde tutar. Kazandığı kesin bir üst
sınırdır; eklediği, uzatmanın ne zaman verileceği kararıdır.

İkinci tablo pencereyi kimin aştığını gösteriyor ve sonuç tek bir eksende toplanıyor: **90 günü
aşan 13 bulgunun 13'ü de üç ya da daha çok tarafı ilgilendiren sınıflardandır.** Tek tarafı
ilgilendiren 26 bulgunun hiçbiri pencereyi aşmıyor; üç ve daha çok taraflı 20 bulgunun yüzde
65,0'i aşıyor. Süreyi belirleyen şey açığın teknik ağırlığı değil, kaç kurumun aynı takvimde
buluşması gerektiğidir. Düzeltmesi takılan 9 bulgu bu tabloya dağılmış durumdadır ve düzeltmeye
bağlı politikada ortalama 106,9 gün yayımlanmadan bekler.

Buradan pratik bir kural çıkıyor: pencere tek bir sayı olarak yazılamaz. Taraf sayısı bildirimin
ilk gününde bilinir ve pencere uzunluğu o sayıya bağlanabilir. Tek taraflı bir bulgu için 90 gün
fazlasıyla yeterlidir; dört taraflı bir bulgu için aynı 90 gün, koordinasyon tamamlanmadan yayın
demektir.

#### Özet

- Bildirimden hazır olma gününe kadar geçen süre taraf sayısına bağlıdır: tek taraflı bulgu
  ortalama 12,7 gün, iki taraflı 40,3 gün, üç taraflı 113,2 gün, dört taraflı 96,0 gün tutuyor.
- Artış yalnız düzeltmeden gelmiyor; kanal bulma 1 günden 5 güne, alındı onayı 1 günden 7 güne
  çıkıyor, çünkü her taraf kendi kanalını, onayını ve incelemesini ekliyor.
- Dağıtım dört sınıfta toplam 60 gün tutuyor: düzeltmenin yazılmış olması ile uygulanmış olması
  ayrı iki tarihtir ve arada açık hâlâ açıktır.
- Sabit 90 günlük pencere 13 bulguyu düzeltilmeden yayımlıyor ve ortalama 5,9 gün açık bırakıyor;
  düzeltmeye bağlı pencere hiçbirini yayımlamıyor ama en geç yayını 226. güne itiyor.
- Uzatmalı pencere düzeltilmeden yayımlananı 3'e, açık kalan süreyi 3,1 güne indirirken üst sınırı
  120 günde tutuyor.
- 90 günü aşan 13 bulgunun tamamı üç ya da daha çok tarafı ilgilendiren sınıflardan geliyor; tek
  taraflı 26 bulgunun hiçbiri aşmıyor. Pencere uzunluğu teknik ağırlığa değil taraf sayısına
  bağlanmalıdır.

#### Kurs Kapanışı

| Ders | Aday | Kanıta dönen | Savunmada bıraktığı iz |
|---|---|---|---|
| Açık Kaynak İstihbaratı | 29 kalem, 20 aday | 9 kanıt, 6 yanlış pozitif | 12 erişim kaydı, 0 uyarı |
| Alan Adı ve Kayıt Sorgulama | 20 aday, 4 ölçüt | 8 kanıt, 0 yanlış pozitif | 26 kayıt, 0 uyarı |
| Alt Alan ve Varlık Keşfi | 24 bölge kaydı | 21 bulundu, 7 sahipsiz | ad başına 8,57 kayıt, 5 uyarı |
| Bağlantı Noktası Tarama | 96 nokta, 21 belirsiz | 18 kanıt, 3 yanlış pozitif | 72–90 kayıt, 2 uyarı |
| Servis ve Sürüm Belirleme | 21 servis, 4 düzey | 16 kesin, 0 yanlış atama | 168 kayıt, 6 uyarı |
| Paket Yakalama ve Çözümleme | 85 iddia adayı | 50 kanıt, 28 çıkarım | 0 kayıt, 1 yapılandırma onayı |
| Protokol Çözümleyicileri | 91 aday, 30 alan | 43 kanıt, 48 çıkarım | 0 kayıt, akış başına 1 uyarı |
| İstek Manipülasyonu | 18 aday, 40 istek | 8 kanıt, 6 elenen | 35 kayıt, 16 uyarı |
| Sanal Alan Analizi | 14 kalem, 27 davranış | 12 karara bağlanan, 1 yanlış | 0 kayıt, 5 dış bağlantı |
| Dosya ve Bağlantı İtibar Servisleri | 24 kalem, 8 gönderilebilir | eşik 7'de %86 kesinlik, %50 anma | 0 kayıt, 14 servis sorgusu |
| İstismar Çerçeveleri | 16 aday, 9 gerçek | 3 kanıt, 3 yokluk kanıtı | 31 kayıt, 17 uyarı |
| Test Dağıtımları ve Laboratuvarlar | 18 beceri kalemi | 13 kapsanan, 5 açık | 0 kayıt, 0 gerçek risk |
| Katılım Kuralları | 64 hedef, 11 sınırda | 20 kapsamda onaylı | 0 kayıt, 6 taraf, 3 durdurma |
| Test Türleri | 78 / 63 / 60 aday | 6 / 20 / 31 kanıt | 468 / 221 / 90 kayıt |
| Açık Doğrulama | 240 ham aday | 61 kanıt, 9 askıda | 461 kayıt, zincirle 313 |
| Etki Değerlendirmesi | 61 bulgu, 2 bağlam | ilk onda 0 ortak sıra | 0 kayıt, 40 adam-gün kuyruk |
| Raporlama | 61 kayıt, 8 alan | 8 yeniden üretilir, 3 kapanır | 0 kayıt, 9,4 saat yazım |
| Sorumlu Açıklama | 61 bulgu, 4 sınıf | 48 düzeltilmiş yayın | 0 kayıt, 5 taraf, 13 aşan |

Tablonun ikinci ve üçüncü sütunu hiçbir satırda birbirine eşit değil ve bu kursun kuralı buradan
çıkıyor: **sızma testinin çıktısı bulgu sayısı değil, kanıtlanmış ve yeniden üretilebilir
bulgudur; kanıtlanamayan bir aday rapora girdiğinde düzeltme bütçesini boşa harcar.** Dördüncü
sütunda "0 kayıt" yazan dokuz satır var ve en çok kanıt üreten iki ders bunların içindedir: en çok
iz bırakan adım en çok kanıt üreten adım değildir.

On sekiz derste aday–kanıt farkı hep aynı yönde çalıştı. Keşif adayı bol, kanıtı seyrek üretti;
çözümleme araçları kanıt ile çıkarımı ayırdı; doğrulama listeyi dörtte bire indirip kendi hatasını
da yazdı; süreç dersleri kanıtın tek başına yetmediğini gösterdi.

Bir sütun bütün bu ölçümde tek yönlü kaldı. Her adımın savunmada kaç kayıt ve kaç uyarı bıraktığı
sayıldı: 12 erişim kaydından 468 kayda, sıfır uyarıdan 17 uyarıya. Ama o kayıtları **kimin, ne
kadar sürede ve hangi eşikle** okuduğu hiç sorulmadı. Bir uyarı gerçekten birine ulaşıyor mu,
ne kadar sürede bakılıyor, hangi eşiğin altındaki kayıt hiç görülmüyor ve gerçek bir olayda kimin
ne yapacağı yazılı mı? **M24/K08 Güvenlik Operasyonları ve Olay Müdahalesi** kursu tam olarak bu
soruyla başlar.

