Ders 08 / 22
Kimlik Avı Türleri
Yirmi altı iletilik kurgu bir kümede on gösterge türünü saymak: toplu, hedefli ve yönetici hedefli iletilerin ortalama gösterge sayısı farkı, eşik taramasında kaçırılan ile yanlış işaretlenenin ters yönü, eşikten bağımsız işaretlenen meşru iletiler ve beş adımlık zincirin erken kırma kazancı.
İçindekiler
Önceki ders talebi karar vericiye ulaşmış saydı ve zincirin üçüncü halkasını — temas kurma — tek satırda geçti. Oysa temasın taşıdığı ileti ölçülebilir bir nesnedir: sayılabilir göstergeler taşır ve bu göstergeler bir sayıya toplanabilir. Bu ders o sayıyı üretir ve seçilen eşiğin neyi kaçırdığını, neyi yanlış işaretlediğini birlikte yazar.
Ölçülen şey iletinin metni değildir. Metin sonsuz biçimde değişir; gösterge türü değişmez. Gönderenin daha önce görülmemiş bir alan adından gelmesi, gönderen doğrulama kaydının geçmemesi, bağlantı hedefinin metinde yazandan ayrışması — bunların her biri bir denetimin görebileceği kalemdir. Gönderen doğrulama kayıtlarının nasıl kurulduğu başka bir kursta ölçülmüştü; burada o kaydın sonucu on göstergeden yalnız biridir. Asıl soru şudur: kimlik avı hedef daraldıkça neden daha az gösterge taşır ve bu, eşiğe ne yapar?
- SM7. İleti kümesi kurgusal bölgesel ölçüm ağının saha ekibi posta kutusuna aittir. Gerçek bir ileti yok; modelde yalnız gösterge türü ve sayısı taşınır, hiçbir ileti metni, konu satırı ya da bağlantı yer almaz.
- SM8. Her iletinin gerçek sınıfı modelde bilinir. Gerçekte sınıf ancak inceleme sonrası bilinir; bilindiği varsayılıyor ki kaçırılan ile yanlış işaretlenen ayrı ayrı sayılabilsin.
- SM9. Gösterge ağırlıkları sabittir ve puan ağırlıkların toplamıdır. Gerçek düzeneklerde ağırlık öğrenilir ve kayar; sabit ağırlık eğrinin biçimini basitleştirir, iki yanlışın ters yönünü değiştirmez.
- SM10. Küme sınıf oranı bakımından gerçekçi değildir: on altı sahte ve on meşru ileti var. Gerçek bir kutuda meşru ileti sayısı çok daha büyüktür ve yanlış işaretlenen sayısı aynı oranda büyür. Model bu yüzden yanlış pozitifi eksik gösterir.
- SM11. Bir ileti ya işaretlenir ya geçer. Karantina, uyarı şeridi ve kullanıcıya sorma gibi ara durumlar modellenmedi.
- SM12. Zincir tek bir kalıba indirgendi: teslim, etkileşim, kimlik bilgisi girişi, kullanım. Ek dosyayla ilerleyen ve doğrudan ödeme isteyen değişkeler ayrı zincir olarak sayılmadı.
Gösterge Türleri ve Sınıflar
// ileti.mjs — gosterge turleri ve iletilerin gosterge kumesi; model (ileti icerigi yer almaz) export const GOSTERGE = { // gosterge turu: ayirt edicilik agirligi 'gonderen alan adi ilk kez goruluyor': 3, 'gonderen dogrulama kaydi gecmiyor': 3, 'gonderen alani korunan ada benziyor': 3, 'baglanti hedefi metinden ayrisiyor': 3, 'yanit adresi gonderenden farkli': 2, 'beklenmedik ek dosya turu': 2, 'alici kumesi genis': 1, 'olagandisi gonderim saati': 1, 'yanit zinciri disinda ilk temas': 1, 'sure baskisi ifadesi': 1, }; const [A, D, B, L, Y, E, K, S, I, U] = Object.keys(GOSTERGE); export const SINIF = ['toplu', 'hedefli', 'yonetici', 'mesru']; // [ileti kimligi, sinif, tasidigi gostergeler] export const ILETI = [ ['T1', 'toplu', [A, D, L, Y, K, S, U]], ['T2', 'toplu', [A, D, L, E, K, U]], ['T3', 'toplu', [A, D, Y, K, I, U]], ['T4', 'toplu', [A, B, L, K, S, U]], ['T5', 'toplu', [A, D, L, K, U]], ['T6', 'toplu', [D, L, Y, K, S]], ['T7', 'toplu', [A, D, E, K, I, U]], ['T8', 'toplu', [A, L, K, S, I, U]], ['H1', 'hedefli', [B, L, I, U]], ['H2', 'hedefli', [A, L, I]], ['H3', 'hedefli', [B, Y, U]], ['H4', 'hedefli', [D, L]], ['H5', 'hedefli', [B, E, I]], ['Y1', 'yonetici', [B, U]], ['Y2', 'yonetici', [L]], ['Y3', 'yonetici', [B, I]], ['M1', 'mesru', [I]], ['M2', 'mesru', [K, S]], ['M3', 'mesru', []], ['M4', 'mesru', [A, S, I]], ['M5', 'mesru', [E]], ['M6', 'mesru', [S, U]], ['M7', 'mesru', [Y]], ['M8', 'mesru', [K, S, I, U]], ['M9', 'mesru', [A, D, L, Y, K]], ['M10', 'mesru', [A, D, Y, I]], ]; export const puan = (m) => m[2].reduce((a, g) => a + GOSTERGE[g], 0); export const sahte = (m) => m[1] !== 'mesru'; export function esikte(e) { const isaret = ILETI.filter((m) => puan(m) >= e); return { kacan: ILETI.filter((m) => sahte(m) && puan(m) < e), yanlis: isaret.filter((m) => !sahte(m)), yakalanan: isaret.filter(sahte) }; } // [adim, onkosul, adimi goren denetim, adim bitince dusen kalem] export const ZINCIR = [ ['ileti hazirlama', 'hedef adres listesi', null, 0], ['teslim', 'gecerli posta yolu', 'gosterge esigi', 1], ['acilma ve etkilesim', 'alicinin ilgisi', 'kullanici bildirimi', 1], ['kimlik bilgisi girisi', 'inandirici toplama noktasi', 'ikinci etmen', 3], ['toplanan bilginin kullanimi', 'gecerli oturum', 'olagandisi oturum tespiti', 6], ];
// kosum1.mjs — gosterge basina sinif dagilimi ve uc saldiri turunun gosterge sayisi farki import { GOSTERGE, ILETI, SINIF, puan, sahte } from './ileti.mjs'; console.log(`${ILETI.length} ileti, ${ILETI.filter(sahte).length} sahte; ${Object.keys(GOSTERGE).length} gosterge turu, ` + `en yuksek puan ${Object.values(GOSTERGE).reduce((a, b) => a + b, 0)}\n`); console.log(`${'gosterge'.padEnd(36)} ${'ag.'.padStart(3)} ${'toplu'.padStart(5)} ${'hedefli'.padStart(7)} ` + `${'yonetici'.padStart(8)} ${'mesru'.padStart(5)}`); for (const [g, a] of Object.entries(GOSTERGE)) { const c = SINIF.map((s) => ILETI.filter((m) => m[1] === s && m[2].includes(g)).length); console.log(`${g.padEnd(36)} ${String(a).padStart(3)} ${String(c[0]).padStart(5)} ${String(c[1]).padStart(7)} ` + `${String(c[2]).padStart(8)} ${String(c[3]).padStart(5)}`); } console.log(`\n${'sinif'.padEnd(9)} ${'ileti'.padStart(5)} ${'ort. gosterge'.padStart(13)} ${'ort. puan'.padStart(9)} ` + `${'en dusuk puan'.padStart(13)} ${'en yuksek puan'.padStart(14)}`); for (const s of SINIF) { const k = ILETI.filter((m) => m[1] === s), p = k.map(puan); console.log(`${s.padEnd(9)} ${String(k.length).padStart(5)} ` + `${(k.reduce((a, m) => a + m[2].length, 0) / k.length).toFixed(2).padStart(13)} ` + `${(p.reduce((a, b) => a + b, 0) / k.length).toFixed(2).padStart(9)} ${String(Math.min(...p)).padStart(13)} ` + `${String(Math.max(...p)).padStart(14)}`); } const yon = ILETI.filter((m) => m[1] === 'yonetici'), mes = ILETI.filter((m) => m[1] === 'mesru'); console.log(`\nyonetici hedefli iletilerin ortalama gosterge sayisi (${(yon.reduce((a, m) => a + m[2].length, 0) / yon.length).toFixed(2)}), ` + `mesru iletilerinkinden (${(mes.reduce((a, m) => a + m[2].length, 0) / mes.length).toFixed(2)}) dusuk`); console.log(`puani en yuksek 4 ileti: ${[...ILETI].sort((a, b) => puan(b) - puan(a)).slice(0, 4).map((m) => `${m[0]}/${m[1]} (${puan(m)})`).join(', ')}`);
26 ileti, 16 sahte; 10 gosterge turu, en yuksek puan 20 gosterge ag. toplu hedefli yonetici mesru gonderen alan adi ilk kez goruluyor 3 7 1 0 3 gonderen dogrulama kaydi gecmiyor 3 6 1 0 2 gonderen alani korunan ada benziyor 3 1 3 2 0 baglanti hedefi metinden ayrisiyor 3 6 3 1 1 yanit adresi gonderenden farkli 2 3 1 0 3 beklenmedik ek dosya turu 2 2 1 0 1 alici kumesi genis 1 8 0 0 3 olagandisi gonderim saati 1 4 0 0 4 yanit zinciri disinda ilk temas 1 3 3 1 4 sure baskisi ifadesi 1 7 2 1 2 sinif ileti ort. gosterge ort. puan en dusuk puan en yuksek puan toplu 8 5.88 11.50 10 14 hedefli 5 3.00 6.60 6 8 yonetici 3 1.67 3.67 3 4 mesru 10 2.30 3.90 0 12 yonetici hedefli iletilerin ortalama gosterge sayisi (1.67), mesru iletilerinkinden (2.30) dusuk puani en yuksek 4 ileti: T1/toplu (14), T2/toplu (13), T4/toplu (12), M9/mesru (12)
Gösterge tablosu tek tek okunduğunda hangi kalemin hangi sınıfa ait olduğu görünüyor. Geniş alıcı kümesi sekiz toplu iletinin sekizinde var, hedefli ve yönetici hedefli iletilerin hiçbirinde yok; korunan ada benzeyen gönderen alanı ise tersine, bir toplu iletide ve beş dar hedefli iletide geçiyor. Ucuz göstergeler ölçek işaretidir, pahalı göstergeler hazırlık işareti.
Sınıf tablosu dersin merkezî sayısını veriyor. Toplu kimlik avı ileti başına 5,88 gösterge taşıyor, hedefli kimlik avı 3,00, yönetici hedefli kimlik avı 1,67. Düşüş rastlantı değil, tanımın kendisidir: hedef daraldıkça geniş alıcı kümesi, olağandışı saat ve genel gönderim altyapısı gibi ucuz göstergeler ortadan kalkar. Geriye yalnız pahalı göstergeler kalır ve onlar da azdır.
Son satır ölçünün sınırını gösteriyor. Yönetici hedefli iletilerin ortalama gösterge sayısı 1,67, meşru iletilerinki 2,30. Sahte ileti meşru iletiden daha az gösterge taşıyor. Gösterge sayısına bakan hiçbir eşik bu iki kümeyi doğru yönde ayıramaz; ayırmayı deneyen bir eşik, meşru iletileri sahtelerden önce işaretler.
Puan sıralamasının ilk dördü aynı sorunu ağırlık tarafında gösteriyor. Dördüncü sırada meşru bir ileti var ve on iki puanla üç toplu kimlik avı iletisiyle aynı bantta duruyor. Bu ileti bir dış gönderim hizmeti üzerinden çıkan bir abone duyurusudur: ilk kez görülen bir alan adı, geçmeyen bir doğrulama kaydı, gönderenden ayrışan bir yanıt adresi ve metinden ayrışan bir bağlantı hedefi taşır. Göstergelerin hepsi doğru sayılmıştır; iletinin sahte olmaması bunu değiştirmez.
Eşiğin Çöktüğü Yer
// kosum2.mjs — esik taramasi, yapisal yanlis pozitif ve zincirin erken kirma kazanci import { ILETI, ZINCIR, puan, sahte, esikte } from './ileti.mjs'; const SAHTE = ILETI.filter(sahte).length; console.log(`${'esik'.padStart(4)} ${'yakalanan'.padStart(9)} ${'kacan'.padStart(5)} ${'yanlis'.padStart(6)} ` + `${'toplam yanlis'.padStart(13)} ${'kacan sinif dagilimi'.padStart(22)}`); const sonuc = []; for (let e = 13; e >= 2; e--) { const r = esikte(e); sonuc.push({ e, r }); const d = ['toplu', 'hedefli', 'yonetici'].map((s) => `${s[0].toUpperCase()}${r.kacan.filter((m) => m[1] === s).length}`).join(' '); console.log(`${String(e).padStart(4)} ${`${r.yakalanan.length}/${SAHTE}`.padStart(9)} ${String(r.kacan.length).padStart(5)} ` + `${String(r.yanlis.length).padStart(6)} ${String(r.kacan.length + r.yanlis.length).padStart(13)} ${d.padStart(22)}`); } const enaz = sonuc.reduce((a, s) => (s.r.kacan.length + s.r.yanlis.length < a.r.kacan.length + a.r.yanlis.length ? s : a)); const temiz = sonuc.filter((s) => s.r.yanlis.length === 0); const tam = sonuc.filter((s) => s.r.kacan.length === 0); console.log(`\ntoplam yanlisi en aza indiren esik ${enaz.e}: kacan ${enaz.r.kacan.length}, yanlis isaretlenen ${enaz.r.yanlis.length}`); console.log(`sifir yanlis pozitifli en dusuk esik ${Math.min(...temiz.map((s) => s.e))}: orada kacan ${temiz.reduce((a, s) => (s.e < a.e ? s : a)).r.kacan.length}`); console.log(`hic kacirmayan en yuksek esik ${Math.max(...tam.map((s) => s.e))}: orada yanlis isaretlenen ${tam.reduce((a, s) => (s.e > a.e ? s : a)).r.yanlis.length}`); const hep = ILETI.filter((m) => !sahte(m) && puan(m) >= 9); console.log(`esikten bagimsiz isaretlenen mesru ileti ${hep.length}: ${hep.map((m) => `${m[0]} (${puan(m)} puan, ${m[2].length} gosterge)`).join('; ')}`); let kum = 0; const kumul = ZINCIR.map((a) => (kum += a[3])); const kir = ZINCIR.map((a, i) => (a[2] ? i : -1)).filter((i) => i >= 0); console.log(`\nzincir ${ZINCIR.length} adim, denetimli ${kir.length}, denetimsiz ${ZINCIR.length - kir.length}`); console.log(`${'#'.padStart(2)} ${'adim'.padEnd(28)} ${'onkosul'.padEnd(27)} ${'denetim'.padEnd(25)} ${'kumul'}`); ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(28)} ${a[1].padEnd(27)} ${(a[2] ?? '-').padEnd(25)} ${kumul[i]}`)); console.log(`en erken kirilabilen halka ${kir[0] + 1} (dusen kalem ${kir[0] ? kumul[kir[0] - 1] : 0}), ` + `en gec ${kir[kir.length - 1] + 1} (dusen kalem ${kumul[kir[kir.length - 1] - 1]})`); console.log(`erken kirma kazanci ${kumul[kir[kir.length - 1] - 1] - (kir[0] ? kumul[kir[0] - 1] : 0)} kalem; hic kirilmazsa ${kumul[ZINCIR.length - 1]}`);
esik yakalanan kacan yanlis toplam yanlis kacan sinif dagilimi 13 2/16 14 0 14 T6 H5 Y3 12 3/16 13 1 14 T5 H5 Y3 11 6/16 10 1 11 T2 H5 Y3 10 8/16 8 1 9 T0 H5 Y3 9 8/16 8 2 10 T0 H5 Y3 8 9/16 7 2 9 T0 H4 Y3 7 10/16 6 2 8 T0 H3 Y3 6 13/16 3 2 5 T0 H0 Y3 5 13/16 3 3 6 T0 H0 Y3 4 15/16 1 4 5 T0 H0 Y1 3 16/16 0 4 4 T0 H0 Y0 2 16/16 0 8 8 T0 H0 Y0 toplam yanlisi en aza indiren esik 3: kacan 0, yanlis isaretlenen 4 sifir yanlis pozitifli en dusuk esik 13: orada kacan 14 hic kacirmayan en yuksek esik 3: orada yanlis isaretlenen 4 esikten bagimsiz isaretlenen mesru ileti 2: M9 (12 puan, 5 gosterge); M10 (9 puan, 4 gosterge) zincir 5 adim, denetimli 4, denetimsiz 1 # adim onkosul denetim kumul 1 ileti hazirlama hedef adres listesi - 0 2 teslim gecerli posta yolu gosterge esigi 1 3 acilma ve etkilesim alicinin ilgisi kullanici bildirimi 2 4 kimlik bilgisi girisi inandirici toplama noktasi ikinci etmen 5 5 toplanan bilginin kullanimi gecerli oturum olagandisi oturum tespiti 11 en erken kirilabilen halka 2 (dusen kalem 0), en gec 5 (dusen kalem 5) erken kirma kazanci 5 kalem; hic kirilmazsa 11
Kaçan sınıf dağılımı sütunu tarama boyunca aynı şeyi tekrarlıyor. Eşik ondan altıya inerken toplu kimlik avı sıfırlanıyor ve hedefli kimlik avı erimeye başlıyor, ama yönetici hedefli üç ileti altıda hâlâ tam kadro kaçıyor. Y sütunu ancak eşik dörde indiğinde kımıldıyor ve üçte sıfırlanıyor. On üçten üçe inen bir eşik sahte iletilerin tamamını yakalıyor; karşılığında dört meşru ileti işaretleniyor, yani on meşru iletinin beşte ikisi.
Yanlış işaretlenenlerin iki tanesi eşik sorunu değil. On iki ve dokuz puanlı meşru iletiler, yönetici hedefli iletileri yakalayan her eşikte — hatta onları yakalamayan çoğu eşikte de — işaretlenir. İki küme puan bandında iç içe geçmiştir. Bu, ağırlıkları ayarlayarak çözülmez; çözülmesi için meşru toplu gönderimin kendi göstergelerini kaybetmesi gerekir: kendi alan adından çıkması, doğrulama kaydının geçmesi, bağlantı hedefinin metinle uyuşması. Yani düzeltilecek yer eşik değil, meşru akışın kendisidir.
Zincir tablosu üç sütunu kapatıyor. Beş adımın ilki hiçbir denetimin görmediği hazırlık adımıdır. Kırılabilen dört halkanın en erkeni teslimdir ve orada düşen kalem sıfırdır; en geci beşinci adımdır ve oraya gelindiğinde beş kalem düşmüştür. Erken kırma kazancı beş kalemdir; zincir hiç kırılmazsa düşen kalem on bire çıkar. Eşiği yükseltip ikinci halkayı gevşetmek bu yüzden yalnız bir sayının değişmesi değildir: yükü üçüncü ve dördüncü halkaya, yani kullanıcı bildirimine ve ikinci etmene aktarır.
Özet
- 26 iletilik kümede 10 gösterge türü sayıldı. Toplu kimlik avı ileti başına 5,88 gösterge taşıyor, hedefli 3,00, yönetici hedefli 1,67; hedef daraldıkça ucuz göstergeler ortadan kalkıyor.
- Yönetici hedefli iletilerin ortalama gösterge sayısı (1,67) meşru iletilerinkinden (2,30) düşüktür. Yalnız gösterge sayısına bakan bir ölçü bu iki kümeyi ters yönde ayırır.
- Eşik 13’te yanlış pozitif sıfır ve 16 sahte iletinin 14’ü kaçıyor. Eşik 3’te hiçbiri kaçmıyor ve 10 meşru iletinin 4’ü işaretleniyor. Toplam yanlışı en aza indiren eşik 3’tür (0 + 4).
- Kaçan sınıf dağılımı eşik 6’ya kadar 3 yönetici hedefli iletinin tamamını kaçırıyor; bu sütun ancak eşik 4’te kımıldıyor.
- 2 meşru ileti eşikten bağımsız işaretleniyor (12 ve 9 puan). Bu bir eşik ayarı sorunu değil, meşru toplu gönderim akışının aynı göstergeleri taşımasıdır.
- Zincir 5 adım, 1 adım denetimsiz. En erken kırılabilen halka 2. adımdır (0 kalem), en geç 5. adımdır (5 kalem); erken kırma kazancı 5 kalem, hiç kırılmazsa düşen kalem 11’dir.
Sonraki Adım
Bu dersin bütün göstergeleri tek bir kanala aitti ve o kanalın bir ortak yanı vardı: ileti saklanır. Başlıklar okunabilir, alan adı sorgulanabilir, bağlantı hedefi metinle karşılaştırılabilir ve bütün bunlar ileti açılmadan önce yapılabilir. Kısa mesaj ve sesli aramada bu kalemlerin çoğu yoktur; sesli bir aramada geriye kalan tek doğrulanabilir kalem çoğu kez arayan numarasıdır ve o da gösterildiği gibi olmayabilir. Sonraki dersin sorusu budur: kanal başına kaç doğrulama kalemi var, hangi kanalda zincir hangi halkada kırılabiliyor ve bir geri doğrulama yordamı kanal kanal kaç zinciri kırıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.