İçeriğe geç
academia.sh

Ders 17 / 22

Adli İnceleme İlkeleri

Delil bütünlüğü ve gözetim zincirinin kalem cinsinden ölçülmesi: 28 kanıt kalemi, 78 aktarım ve aktarım başına beş kayıt alanı; 390 alanın 10'unun boş kalması 9 kalemi, karma uyuşmazlığı 3 kalemi daha tartışmaya açıyor ve 28 kalemin 12'si savunulamıyor. Saha zincirindeki tek bir noktanın kaydı tümüyle düşerse 13 kalem birden açılıyor; yüzde 2,6'lık kayıt boşluğunun yüzde 43'lük kalem kaybına dönüşmesi zincirin yapısından geliyor.

İçindekiler

Bir önceki konu olayı kapattı: sınırlama uygulandı, etkilenen makineler ağdan alındı, hizmet geri geldi. Kapanış oradan şu soruyla çıkıyordu — olayın ne olduğunu kanıtlayacak kalemlerin çoğu sınırlama anında zaten silinmişti. Makine kapatıldığında bellek gitti, oturum düştüğünde bağlantı listesi gitti, yeniden kurulumda geçici dosyalar gitti. Geriye kalanla bir anlatı kurulabilir; o anlatının sınanabilir olup olmadığı ayrı bir sorudur.

Bu konu o soruyu ölçer ve ölçü birimi kanıt kalemidir. Üç sütun sayılır: kaç kalem uçucudur ve toplanmazsa kaybolur, toplama sırası kaç kalemi kaybettirir, gözetim zinciri kaç kalemde kopar. Bu ders üçüncü sütunu kurar. Kurgu bölgesel ölçüm ağında bir şube ucunda yetkisiz erişim görülmüş, inceleme altı konağı kapsıyor. Bütün sayılar bir modelden gelir. Başkasına ait bir sistemden kanıt toplamak — imaj almak, döküm çıkarmak, kayıt kopyalamak — yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.

  • AI1. Kanıt kalemi, tek bir kaynaktan alınmış ve tek bir bütünlük değeriyle bağlanabilen veri parçasıdır: bir disk imajı, bir bellek dökümü, bir günlük dilimi, bir yapılandırma kopyası.
  • AI2. Her kalemin bir ömrü vardır: toplanmazsa kaybolmadan önce geçen süre. Ömrü bir saati aşmayan kalem uçucudur.
  • AI3. Gözetim zinciri (chain of custody), kalemin toplandığı andan çözümlendiği ana kadar geçtiği aktarımların kaydıdır. Zincir düğümlerden, aktarım iki düğüm arasındaki devirden oluşur.
  • AI4. Her aktarım beş kayıt alanı ister: kimden, kime, ne zaman, hangi ortamda, hangi karma. Alanlar elle doldurulur ve boş kalabilir.
  • AI5. Bir kalem savunulabilirdir ancak toplama anındaki karma çözümleme anındaki karmayla aynıysa ve zincirindeki hiçbir aktarımda eksik alan yoksa. Aksi durumda kalem tartışmaya açıktır — yanlış olduğu gösterilmiş değildir, doğru olduğu gösterilemez.
  • AI6. Kalem sayıları, süreler ve hata oranı kurgudur; rastgelelik tohumu görünürdür.

Kalem, Karma ve Aktarım

// adli/kalem.mjs — kanit kalemi kumesi, karma tabanli butunluk ve gozetim zinciri MODELIDIR.
// Bolgesel olcum agi kurgudur; gercek kurum, olay ve makine adi yazilmaz.
import { createHash } from "node:crypto";

export const TOHUM = 20260731;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// sinif -> [omur(sn): toplanmazsa kaybolmadan once gecen sure, toplama suresi(sn)]
export const SINIF = {
  "ag-durumu": [120, 45], "surec-listesi": [240, 60], "acik-tanitici": [300, 55],
  "oturum-durumu": [600, 70], "bellek-icerigi": [900, 420], "gecici-dosya": [3600, 180],
  "akis-kaydi": [86400, 240], "disk-imaji": [604800, 5400], "yapilandirma": [604800, 90],
  "uzak-gunluk": [2592000, 300],
};

// konak -> [gozetim zinciri dugumleri, tasidigi kalem siniflari]
export const KONAK = {
  "sube-ucu-3": [["toplama", "paketleme", "aktarim", "laboratuvar", "cozumleme"],
    ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu", "bellek-icerigi",
      "gecici-dosya", "disk-imaji", "yapilandirma"]],
  "saha-dizustu-14": [["toplama", "paketleme", "aktarim", "laboratuvar", "cozumleme"],
    ["ag-durumu", "surec-listesi", "oturum-durumu", "bellek-icerigi", "disk-imaji"]],
  "toplayici-2": [["toplama", "aktarim", "cozumleme"],
    ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu", "bellek-icerigi",
      "disk-imaji", "yapilandirma"]],
  "portal-onyuz": [["toplama", "aktarim", "cozumleme"],
    ["ag-durumu", "surec-listesi", "bellek-icerigi", "yapilandirma"]],
  "merkez-gunluk": [["alma", "cozumleme"], ["uzak-gunluk", "yapilandirma"]],
  "akis-toplayici": [["alma", "cozumleme"], ["akis-kaydi", "yapilandirma"]],
};

// Her aktarimda doldurulmasi gereken bes kayit alani.
export const ALAN = ["kimden", "kime", "zaman", "ortam", "karma"];
// Yazma korumasi olmadan acilan kalemler: icerik degismese de erisim damgasi degisiyor.
export const KORUMASIZ = ["sube-ucu-3/gecici-dosya", "toplayici-2/disk-imaji",
  "portal-onyuz/yapilandirma"];

export const ozet = (s) => createHash("sha256").update(s).digest("hex").slice(0, 16);

export function kume() {
  const r = uretec(TOHUM), liste = [];
  for (const [konak, [dugum, siniflar]] of Object.entries(KONAK))
    for (const s of siniflar) {
      const ad = `${konak}/${s}`;
      const icerik = `${ad}|${Math.floor(r() * 1e9)}`;
      liste.push({ ad, konak, sinif: s, dugum, omur: SINIF[s][0], sure: SINIF[s][1],
        toplamaKarma: ozet(icerik),
        cozumlemeKarma: ozet(icerik + (KORUMASIZ.includes(ad) ? "|erisim-damgasi" : "")),
        aktarim: dugum.slice(1).map((d, i) => {
          const kayit = Object.fromEntries(ALAN.map((a) => [a, true]));
          if (r() < 0.11) kayit[ALAN[Math.floor(r() * 5)]] = false;   // alan bos kaldi
          return { nokta: `${dugum[i]}>${d}`, kayit };
        }) });
    }
  return liste;
}

export const eksikAlan = (k) =>
  k.aktarim.reduce((a, t) => a + ALAN.filter((x) => !t.kayit[x]).length, 0);
export const butun = (k) => k.toplamaKarma === k.cozumlemeKarma;
export const savunulabilir = (k) => butun(k) && eksikAlan(k) === 0;

Karma burada tek bir işi yapıyor: kalemi kendisine bağlamak. Toplama anında hesaplanan özet kaydedilir; çözümleme anında yeniden hesaplanır. İki değer aynıysa kalemin bu iki an arasında değişmediği gösterilmiş olur. Aynı değilse kalemin değiştiği gösterilmiş olur — nasıl ve kimin tarafından değil, yalnız değiştiği. Karmanın kanıtladığı budur ve fazlası değildir.

Üç kalem yazma koruması olmadan açılmıştır. İçeriğe hiçbir şey yazılmamıştır; yalnız erişim damgası tazelenmiştir. Karma bu ayrımı görmez, çünkü görmemesi gerekir: bütünlük değeri niyeti değil farkı ölçer. Bir kalemin kazara mı yoksa bilerek mi değiştiği, karmanın değil zincirin sorusudur.

Zincirin Sayıları

// adli/olc.mjs — konak basina kalem, aktarim ve savunulabilirlik sayimi.
import { kume, ALAN, SINIF, eksikAlan, butun, savunulabilir, TOHUM } from "./kalem.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 K = kume();
const ucucu = K.filter((k) => k.omur <= 3600).length;
console.log(`model (tohum ${TOHUM}): ${K.length} kanit kalemi, ${Object.keys(SINIF).length} ` +
  `sinif, aktarim basina ${ALAN.length} kayit alani`);
console.log(`${ucucu} kalem ucucu (omru bir saati asmiyor), ${K.length - ucucu} kalem kalici`);

const A = [-17, 7, 8, 9, 7, 12, 15];
console.log("");
y(A, "konak", "kalem", "dugum", "aktarim", "alan", "eksik alan", "savunulabilir");
for (const konak of [...new Set(K.map((k) => k.konak))]) {
  const g = K.filter((k) => k.konak === konak);
  const akt = g.reduce((a, k) => a + k.aktarim.length, 0);
  y(A, konak, g.length, g[0].dugum.length, akt, akt * ALAN.length,
    g.reduce((a, k) => a + eksikAlan(k), 0), `${g.filter(savunulabilir).length}/${g.length}`);
}
const akt = K.reduce((a, k) => a + k.aktarim.length, 0);
y(A, "toplam", K.length, "-", akt, akt * ALAN.length,
  K.reduce((a, k) => a + eksikAlan(k), 0), `${K.filter(savunulabilir).length}/${K.length}`);

console.log(`\nkarma uyusmazligi ${K.filter((k) => !butun(k)).length} kalemde: ` +
  K.filter((k) => !butun(k)).map((k) => k.ad).join(", "));
model (tohum 20260731): 28 kanit kalemi, 10 sinif, aktarim basina 5 kayit alani
18 kalem ucucu (omru bir saati asmiyor), 10 kalem kalici

konak              kalem   dugum  aktarim   alan  eksik alan  savunulabilir
sube-ucu-3             8       5       32    160           4            3/8
saha-dizustu-14        5       5       20    100           4            2/5
toplayici-2            7       3       14     70           1            5/7
portal-onyuz           4       3        8     40           0            3/4
merkez-gunluk          2       2        2     10           1            1/2
akis-toplayici         2       2        2     10           0            2/2
toplam                28       -       78    390          10          16/28

karma uyusmazligi 3 kalemde: sube-ucu-3/gecici-dosya, toplayici-2/disk-imaji, portal-onyuz/yapilandirma

Tabloda iki sütun birlikte okunmalıdır. Saha konakları beş düğümlü bir zincir izliyor: kalem toplanıyor, paketleniyor, laboratuvara taşınıyor, kabul ediliyor, çözümleniyor. Dört aktarım demek, kalem başına yirmi doldurulacak alan demektir. Merkezdeki konaklarda zincir üç düğüm, uzaktan alınan kalemlerde iki düğümdür — fiziksel taşıma yoktur, dolayısıyla doldurulacak alan da azdır.

Sonuç sütunu bu yapıyı doğrudan yansıtıyor. Sekiz kalemli şube ucunda savunulabilir kalem sayısı üçtür; iki kalemli akış toplayıcısında ikinin ikisi savunulabilirdir. Zincir uzadıkça kalem başına düşen kayıt yükü artıyor ve her ek alan bir boş kalma fırsatıdır. Uzun zincir kalemi daha çok korumaz; onu daha çok yerde kırılabilir kılar.

Tek Eksik Kayıt

// adli/bosluk.mjs — tek eksik kaydin kac kalemi tartismaya actigi.
import { kume, ALAN, eksikAlan, butun } from "./kalem.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 K = kume();

// Her aktarim noktasi icin: kac kalem geciyor, kaydi tumuyle dusrse hepsi tartismaya acilir.
const nokta = new Map();
for (const k of K)
  k.aktarim.forEach((t, i) => {
    if (!nokta.has(t.nokta)) nokta.set(t.nokta, { gecen: 0, sonra: 0 });
    const n = nokta.get(t.nokta);
    n.gecen += 1; n.sonra = k.aktarim.length - i - 1;
  });

const A = [-22, 14, 14, 20];
y(A, "aktarim noktasi", "gecen kalem", "sonraki adim", "kaydi dusrse acilan");
for (const [ad, n] of [...nokta].sort((a, b) => b[1].gecen - a[1].gecen))
  y(A, ad, n.gecen, n.sonra, `${n.gecen} kalem (%${Math.round(n.gecen * 100 / K.length)})`);

// Gozlenen durum: hangi alan eksik, hangi soru yanitsiz kaliyor.
const SORU = { kimden: "kalem kimin elindeydi", kime: "kim teslim aldi",
  zaman: "sira kanitlanabilir mi", ortam: "hangi kosulda saklandi",
  karma: "degismedigi gosterilebilir mi" };
console.log("");
const B = [-12, -32, 9, 7];
y(B, "eksik alan", "yanitsiz kalan soru", "aktarim", "kalem");
for (const a of ALAN) {
  const t = K.reduce((s, k) => s + k.aktarim.filter((x) => !x.kayit[a]).length, 0);
  y(B, a, SORU[a], t, K.filter((k) => k.aktarim.some((x) => !x.kayit[a])).length);
}

const alan = K.reduce((a, k) => a + k.aktarim.length, 0) * ALAN.length;
const eksik = K.reduce((a, k) => a + eksikAlan(k), 0);
const acik = K.filter((k) => eksikAlan(k) > 0 || !butun(k)).length;
console.log(`\n${alan} kayit alaninin ${eksik}'i bos (%${(eksik * 100 / alan).toFixed(1)}); ` +
  `bu ${K.filter((k) => eksikAlan(k) > 0).length} kalemi, karma uyusmazligi ` +
  `${K.filter((k) => !butun(k)).length} kalemi daha etkiliyor`);
console.log(`toplam ${acik} / ${K.length} kalem tartismaya acik ` +
  `(%${Math.round(acik * 100 / K.length)}), ${K.length - acik} kalem savunulabilir`);
const enKotu = Math.max(...[...nokta.values()].map((n) => n.gecen));
console.log(`tek bir noktanin kaydi tumuyle dusrse en kotu durum ${enKotu} kalem ` +
  `(%${Math.round(enKotu * 100 / K.length)}) ve bu, gozlenen ${acik} kalemin ustune eklenir`);
aktarim noktasi          gecen kalem  sonraki adim kaydi dusrse acilan
toplama>paketleme                 13             3      13 kalem (%46)
paketleme>aktarim                 13             2      13 kalem (%46)
aktarim>laboratuvar               13             1      13 kalem (%46)
laboratuvar>cozumleme             13             0      13 kalem (%46)
toplama>aktarim                   11             1      11 kalem (%39)
aktarim>cozumleme                 11             0      11 kalem (%39)
alma>cozumleme                     4             0       4 kalem (%14)

eksik alan  yanitsiz kalan soru               aktarim  kalem
kimden      kalem kimin elindeydi                   3      3
kime        kim teslim aldi                         1      1
zaman       sira kanitlanabilir mi                  1      1
ortam       hangi kosulda saklandi                  2      2
karma       degismedigi gosterilebilir mi           3      3

390 kayit alaninin 10'i bos (%2.6); bu 9 kalemi, karma uyusmazligi 3 kalemi daha etkiliyor
toplam 12 / 28 kalem tartismaya acik (%43), 16 kalem savunulabilir
tek bir noktanin kaydi tumuyle dusrse en kotu durum 13 kalem (%46) ve bu, gozlenen 12 kalemin ustune eklenir

Son üç satır bu dersin sonucudur. Kayıt alanlarının yüzde 2,6’sı boştur ve bu, kalemlerin yüzde 43’ünü tartışmaya açar. Oran arasındaki fark bir hesap hatası değil, zincirin yapısıdır: alan tek tek doldurulur, kalem ise bütün olarak savunulur. Bir kalemin yirmi alanından biri boşsa o kalemin tamamı için “değişmediği gösterilemez” denir. Bütünlük bölünebilir bir nitelik değildir.

Birinci tablo bu kırılganlığın nerede yoğunlaştığını gösteriyor. Saha zincirindeki dört noktanın her biri on üç kalem taşıyor; herhangi birinin kaydı tümüyle düşerse on üç kalem birden açılır. Bu, bir kalem-kayıt ilişkisi değil, bir darboğaz ilişkisidir: aynı kurye, aynı kabul masası, aynı form. Uzaktan alınan dört kalemde aynı riskin ölçüsü dörttür.

İkinci tablo eksik alanın türüne göre neyin cevapsız kaldığını ayırıyor ve sütunlar eşit değildir. Karma alanı boşsa kalemin değişmediği gösterilemez; bu, kalemi doğrudan kullanılamaz kılar. Ortam alanı boşsa yalnız saklama koşulu bilinmez; kalem hâlâ karma ile bağlıdır ve bu boşluk sonradan bir tanıklıkla kapatılabilir. Zincir denetimi bu iki durumu aynı sütuna yazarsa, kapatılabilir boşlukla kapatılamaz boşluğu karıştırır ve inceleme bütçesini yanlış yere harcar.

Zinciri Kısaltmanın Bedeli

// adli/kisalt.mjs — zincir uzunlugu ile beklenen acik kalem sayisi arasindaki bag.
import { kume, ALAN, eksikAlan } from "./kalem.mjs";
const K = kume(), P = 0.11;                    // aktarim basina alan bos kalma olasiligi
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 bek = (a) => 1 - (1 - P) ** a;           // en az bir alani eksik kalma olasiligi

const A = [-20, 7, 9, 7, 10, 20];
y(A, "zincir", "kalem", "aktarim", "alan", "gozlenen", "beklenen acik kalem");
let tk = 0, ta = 0, tb = 0, tg = 0;
for (const [ad, n] of [["saha (5 dugum)", 4], ["merkez (3 dugum)", 2], ["uzak (2 dugum)", 1]]) {
  const g = K.filter((k) => k.aktarim.length === n);
  const gozlenen = g.filter((k) => eksikAlan(k) > 0).length;
  y(A, ad, g.length, g.length * n, g.length * n * ALAN.length, gozlenen,
    (g.length * bek(n)).toFixed(2));
  tk += g.length; ta += g.length * n; tg += gozlenen; tb += g.length * bek(n);
}
y(A, "toplam", tk, ta, ta * ALAN.length, tg, tb.toFixed(2));

// Yerinde cozumleme: saha kalemleri tasinmiyor, zincir tek aktarima iniyor.
const s = K.filter((k) => k.aktarim.length === 4).length;
const a2 = s + K.filter((k) => k.aktarim.length === 2).length * 2 +
  K.filter((k) => k.aktarim.length === 1).length;
const b2 = s * bek(1) + K.filter((k) => k.aktarim.length === 2).length * bek(2) +
  K.filter((k) => k.aktarim.length === 1).length * bek(1);
y(A, "yerinde cozumleme", tk, a2, a2 * ALAN.length, "-", b2.toFixed(2));
console.log(`aktarim ${ta} -> ${a2} (%${Math.round((1 - a2 / ta) * 100)} az), ` +
  `beklenen acik kalem ${tb.toFixed(2)} -> ${b2.toFixed(2)}`);
zincir                kalem  aktarim   alan  gozlenen beklenen acik kalem
saha (5 dugum)           13       52    260         7                4.84
merkez (3 dugum)         11       22    110         1                2.29
uzak (2 dugum)            4        4     20         1                0.44
toplam                   28       78    390         9                7.57
yerinde cozumleme        28       39    195         -                4.16
aktarim 78 -> 39 (%50 az), beklenen acik kalem 7.57 -> 4.16

Beklenen sütun modeli kendi içinde sınıyor: aktarım başına yüzde 11’lik alan boş kalma olasılığıyla saha kalemlerinin 4,84’ünün açılması beklenir, gözlenen 7’dir. Sapma küçük bir kümede olağandır ve tam olarak bu yüzden zincir denetimi tek tek kalem üzerinden yapılır, ortalama üzerinden değil.

Son satır bir seçenek ölçüyor. Saha kalemleri laboratuvara taşınmaz, çözümleme yerinde yapılırsa zincir tek aktarıma iner: 78 aktarım 39’a düşer ve beklenen açık kalem 7,57’den 4,16’ya iner. Bu kazancın karşılığı yazılmadan karar verilemez. Yerinde çözümleme, o yetkinlikteki kişinin sahaya gitmesini gerektirir; onun yolda geçirdiği süre bütün kalemlerin saatine eklenir ve tabloda ömrü iki yüz saniyenin altında olan kalemler o süreyi beklemez. Zinciri kısaltmak kalemi korur, gecikme kalemi yok eder — ikisi aynı ölçünün iki ucudur ve hangisinin ağır bastığı ancak sürelerle hesaplanır.

Özet

  • Kanıt kalemi tek bir bütünlük değeriyle bağlanabilen veri parçasıdır; kurgu olayda 28 kalemin 18’i uçucudur, ömrü bir saati aşmaz.
  • Karma kalemi kendisine bağlar ve yalnız değiştiğini gösterir: üç kalemde uyuşmazlık vardır, üçü de yazma koruması olmadan açılmış ve yalnız erişim damgası tazelenmiştir.
  • Gözetim zinciri saha konaklarında dört, merkezde iki, uzaktan alımda tek aktarımdır; aktarım başına beş alan, toplam 78 aktarım ve 390 alan demektir.
  • Alanların yüzde 2,6’sının boş kalması kalemlerin yüzde 43’ünü tartışmaya açıyor: alan tek tek doldurulur, kalem bütün olarak savunulur.
  • Saha zincirindeki dört noktanın her biri 13 kalem taşıyor; tek bir noktanın kaydının düşmesi kalemlerin yüzde 46’sını birden açar.

Sonraki Adım

Bu derste zincir kalemin etrafında kuruldu: kim taşıdı, ne zaman devretti, hangi karma kaydedildi. Kalemin kendisinin nasıl alındığı hiç sorulmadı. Tabloda 28 kalemin altısı disk imajıdır ve her biri modelde 5.400 saniyelik bir toplama süresi taşıyor — konudaki en pahalı kalemler bunlar.

Sonraki ders o kopyalamayı doğrulanabilirlik cinsinden ölçer. Kopyanın kaynakla aynı olduğunu ne kanıtlar, kaynağın hangi bölümü kopyaya girmez, kısmi bir kopya kaç kalemi kaçırır ve çalışan bir sistemden kopya alınırken kaç kalem kopyalama sırasında değişir. Üç sayı ayrı ayrı çıkarılır; ilki karma ile kurulur, ikincisi kapsamla, üçüncüsü ancak iki karmanın karşılaştırılmasıyla görülür.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat