Ders 07 / 22
Tehdit Avcılığı
12.910 kayıtlık kurgu bir telemetri kümesinde altı hipotez koşturulur ve hipotez başına elenen kalem sayılır: h1 üç adımda 12.906 kaydı eleyip 4 kalem bırakıyor, h4 iki adımda 6 kalem, h3 283 kalem bırakıp incelenemez hâle geliyor; h2, h5 ve h6 hiçbir kurgu kalem bulmuyor ama 370 kalemi taban çizgisine yazıyor. Toplam 1.691 dakikalık arama iki kurgu kalem buluyor, kalem başına 846 dakika; kural yazmada örnek başına 11 dakikaydı. Altı hipotezin ikisi günlük on uyarı sınırının altında kaldığı için kurala dönüşüyor, dördü sınırı aşıyor ya da boş dönüyor.
İçindekiler
Bir önceki dersin ikinci sürümünden sonra 51 örneğin 21’i hâlâ kaçıyordu ve bunların 11’i hiçbir kuralın ulaşamayacağı yerdeydi. Kural yazmak o sayıyı azaltmaz, çünkü kural ancak sorabildiği alanı sorar ve ancak yazıldığı biçimi arar. Tehdit avcılığı başka bir yerden başlar: kuraldan değil, hipotezden.
Hipotez bir uyarı üretmez; bir soru sorar ve yanıtı elenen kalem sayısıdır. Bu ders altı hipotezi kurgu bir telemetri kümesi üzerinde koşturur ve üç sayı çıkarır: hipotez başına kaç kalem eleniyor, kaç hipotez sıfır sonuç veriyor ve elenenlerin kaçı kurala dönüşebiliyor. Aşağıdaki kümede iki kurgu kalem yalnız kayıt olarak gömülüdür; hiçbir yerde bir saldırı adımının nasıl yapıldığı yazmaz. Kendi ortamı dışında bir sistemde bu tür bir arama, yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.
- TA33. Telemetri kümesi bir günü kapsar: 12.910 kayıt, 192 konak, 90 personel ve 8 servis kimliği. Kayıt bir süreç çalıştırma olayını ve ona bağlı giden aktarımı taşır.
- TA34. Taban çizgisi, her yolun olağan üst sürecidir. Kayıtların yüzde üçünde üst süreç bu eşleşmenin dışındadır; bu, modelin kusuru değil, gerçek ortamdaki gürültünün karşılığıdır.
- TA35. Hipotez sıralı süzgeçlerden oluşur. Her süzgeç kümeyi daraltır ve kaç kalemi elediği ayrı ayrı sayılır.
- TA36. İki kurgu kalem yalnız kayıt olarak gömülüdür ve etiketleri süzgeçlere girmez. İkisi de bir önceki dersin kural kümesinin kapsamadığı davranışlardır.
- TA37. Maliyet iki kalemdir: hipotez başına arama dakikası ve kalan kalem başına 2 dakika inceleme. Bir hipotez, kalan kalem sayısı günlük on uyarı sınırının altındaysa kurala dönüşebilir.
Altı Hipotez, Altı Huni
// avcilik.mjs — kurgu telemetri kumesi ve alti hipotezin adim adim eledigi kalem. MODELDIR. export const TOHUM = 20260407; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); const tam = (n) => Math.floor(r() * n); const sec = (d) => d[tam(d.length)]; const KONAK = [...Array.from({ length: 180 }, (_, i) => `uc-${101 + i}`), ...Array.from({ length: 12 }, (_, i) => `tp-${11 + i}`)]; const HESAP = Array.from({ length: 90 }, (_, i) => `sh-${201 + i}`); const SERVIS = Array.from({ length: 8 }, (_, i) => `sv-${11 + i}`); // Taban cizgisi: her yolun olagan ust sureci (model verisi). const CIFT = [["/usr/bin/olcum-istemci", "/sbin/servis-yonetici"], ["/usr/bin/arsivle", "/usr/bin/zamanlayici"], ["/opt/olcum/toplayici", "/opt/olcum/denetleyici"], ["/usr/bin/rapor", "/usr/bin/zamanlayici"], ["/opt/portal/istemci", "/usr/bin/oturum"], ["/usr/bin/yedekle", "/usr/bin/zamanlayici"], ["/usr/bin/kabuk", "/usr/bin/oturum"]]; export const TABAN = new Set(CIFT.map(([y, u]) => `${u}|${y}`)); const TOPLAYICI_YOL = ["/opt/olcum/toplayici", "/usr/bin/arsivle", "/usr/bin/yedekle"]; // Kayit: bir surec calistirma olayi ve ona bagli giden aktarim (kurgu). export const KAYIT = []; const ek = (o, etiket) => KAYIT.push({ ...o, etiket }); for (let k = 0; k < 12000; k++) { const konak = sec(KONAK); const yol = konak.startsWith("tp-") ? sec(TOPLAYICI_YOL) : sec(CIFT)[0]; // Yuzde uc kayitta ust surec olagan disi eslesiyor: gercek ortamdaki gurultu. const ust = r() < 0.03 ? sec(CIFT)[1] : CIFT.find(([y]) => y === yol)[1]; ek({ konak, hesap: r() < 0.06 ? sec(SERVIS) : sec(HESAP), yol, ust, saat: 7 + tam(12), imzali: r() < 0.97, disHedef: r() < 0.22, bayt: 1000 + tam(200000) }, "olagan"); } // Gece koslari: zamanlanmis mesru isler. for (let k = 0; k < 900; k++) { const yol = sec(["/usr/bin/yedekle", "/usr/bin/arsivle"]); ek({ konak: sec(KONAK), hesap: sec(SERVIS), yol, ust: "/usr/bin/zamanlayici", saat: r() < 0.5 ? tam(6) : 20 + tam(4), imzali: true, disHedef: r() < 0.1, bayt: 2e6 + tam(4e8) }, "gece-kosusu"); } // Iki kurgu kalem, yalnizca KAYIT olarak verilir. for (let k = 0; k < 4; k++) ek({ konak: "uc-137", hesap: "sh-244", yol: "/usr/bin/kabuk", ust: "/usr/bin/oturum", saat: 2 + k, imzali: false, disHedef: true, bayt: 40000 + tam(20000) }, "a1"); for (let k = 0; k < 6; k++) ek({ konak: `tp-${11 + k}`, hesap: "sv-13", yol: "/usr/bin/rapor", ust: "/opt/olcum/denetleyici", saat: 13, imzali: true, disHedef: false, bayt: 8000 + tam(4000) }, "a2"); // Hipotez: [ad, adimlar (etiket + suzgec), arama ve inceleme dakikasi] const cokMakine = (l) => { const m = new Map(); for (const o of l) { const a = `${o.ust}|${o.yol}`; (m.get(a) || m.set(a, new Set()).get(a)).add(o.konak); } return l.filter((o) => m.get(`${o.ust}|${o.yol}`).size >= 5); }; export const HIPOTEZ = [ ["h1 imzasiz ikili, ofis disi, dis hedef", [ ["imzasiz", (l) => l.filter((o) => !o.imzali)], ["ofis disi saat", (l) => l.filter((o) => o.saat < 7 || o.saat >= 19)], ["dis hedef", (l) => l.filter((o) => o.disHedef)]], 75], ["h2 servis kimligiyle kabuk", [ ["servis kimligi", (l) => l.filter((o) => o.hesap.startsWith("sv-"))], ["kabuk yolu", (l) => l.filter((o) => o.yol.endsWith("kabuk"))]], 40], ["h3 taban disi ust-yol, bes+ makine", [ ["taban disi cift", (l) => l.filter((o) => !TABAN.has(`${o.ust}|${o.yol}`))], ["bes+ makine", cokMakine]], 90], ["h4 toplayicida beklenmeyen yol", [ ["toplayici konak", (l) => l.filter((o) => o.konak.startsWith("tp-"))], ["taban disi yol", (l) => l.filter((o) => !TOPLAYICI_YOL.includes(o.yol))]], 60], ["h5 gece buyuk giden aktarim", [ ["ofis disi saat", (l) => l.filter((o) => o.saat < 7 || o.saat >= 19)], ["10 MB ustu", (l) => l.filter((o) => o.bayt > 1e7)], ["dis hedef", (l) => l.filter((o) => o.disHedef)]], 55], ["h6 imzasiz ikili zamanlayicidan", [ ["imzasiz", (l) => l.filter((o) => !o.imzali)], ["zamanlayici ust", (l) => l.filter((o) => o.ust === "/usr/bin/zamanlayici")]], 45], ]; export function kostur([, adimlar]) { let l = KAYIT, huni = [KAYIT.length]; for (const [, f] of adimlar) { l = f(l); huni.push(l.length); } return { kalan: l, huni, kalem: [...new Set(l.map((o) => o.etiket))].filter((e) => e.startsWith("a")) }; } 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([38, 8, 12, 10, 10, 12]); console.log(`model (tohum ${TOHUM}): ${KAYIT.length} kayit, ` + `${new Set(KAYIT.map((o) => o.konak)).size} konak; iki kurgu kalem kayit olarak gomulu`); console.log(); console.log(yz(["hipotez", "adim", "elenen", "kalan", "dakika", "kalem"])); for (const h of HIPOTEZ) { const s = kostur(h); console.log(yz([h[0], h[1].length, KAYIT.length - s.kalan.length, s.kalan.length, h[2], s.kalem.join(",") || "-"])); } const h1 = HIPOTEZ[0], s1 = kostur(h1); console.log(`\n${h1[0]} — adim adim huni:`); const yh = gen([22, 10, 10]); console.log(yh(["adim", "kalan", "elenen"])); console.log(yh(["baslangic", s1.huni[0], "-"])); for (const [i, [ad]] of h1[1].entries()) console.log(yh([ad, s1.huni[i + 1], s1.huni[i] - s1.huni[i + 1]])); }
model (tohum 20260407): 12910 kayit, 192 konak; iki kurgu kalem kayit olarak gomulu hipotez adim elenen kalan dakika kalem h1 imzasiz ikili, ofis disi, dis hedef 3 12906 4 75 a1 h2 servis kimligiyle kabuk 2 12800 110 40 - h3 taban disi ust-yol, bes+ makine 2 12627 283 90 a2 h4 toplayicida beklenmeyen yol 2 12904 6 60 a2 h5 gece buyuk giden aktarim 3 12816 94 55 - h6 imzasiz ikili zamanlayicidan 2 12744 166 45 - h1 imzasiz ikili, ofis disi, dis hedef — adim adim huni: adim kalan elenen baslangic 12910 - imzasiz 378 12532 ofis disi saat 4 374 dis hedef 4 0
Huni tablosu avcılığın gerçek işini gösteriyor. h1’in ilk süzgeci 12.532 kaydı eliyor ve geriye 378 bırakıyor; ikinci süzgeç 374’ünü daha eliyor. Üçüncü süzgeç hiçbir şey elemiyor — kalan dört kaydın hepsi zaten dış hedefe gidiyordu. Bu, hipotezin üçüncü koşulunun bu veri kümesinde gereksiz olduğunu söyler ve kurala dönüştürülürken çıkarılabilir. Bir hipotezi koşturmanın çıktısı yalnız bulunan kalem değil, hangi koşulun işe yaradığıdır.
Altı hipotezin ikisi kullanılabilir bir sonuç veriyor: h1 dört, h4 altı kalem bırakıyor ve ikisi de elle incelenebilir. h3 aynı kurgu kalemi buluyor ama 283 kalemin içinde; bir hipotezin doğru olması onu yararlı yapmaz, çünkü kalanı inceleyecek zaman yoksa bulgu bulunmamış sayılır. h3 ile h4 aynı kurgu kalemi ayrı yollardan buluyor ve aradaki fark yalnızca ilk süzgecin dayandığı bilgidir: h4 toplayıcı makinelerin dar bir yol listesi olduğunu biliyor, h3 bilmiyor.
Üç hipotez hiçbir kurgu kalem bulmuyor. h2 “servis kimliğiyle kabuk çalıştırma” arıyor ve 110 kayıt buluyor; bu, hipotezin yanlışlandığı anlamına gelir — o davranış bu kurgu ortamda olağandır. h6’nın 166 kaydı imzasız ikililerin zamanlayıcıdan çalıştırılmasıdır ve aynı şeyi söyler.
Elenen kalem sayısı hipotezin kalitesini tek başına vermez. h6 ile h1 aynı ilk süzgeci kullanıyor ve aynı 378 kaydı bırakıyor; ayrıldıkları yer ikinci süzgeçtir. h1 zamanı soruyor ve 4 kalem bırakıyor, h6 üst süreci soruyor ve 166 kalem. İki hipotez aynı veriye aynı maliyetle bakıyor; farkı yaratan şey ikinci sorunun ortamda ne kadar seyrek olduğudur ve bu, hipotez yazılırken bilinemez, ancak koşturulduktan sonra ölçülür.
Maliyet, Sıfır Sonucun Değeri ve Kurala Dönüşme
// verim.mjs — hipotez basina maliyet, sifir sonucun degeri ve kurala donusme olcutu. import { KAYIT, HIPOTEZ, kostur } from "./avcilik.mjs"; // Model verisi: kalan kalem basina inceleme dakikasi ve bir kuralin gunluk uyari siniri. const KALEM_DK = 2, KURAL_SINIRI = 10; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yz = gen([40, 9, 9, 11, 13, 8, 15]); const s = HIPOTEZ.map((h) => ({ h, ...kostur(h) })); console.log(yz(["hipotez", "elenen", "kalan", "arama dk", "inceleme dk", "kalem", "kurala uygun"])); let toplamDk = 0, bulunan = new Set(); for (const x of s) { const inc = x.kalan.length * KALEM_DK; toplamDk += x.h[2] + inc; x.kalem.forEach((k) => bulunan.add(k)); console.log(yz([x.h[0], KAYIT.length - x.kalan.length, x.kalan.length, x.h[2], inc, x.kalem.join(",") || "-", x.kalan.length <= KURAL_SINIRI ? "evet" : "hayir"])); } const bosuna = s.filter((x) => x.kalem.length === 0); console.log(`\ntoplam ${toplamDk} dakika avcilik, ${bulunan.size} kurgu kalem bulundu: ` + `kalem basina ${Math.round(toplamDk / bulunan.size)} dakika`); console.log(`${bosuna.length} hipotez hicbir kalem bulamadi ama ` + `${bosuna.reduce((a, x) => a + x.kalan.length, 0)} kalemi taban cizgisine yaziyor; ` + `bu kalemler bir daha ayni hipotezle elenmez`); // Kurala donusme: gunluk uyari sinirinin altinda kalan hipotez kural olur. const aday = s.filter((x) => x.kalan.length <= KURAL_SINIRI); const yk = gen([40, 14, 19, 13]); console.log(); console.log(yk(["kural adayi hipotez", "gunluk uyari", "aylik inceleme dk", "kalem turu"])); for (const x of aday) console.log(yk([x.h[0], x.kalan.length, x.kalan.length * KALEM_DK * 30, x.kalem.join(",")])); console.log(`\n${s.length} hipotezin ${aday.length} tanesi kurala donusuyor; ` + `${s.length - aday.length} tanesi gunluk uyari sinirini asiyor ya da bos donuyor`); console.log(`avcilikta kalem basina ${Math.round(toplamDk / bulunan.size)} dakika, ` + `kural yazmada ornek basina 11 dakika; avcilik pahali olani bulur`);
hipotez elenen kalan arama dk inceleme dk kalem kurala uygun h1 imzasiz ikili, ofis disi, dis hedef 12906 4 75 8 a1 evet h2 servis kimligiyle kabuk 12800 110 40 220 - hayir h3 taban disi ust-yol, bes+ makine 12627 283 90 566 a2 hayir h4 toplayicida beklenmeyen yol 12904 6 60 12 a2 evet h5 gece buyuk giden aktarim 12816 94 55 188 - hayir h6 imzasiz ikili zamanlayicidan 12744 166 45 332 - hayir toplam 1691 dakika avcilik, 2 kurgu kalem bulundu: kalem basina 846 dakika 3 hipotez hicbir kalem bulamadi ama 370 kalemi taban cizgisine yaziyor; bu kalemler bir daha ayni hipotezle elenmez kural adayi hipotez gunluk uyari aylik inceleme dk kalem turu h1 imzasiz ikili, ofis disi, dis hedef 4 240 a1 h4 toplayicida beklenmeyen yol 6 360 a2 6 hipotezin 2 tanesi kurala donusuyor; 4 tanesi gunluk uyari sinirini asiyor ya da bos donuyor avcilikta kalem basina 846 dakika, kural yazmada ornek basina 11 dakika; avcilik pahali olani bulur
Maliyet tablosunun asıl bilgisi inceleme sütununda. h3’ün arama maliyeti 90 dakikadır ama bıraktığı 283 kalemin incelenmesi 566 dakika ister — hipotezin toplam bedeli 656 dakikadır ve bunun onda dokuzu daraltmanın yetersizliğinden gelir. Bir hipotezi ucuzlatmanın yolu daha hızlı aramak değil, daha dar sormaktır.
Toplam 1.691 dakika iki kurgu kalem buluyor: kalem başına 846 dakika. Bir önceki derste kural yazma örnek başına 11 dakikaya geliyordu. İki sayı doğrudan karşılaştırılamaz ve karşılaştırmanın yönü şudur: kural, daha önce görülmüş olanı ucuza yakalar; avcılık, hiçbir kuralın sorabileceği biçimde yazılmamış olanı pahalıya bulur. İki kurgu kalemin ikisi de bir önceki dersin kural kümesinin kapsamadığı davranışlardır.
Sıfır sonuç veren üç hipotez boşa gitmiş sayılmaz. Bunlar 370 kalemi taban çizgisine yazıyor: servis kimliğinin kabuk çalıştırması, imzasız ikilinin zamanlayıcıdan gelmesi ve gece büyük aktarım yapması bu ortamda olağandır ve bir daha aynı hipotezle elenmeleri gerekmez. Avcılığın çıktısı bulgular değil, ortamın haritasıdır ve harita her koşumda büyür.
Kural adayı tablosu döngüyü kapatıyor. h1 günde 4, h4 günde 6 uyarı üretir; ikisi de on uyarı sınırının altındadır ve aylık inceleme yükleri 240 ile 360 dakikadır. Kalan dört hipotez kurala dönüşemez: h3 günde 283 uyarı üretirdi, ötekiler ise hiç kalem içermeyen bir kural olurdu. Bir hipotezin kurala dönüşmesi doğruluğuna değil, hacmine bağlıdır.
Özet
- Hipotez bir uyarı değil, elenen kalem sayısı üretir: h1 üç adımda 12.906 kaydı eleyip 4 kalem, h4 iki adımda 6 kalem bırakıyor ve ikisi de elle incelenebilir.
- h1’in üçüncü süzgeci hiçbir şey elemiyor; koşturmanın çıktısı bulunan kalem kadar hangi koşulun işe yaramadığıdır ve o koşul kurala dönüşürken çıkarılabilir.
- h3 doğru kurgu kalemi buluyor ama 283 kalemin içinde bırakıyor; kalanı inceleyecek zaman yoksa bulgu bulunmamış sayılır.
- Sıfır sonuç veren üç hipotez 370 kalemi taban çizgisine yazıyor; bu davranışların olağan olduğu kanıtlanmış olur ve aynı hipotezle bir daha elenmeleri gerekmez.
- Toplam 1.691 dakikalık arama iki kurgu kalem buluyor, kalem başına 846 dakika; kural yazma örnek başına 11 dakikaydı ve kural yalnız daha önce görülmüş olanı yakalar.
- Altı hipotezin ikisi günlük on uyarı sınırının altında kaldığı için kurala dönüşüyor; dönüşme ölçütü doğruluk değil, hacimdir.
Sonraki Adım
Bu dersin altı hipotezi de ortamın kendi verisinden çıktı: taban çizgisi, olağan üst süreç, olağan saat. Hiçbiri “başkalarında ne görüldüğü” bilgisini kullanmadı. O bilgi dışarıdan gelir ve iki ayrı biçimde gelir: tek tek göstergeler — bir adres, bir karma, bir ad — ve davranış tanımları. İkisi aynı şey gibi görünür ama ömürleri birbirinden farklıdır. Sonraki ders bu farkı ölçer: bir gösterge kaç gün geçerli kalıyor, bir davranış tanımı kaç ay; besleme büyüdükçe eşleşme oranı nasıl değişiyor ve saklama maliyeti nereden geliyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.