Ders 07 / 16
Kötü Amaçlı Yazılım Türleri
On tür yayılma biçimi ve kullandığı tutunma noktasıyla sınıflandırılır: tür başına düşen nokta sayısı, hiç kalıcılık kurmayan iki tür, her nokta türünü kullanan tür sayısı ile aynı noktadaki meşru kalem sayısı ve nokta türlerini ucuzdan pahalıya kapatınca tamamen duran, kısmen duran ve hiç etkilenmeyen tür sayısı.
İçindekiler
Önceki konu uçtaki kalem sayısını daralttı ve otomatik çalıştırılan noktaları tek tek kapattı. Bütün o ölçüm sessiz bir varsayım taşıyordu: uçta henüz hiçbir şey çalışmamıştı. Bu ders o varsayımı kaldırır ve tersinden sorar — kod bir kez çalıştıysa, kapatılmış noktalar bunun ne kadarını durdurur?
Sorunun cevabı çalışan şeyin ne olduğuna değil, nasıl yayıldığına ve nereye tutunduğuna bağlıdır. Bu yüzden sınıflandırma aile adıyla değil, iki ölçülebilir davranışla yapılır: yayılma biçimi ve kullanılan tutunma noktası türü. Ölçülen üç sayı var: bir tür kaç tutunma noktası kullanıyor, bir nokta türünü kaç tür kullanıyor ve o noktayı kapatmak uçtaki kaç meşru kalemi birlikte götürüyor. Bu derste hiçbir bulaşma yöntemi yazılmadı; sayılan şey bulaşmanın bıraktığı kalemdir.
- UK1. On tür, sekiz nokta türü ve uçtaki meşru kalem sayıları kurgusal bölgesel ölçüm ağının
saha dizüstü taban çizgisine aittir. Gerçek bir örnek çalıştırılmıyor; ölçülen şey
nodeile kurulan modeldir. - UK2. Tür adları davranış tanımıdır. Aile adı, kampanya adı ve örnek adı modelde hiç geçmez; aynı davranışı gösteren iki farklı örnek modelde tek satırdır.
- UK3. Bir tür ya bir nokta türünü kullanır ya kullanmaz. Gerçekte aynı tür ortama göre farklı nokta seçer; modelde seçim sabittir, bu da nokta sayısını olduğundan küçük gösterir.
- UK4. Meşru kalem sayıları tek bir ucun taban çizgisinden alındı. Sunucularda bu sayılar daha büyük, şube uçlarında daha küçüktür; oranların yönü değişmez.
- UK5. “Kapatmak” bir nokta türüne yeni kalem eklenmesinin engellenmesi demektir. Var olan meşru kalemlerin de aynı denetimden geçmesi gerektiği için bedel sütunu o kalemleri sayar.
- UK6. Tespit bu derste yok. Kapatılan nokta sayılıyor, görülen nokta sayılmıyor; görünürlük sonraki iki dersin konusudur.
İki Eksen: Yayılma ve Kalıcılık
Model her tür için dört şey tutuyor: davranış tanımı, yayılma biçimi, kullandığı nokta türleri ve döndüğü sonuç. Yayılma biçimi kodun uca nasıl geldiğini, nokta listesi ise geldikten sonra nereye yazıldığını söyler. İki eksen birbirinden bağımsızdır ve karıştırılmaları yaygın bir ölçüm hatasıdır: yayılması hızlı olan tür kalıcılığı zayıf olabilir, hiç yayılmayan tür en çok noktaya tutunabilir.
// tur.mjs — kotu amacli yazilim turleri, yayilma bicimi ve kullandigi tutunma noktalari; model // [tur adi, yayilma bicimi, kullandigi nokta turleri, dondugu sonuc] export const TUR = [ ['ag uzerinden yayilan bilesen', 'otomatik ag', ['servis-tanimi', 'zamanlanmis-gorev'], 'yayilma'], ['kullanici tarafindan acilan bilesen', 'kullanici acmasi', ['acilis-girisi', 'oturum-betigi'], 'uzak erisim'], ['veriyi sifreleyen bilesen', 'ikincil yerlestirme', [], 'erisilebilirlik kaybi'], ['tus ve ekran kaydeden bilesen', 'kullanici acmasi', ['oturum-betigi', 'yukleme-yolu-kancasi', 'olay-aboneligi'], 'gizlilik kaybi'], ['uzaktan komut bekleyen bilesen', 'ikincil yerlestirme', ['servis-tanimi', 'olay-aboneligi'], 'erisim surdurme'], ['merkezden yonetilen ajan', 'otomatik ag', ['acilis-girisi', 'zamanlanmis-gorev', 'servis-tanimi'], 'kaynak devri'], ['islem gucu tuketen bilesen', 'ikincil yerlestirme', ['zamanlanmis-gorev'], 'kaynak tuketimi'], ['bellekte kalan yukleyici', 'kullanici acmasi', [], 'ikinci asamayi getirme'], ['mesru ikiliye ilisen bilesen', 'dosya ilistirme', ['mesru-ikiliye-ilisme'], 'yayilma'], ['cikarilabilir ortamla tasinan bilesen', 'cikarilabilir ortam', ['ortam-otomatik-calistirma'], 'yayilma'], ]; // nokta turu -> bir uctaki mesru kalem sayisi (kurgusal saha dizustu taban cizgisi) export const MESRU = { 'acilis-girisi': 14, 'servis-tanimi': 63, 'zamanlanmis-gorev': 41, 'oturum-betigi': 6, 'yukleme-yolu-kancasi': 3, 'olay-aboneligi': 2, 'mesru-ikiliye-ilisme': 0, 'ortam-otomatik-calistirma': 1, }; export const NOKTA = Object.keys(MESRU); export const kullanan = (n) => TUR.filter((t) => t[2].includes(n)); export const durum = (t, kapali) => t[2].length === 0 ? 'nokta yok' : t[2].every((n) => kapali.includes(n)) ? 'tamamen durur' : t[2].some((n) => kapali.includes(n)) ? 'kismen durur' : 'etkilenmez';
Sekiz nokta türü, önceki konuda envanterlenen otomatik çalıştırma kalemlerinin sınıflarıdır: açılışta çalışan giriş, servis tanımı, zamanlanmış görev, kullanıcı oturum betiği, kütüphane yükleme yolu kancası, kalıcı olay aboneliği, meşru bir ikiliye iliştirilme ve çıkarılabilir ortamın otomatik çalıştırma girişi. Son ikisi ötekilerden ayrılır: bir dosyaya iliştirilme uçta yeni bir giriş üretmez, çıkarılabilir ortamın girişi ise uçta değil takılan ortamda durur.
Tür Başına Nokta, Nokta Başına Tür
// kosum1.mjs — turleri yayilma ve kalicilik davranisiyla siniflandirir, nokta turlerini sayar import { TUR, NOKTA, MESRU, kullanan } from './tur.mjs'; const kalicisiz = TUR.filter((t) => t[2].length === 0); console.log(`${TUR.length} tur, ${NOKTA.length} nokta turu; kalicilik kurmayan tur: ${kalicisiz.length}\n`); console.log(`${'tur'.padEnd(38)} ${'yayilma'.padStart(20)} ${'nokta'.padStart(5)} ${'sonuc'.padStart(22)}`); for (const t of TUR) console.log(`${t[0].padEnd(38)} ${t[1].padStart(20)} ${String(t[2].length).padStart(5)} ${t[3].padStart(22)}`); const yayilma = [...new Set(TUR.map((t) => t[1]))]; console.log(`\n${'yayilma bicimi'.padEnd(20)} ${'tur'.padStart(4)} ${'toplam nokta'.padStart(12)} ${'tur basina'.padStart(10)}`); for (const y of yayilma) { const g = TUR.filter((t) => t[1] === y), n = g.reduce((a, t) => a + t[2].length, 0); console.log(`${y.padEnd(20)} ${String(g.length).padStart(4)} ${String(n).padStart(12)} ${(n / g.length).toFixed(1).padStart(10)}`); } console.log(`\n${'nokta turu'.padEnd(26)} ${'kullanan tur'.padStart(12)} ${'uctaki mesru kalem'.padStart(18)}`); for (const n of NOKTA) console.log(`${n.padEnd(26)} ${String(kullanan(n).length).padStart(12)} ${String(MESRU[n]).padStart(18)}`); console.log(`${'toplam'.padEnd(26)} ${String(TUR.reduce((a, t) => a + t[2].length, 0)).padStart(12)} ` + `${String(Object.values(MESRU).reduce((a, b) => a + b, 0)).padStart(18)}`);
10 tur, 8 nokta turu; kalicilik kurmayan tur: 2 tur yayilma nokta sonuc ag uzerinden yayilan bilesen otomatik ag 2 yayilma kullanici tarafindan acilan bilesen kullanici acmasi 2 uzak erisim veriyi sifreleyen bilesen ikincil yerlestirme 0 erisilebilirlik kaybi tus ve ekran kaydeden bilesen kullanici acmasi 3 gizlilik kaybi uzaktan komut bekleyen bilesen ikincil yerlestirme 2 erisim surdurme merkezden yonetilen ajan otomatik ag 3 kaynak devri islem gucu tuketen bilesen ikincil yerlestirme 1 kaynak tuketimi bellekte kalan yukleyici kullanici acmasi 0 ikinci asamayi getirme mesru ikiliye ilisen bilesen dosya ilistirme 1 yayilma cikarilabilir ortamla tasinan bilesen cikarilabilir ortam 1 yayilma yayilma bicimi tur toplam nokta tur basina otomatik ag 2 5 2.5 kullanici acmasi 3 5 1.7 ikincil yerlestirme 3 3 1.0 dosya ilistirme 1 1 1.0 cikarilabilir ortam 1 1 1.0 nokta turu kullanan tur uctaki mesru kalem acilis-girisi 2 14 servis-tanimi 3 63 zamanlanmis-gorev 3 41 oturum-betigi 2 6 yukleme-yolu-kancasi 1 3 olay-aboneligi 2 2 mesru-ikiliye-ilisme 1 0 ortam-otomatik-calistirma 1 1 toplam 15 130
İlk sayı iki türün hiç kalıcılık kurmamasıdır ve bunun iki ayrı nedeni var. Veriyi şifreleyen bileşen tek koşumda işini bitirir; yeniden başlatmadan sonra çalışmasına gerek yoktur, çünkü verdiği zarar diskte durmaktadır. Bellekte kalan yükleyici ise ikinci aşamayı getirdikten sonra görevini tamamlar. İkisi de yeniden başlatmayla ortadan kalkar ve ikisi için de bu bir kayıp değildir. Kalıcılık noktası kapatmaya dayanan bir savunma bu iki türe hiçbir şey yapmaz — sayılan onbeş noktanın hiçbiri onlara ait değildir.
Yayılma tablosu ikinci farkı veriyor. Ağ üzerinden otomatik yayılan iki tür, tür başına 2,5 nokta kullanıyor; ikincil yerleştirmeyle gelen üç tür yalnızca 1,0. Yayılma otomatikleştikçe kalıcılık da genişliyor, çünkü otomatik yayılan bir bileşen hangi uca düştüğünü bilmez ve birden çok noktaya yazmak orada kalma olasılığını artırır. Elle yerleştirilen bir bileşen ise hedefi bilir; tek doğru nokta yeter.
Üçüncü tablo ölçünün asıl gerilimini gösteriyor. Nokta türlerinin kullanım sıklığı ile o noktadaki meşru kalem sayısı aynı yönde gidiyor. En çok tür tarafından kullanılan iki nokta türü servis tanımı ve zamanlanmış görevdir — üçer tür — ve uçtaki meşru kalemlerin 104’ü, yani toplam 130’un dörtte üçünden fazlası tam olarak bu iki noktada durur. Kötü amaçlı kod bu noktaları rastgele seçmiyor; işletim sisteminin de meşru yazılımın da düzenli iş için kullandığı yeri seçiyor. Kalabalığın içinde durmak, kalabalığın kendisi bir savunmadır.
Kapatma Sırası ve Üç Sonuç
// kosum2.mjs — nokta turlerini ucuzdan pahaliya kapatir, duran ve etkilenmeyen turu sayar import { TUR, NOKTA, MESRU, durum } from './tur.mjs'; const sira = [...NOKTA].sort((a, b) => MESRU[a] - MESRU[b]); const sayim = (kapali) => ['tamamen durur', 'kismen durur', 'etkilenmez', 'nokta yok'] .map((d) => TUR.filter((t) => durum(t, kapali) === d).length); console.log(`${'kapatilan nokta turu'.padEnd(26)} ${'bedel'.padStart(5)} ${'tam'.padStart(4)} ${'kismi'.padStart(5)} ` + `${'etkisiz'.padStart(7)} ${'noktasiz'.padStart(8)}`); const kapali = []; for (const n of [null, ...sira]) { if (n) kapali.push(n); const [tam, kismi, etkisiz, yok] = sayim(kapali); const bedel = kapali.reduce((a, k) => a + MESRU[k], 0); console.log(`${(n ?? 'hicbiri').padEnd(26)} ${String(bedel).padStart(5)} ${String(tam).padStart(4)} ` + `${String(kismi).padStart(5)} ${String(etkisiz).padStart(7)} ${String(yok).padStart(8)}`); } const ucuz = sira.slice(0, 5); console.log(`\nucuz bes nokta turu kapaliyken (bedel ${ucuz.reduce((a, k) => a + MESRU[k], 0)} mesru kalem):`); for (const t of TUR) console.log(` ${t[0].padEnd(38)} ${durum(t, ucuz).padStart(14)} ` + `${t[2].filter((n) => !ucuz.includes(n)).join(', ') || '-'}`);
kapatilan nokta turu bedel tam kismi etkisiz noktasiz hicbiri 0 0 0 8 2 mesru-ikiliye-ilisme 0 1 0 7 2 ortam-otomatik-calistirma 1 2 0 6 2 olay-aboneligi 3 2 2 4 2 yukleme-yolu-kancasi 6 2 2 4 2 oturum-betigi 12 3 2 3 2 acilis-girisi 26 4 2 2 2 zamanlanmis-gorev 67 5 3 0 2 servis-tanimi 130 8 0 0 2 ucuz bes nokta turu kapaliyken (bedel 12 mesru kalem): ag uzerinden yayilan bilesen etkilenmez servis-tanimi, zamanlanmis-gorev kullanici tarafindan acilan bilesen kismen durur acilis-girisi veriyi sifreleyen bilesen nokta yok - tus ve ekran kaydeden bilesen tamamen durur - uzaktan komut bekleyen bilesen kismen durur servis-tanimi merkezden yonetilen ajan etkilenmez acilis-girisi, zamanlanmis-gorev, servis-tanimi islem gucu tuketen bilesen etkilenmez zamanlanmis-gorev bellekte kalan yukleyici nokta yok - mesru ikiliye ilisen bilesen tamamen durur - cikarilabilir ortamla tasinan bilesen tamamen durur -
Kapatma sırası ucuz uçtan başlatıldı ve eğri baştan sonuna kadar yatık değil. İlk üç adım toplam üç meşru kalem bedeliyle iki türü tamamen, iki türü kısmen durduruyor. Dördüncü adım — kütüphane yükleme yolu kancası — üç kalem daha harcıyor ve hiçbir sütunu değiştirmiyor: o noktayı tek bir tür kullanıyor ve o türün başka iki noktası zaten açık. Bedeli olan ve karşılığında sıfır getiren bir adım, katman eklemenin bedava olduğu varsayımının nerede kırıldığını gösterir.
Son iki adım tersine dönüyor. Zamanlanmış görevi kapatmak 41, servis tanımını kapatmak 63 meşru kalem demektir; ikisi birlikte bedeli 67’den 130’a çıkarıyor ve karşılığında beş tamamen duran türü sekize taşıyor. Bu, uçtaki meşru otomatik çalıştırma kalemlerinin tamamının elden geçirilmesi karşılığında üç tür kazanmaktır. Ölçüm bu noktada bir karar sunar, tavsiye değil: üç tür üç yüz otuz kalemin her uçta tek tek onaylanmasına değer mi, yoksa bu iki nokta türü kapatılamayacak kadar kalabalık olduğu için başka bir savunmaya mı bırakılmalı?
Alt liste ucuz beşlinin durumunu tek tek yazıyor ve iki sütunun neden ayrı tutulduğunu gösteriyor. Üç tür tamamen duruyor; ikisi kısmen duruyor, yani hâlâ çalışabiliyor ama nokta seçeneği bire iniyor; üçü hiç etkilenmiyor; ikisinin ise kapatılacak noktası yok. On iki meşru kalem bedeliyle on türün üçü durdu. Kalan yedi tür için nokta kapatmak bitmiş bir savunmadır — geriye kalan tek soru onların çalışırken görülüp görülmediğidir.
Sıralamanın Kendisi Bir Karar
Ucuzdan pahalıya kapatmak tek seçenek değil. Sezgisel olarak daha akla yakın gelen ikinci bir sıralama var: en çok tür tarafından kullanılan noktayı önce kapatmak. İki sıralama aynı sekiz noktayı içerir ve sonunda aynı yere varır; ayrıştıkları yer arada durduğunuz noktadır.
// kosum3.mjs — iki kapatma siralamasi: ucuzdan pahaliya ve cok tur etkileyenden aza import { TUR, NOKTA, MESRU, kullanan, durum } from './tur.mjs'; const ucuz = [...NOKTA].sort((a, b) => MESRU[a] - MESRU[b]); const genis = [...NOKTA].sort((a, b) => kullanan(b).length - kullanan(a).length || MESRU[a] - MESRU[b]); const tam = (k) => TUR.filter((t) => durum(t, k) === 'tamamen durur').length; function egri(sira) { const k = [], nokta = {}; for (const n of sira) { k.push(n); const d = tam(k); if (nokta[d] === undefined) nokta[d] = { adim: k.length, bedel: k.reduce((a, x) => a + MESRU[x], 0) }; } return nokta; } const [a, b] = [egri(ucuz), egri(genis)]; console.log(`ucuz sira : ${ucuz.join(' > ')}`); console.log(`genis sira: ${genis.join(' > ')}\n`); console.log(`${'hedef tam duran tur'.padEnd(19)} ${'ucuz adim'.padStart(9)} ${'ucuz bedel'.padStart(10)} ` + `${'genis adim'.padStart(10)} ${'genis bedel'.padStart(11)}`); for (let d = 1; d <= 8; d++) { if (!a[d] && !b[d]) continue; const f = (x) => x ? [String(x.adim), String(x.bedel)] : ['-', '-']; const [aa, ab] = f(a[d]), [ba, bb] = f(b[d]); console.log(`${String(d).padEnd(19)} ${aa.padStart(9)} ${ab.padStart(10)} ${ba.padStart(10)} ${bb.padStart(11)}`); }
ucuz sira : mesru-ikiliye-ilisme > ortam-otomatik-calistirma > olay-aboneligi > yukleme-yolu-kancasi > oturum-betigi > acilis-girisi > zamanlanmis-gorev > servis-tanimi genis sira: zamanlanmis-gorev > servis-tanimi > olay-aboneligi > oturum-betigi > acilis-girisi > mesru-ikiliye-ilisme > ortam-otomatik-calistirma > yukleme-yolu-kancasi hedef tam duran tur ucuz adim ucuz bedel genis adim genis bedel 1 1 0 1 41 2 2 1 2 104 3 5 12 3 106 4 6 26 - - 5 7 67 5 126 6 - - 6 126 7 - - 7 127 8 8 130 8 130
İki eğri her hedefte ayrışıyor ve ucuz sıralama baştan sona önde. Bir türü tamamen durdurmak ucuz sırada sıfır meşru kalem, geniş sırada kırk bir kalem istiyor. Üç türe varmak ucuz sırada on iki, geniş sırada yüz altı kalem tutuyor — sekiz kat fark. Neden böyle olduğu üçüncü tablodaki hizalanmadan geliyor: en çok tür tarafından kullanılan noktalar aynı zamanda en kalabalık meşru noktalardır ve tek başına kapatıldıklarında hiçbir türü tamamen durdurmazlar, çünkü o türlerin başka noktaları da vardır. Geniş sıralama iki pahalı adımı harcayıp yalnız iki tür kazanıyor.
Geniş sıranın dört türde boş kalması da aynı nedenle: üçüncü adımdan beşinci adıma geçerken sayı üçten beşe atlıyor, dört hiç görünmüyor. Sıralama düzgün bir eğri üretmez; hangi türün hangi nokta kümesini kullandığına bağlı sıçramalar üretir. Sekizinci satırda ikisi de aynı yere, yüz otuz kaleme varıyor — hepsini kapatmak istendiğinde sıralamanın bir önemi kalmaz. Sıralama yalnız yolun ortasında durulacaksa anlamlıdır, ve savunmalar hemen her zaman yolun ortasında durur.
Özet
- 10 tür yayılma biçimi ve tutunma noktasıyla sınıflandırıldı; aile adı hiç kullanılmadı. Toplam 15 nokta kullanımı 8 nokta türüne dağılıyor.
- 2 tür hiç kalıcılık kurmuyor: biri tek koşumda işini bitiriyor, öteki ikinci aşamayı getirip bırakıyor. Nokta kapatmaya dayanan savunma bu ikisine hiçbir şey yapmaz.
- Otomatik ağ yayılımı tür başına 2,5 nokta, ikincil yerleştirme 1,0 nokta kullanıyor: yayılma otomatikleştikçe kalıcılık genişliyor, çünkü hedef önceden bilinmiyor.
- En çok kullanılan iki nokta türü (servis tanımı, zamanlanmış görev) uçtaki 130 meşru kalemin 104’ünü barındırıyor. Kötü amaçlı kod kalabalık noktayı seçer; kalabalık kapatmayı pahalılaştırır.
- 12 meşru kalem bedeliyle 3 tür tamamen, 2 tür kısmen duruyor; 3 tür hiç etkilenmiyor. Bütün noktaları kapatmak 130 kalem bedeliyle 8 türü durdurur, 2 tür yine dışarıda kalır.
- Bedeli olup hiçbir sütunu değiştirmeyen bir adım var (yükleme yolu kancası, 3 kalem). Sıralama da bir karardır: 3 türü durdurmak ucuz sırada 12, en çok tür etkileyenden başlayan sırada 106 kalem tutuyor. Sekiz türün hepsinde ikisi de 130’a varır; sıralama yalnız yolun ortasında durulursa anlamlıdır.
Sonraki Adım
Bu dersin kapatamadığı yedi tür ve hiç kalıcılık kurmayan iki tür aynı yere bakıyor: bir şey çalıştığı anda görülüp durdurulmalı. Bunu üstlenen katman iki ayrı soru sorabilir — “bu kalemi daha önce gördüm mü” ve “bu kalem ne yapıyor”. İki soru aynı olay kümesinde farklı cevap verir ve ikisinin de iki tür yanlışı vardır. Sonraki dersin sorusu budur: aynı çalıştırma kümesinde imza tabanlı ve davranış tabanlı tespit kaç kötü kalemi yakalıyor, kaçını kaçırıyor, kaç meşru kalemi yanlışlıkla işaretliyor ve karar eşiği oynatıldığında bu iki yanlış neden ters yönde hareket ediyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.