Ders 02 / 21
Jailbreak Teknikleri
Güvenlik süzgecinin atlatılmasının bir yordam olarak değil bir eşik sorusu olarak ölçülmesi: aynı 240 kayıtlık kurgu kümede eşik 0,30'dan 0,80'e çıkarken kesinlik 0,7568'den 0,9787'e yükseliyor, duyarlılık 0,9032'den 0,4946'ya düşüyor ve yanlış engelleme payı 0,1837'den 0,0068'e iniyor. Eşiği yükseltmenin değişim oranı 0,50'ye kadar bire bir (7'ye 7, 11'e 12), 0,50'nin üstünde 2,33 ve 3,25 oluyor; atlatmaya en açık bölge burasıdır. Sınıf başına duyarlılık tabloda ayrı okunuyor ve savunmanın ilk çöktüğü sınıf bozulmuş girdi (0,6842'den 0,2105'e). İkinci koşumda eşik 0,40 ve 0,60'ta duyarlılık aynı kalırken 13 ve 9 kaydın kararı değişiyor.
İçindekiler
Bir önceki ders kural süzgecini ölçtü: dört bayrağa bakıyor, 93 zararlının 74’ünü durduruyor, 23 temiz kaydı yanlışlıkla engelliyor. Kararı keskindir — bayrak ya vardır ya yoktur. Puan üreten bir süzgeç araya bir eşik koyar, ve eşik bir ayar olduğu için savunmayı işletenin elindedir. Nereye konduğu bir yapılandırma ayrıntısı gibi görünür; oysa yüzeyin ne kadarının açık kaldığını belirleyen şey odur.
Güvenlik süzgecinin atlatılması burada bir yordam olarak ele alınmaz. Hiçbir atlatma yöntemi, şablonu ya da örneği yazılmaz; yazılan tek şey sınıf adı ve savunmanın o sınıfta yakaladığı paydır. Soru şudur: eşik yükseldikçe kesinlik ile duyarlılık nasıl ters yönde gider, savunmanın ilk çöktüğü sınıf hangisidir ve atlatmaya en açık bölge hangi eşiğin üstünde başlar.
- SY9. Kayıt kümesi, sınıflar ve savunma katmanları kurgudur; bir önceki dersin tanımı değiştirilmeden sürer. Tohum 20260218.
- SY10. Bu bir saldırı dersi değildir. Koşan kodun tamamı savunma tarafındadır: puanlama, eşik, süzgeç ve sayım. Çalışan bir atlatma yöntemi, şablonu ya da yönerge dizisi yazılmaz.
- SY11. Saldırı bir metin değil bir öznitelik profilidir; kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur.
- SY12. Model temelli süzgeç bir benzeticidir: ağırlıklı bir toplam, kaynağa bağlı bir ek ve dar bir belirsizlik payı üretir. Gerçek bir sınıflandırıcı eğitilmez.
- SY13. Süpürülen eşikler beş noktadır; ara değerler ölçülmedi ve eğrinin aralarında düz olduğu varsayılmaz.
- SY14. Sınıf başına duyarlılık o sınıftaki kayıt sayısına bölünür;
yetki_asimi10 kayıttır ve orada bir kaydın değeri 0,1000’dir. - SY15. İkinci koşumda küme değişmez, yalnız puanın belirsizlik payı ikinci tohumla yeniden çekilir. Ölçülen şey modelin koşum değişkenliğidir.
- SY16. Duyarlılığın en küçük adımı 1/93 = 0,0108, yanlış engelleme payının adımı 1/147 = 0,0068’dir.
Eşik Bir Savunma Değil, Bir Takas Noktasıdır
Model temelli süzgeç her kayda bir puan verir: bayrakların ağırlıklı toplamı, kaynağa bağlı bir ek ve dar bir belirsizlik payı. Puan bir karar değildir; karar eşikle doğar. Eşik düşükse süzgeç çok kayıt işaretler, yüksekse az. Bu, savunmanın ne kadar iyi olduğunu değil nerede durduğunu belirleyen bir ayardır ve iki sayıyı aynı anda ters yönde oynatır.
# KURGUDUR. Kayit kumesi, siniflar, oznitelikler ve savunma katmanlari ders icinde # tanimlanir; gercek bir model uc noktasi cagrilmaz. Saldiri METNI yazilmaz. TOHUM, M32 = 20260218, 0xFFFFFFFF def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 def izno(m): h = 2166136261 for c in str(m): h = ((h ^ ord(c)) * 16777619) & M32 return h # ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi", "kaynak_taklidi", "bozulmus_girdi"] KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"] # Ozellikler yapisaldir; hicbiri calisan bir yuk degildir. OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"] # Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var: # gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir. PROFIL = { "temiz": [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05], "dolayli_yonerge": [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12], "gizli_alan_istegi": [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08], "yetki_asimi": [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07], "kaynak_taklidi": [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06], "bozulmus_girdi": [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62], } KAYNAK_PAYI = { "temiz": [0.72, 0.20, 0.08], "dolayli_yonerge": [0.05, 0.70, 0.25], "gizli_alan_istegi": [0.55, 0.30, 0.15], "yetki_asimi": [0.40, 0.35, 0.25], "kaynak_taklidi": [0.10, 0.60, 0.30], "bozulmus_girdi": [0.65, 0.20, 0.15], } # Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR; # sinif bilgisi yalnizca ozellik profilinde durur. METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi", "sayac endeksi yanlis girilmis olabilir", "mahallede kesinti ne zaman bitecek", "tarife basamagimi ogrenmek istiyorum", "ariza kaydim icin ekip ne zaman gelir", "adres degisikligi nasil yapilir"] KAYIT = [] for i in range(240): r = uretec(TOHUM + 6151 * i) s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])] kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])] oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])} KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz, "metin": METIN[int(r() * len(METIN))], "uzunluk": 40 + int(r() * 260)}) def zararli(k): return k["sinif"] != "temiz" # ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir) def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor")): return any(k["ozellik"][o] for o in kurallar) # ---- SAVUNMA 2: model temelli suzgec (puan + esik) AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44, "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38, "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12} KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12} def puan(k): p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]] r = uretec(TOHUM ^ izno(k["no"])) return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6) def model_suzgeci(k, esik=0.40): return puan(k) >= esik # ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir def olc(kayitlar, karar): dp = yp = dn = yn = 0 for k in kayitlar: isaret, gercek = karar(k), zararli(k) if isaret and gercek: dp += 1 elif isaret and not gercek: yp += 1 elif not isaret and gercek: yn += 1 else: dn += 1 kesinlik = dp / (dp + yp) if dp + yp else 0.0 duyarlilik = dp / (dp + yn) if dp + yn else 0.0 return {"dp": dp, "yp": yp, "yn": yn, "dn": dn, "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4), "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}
Süpürme ve Değişim Oranı
İkinci blok beş eşiği süpürür, sonra her adımda neyin neye takas edildiğini sayar: eşik bir basamak yükseldiğinde kaç zararlı fazladan kaçıyor ve karşılığında kaç temiz kayıt serbest kalıyor.
ESIK = (0.30, 0.40, 0.50, 0.60, 0.80) print("esik isaretlenen durdurulan yanlis alarm kacan kesinlik duyarlilik yanlis eng") for e in ESIK: m = olc(KAYIT, lambda k, e=e: model_suzgeci(k, e)) print(f"{e:.2f} {m['dp'] + m['yp']:>12} {m['dp']:>11} {m['yp']:>13} {m['yn']:>6}" f" {m['kesinlik']:>9.4f} {m['duyarlilik']:>11.4f} {m['yanlis_engelleme_payi']:>11.4f}") print("\nesigi yukseltmenin degisimi") print("adim kacan zararli artisi serbest kalan temiz oran ust esikte yanlis alarm") for a, b in zip(ESIK, ESIK[1:]): ma = olc(KAYIT, lambda k, e=a: model_suzgeci(k, e)) mb = olc(KAYIT, lambda k, e=b: model_suzgeci(k, e)) dz, dt = mb["yn"] - ma["yn"], ma["yp"] - mb["yp"] print(f"{a:.2f} -> {b:.2f} {dz:>20} {dt:>20} {dz / dt:>5.2f} {mb['yp']:>22}") print("\nfarklarin kumenin cozunurlugune gore buyuklugu") print("adim duyarlilik farki adim yanlis eng farki adim") for a, b in zip(ESIK, ESIK[1:]): ma = olc(KAYIT, lambda k, e=a: model_suzgeci(k, e)) mb = olc(KAYIT, lambda k, e=b: model_suzgeci(k, e)) fd = ma["duyarlilik"] - mb["duyarlilik"] fy = ma["yanlis_engelleme_payi"] - mb["yanlis_engelleme_payi"] print(f"{a:.2f} -> {b:.2f} {fd:>17.4f} {fd / (1 / 93):>5.1f} {fy:>17.4f}" f" {fy / (1 / 147):>5.1f}")
esik isaretlenen durdurulan yanlis alarm kacan kesinlik duyarlilik yanlis eng 0.30 111 84 27 9 0.7568 0.9032 0.1837 0.40 97 77 20 16 0.7938 0.8280 0.1361 0.50 74 66 8 27 0.8919 0.7097 0.0544 0.60 64 59 5 34 0.9219 0.6344 0.0340 0.80 47 46 1 47 0.9787 0.4946 0.0068 esigi yukseltmenin degisimi adim kacan zararli artisi serbest kalan temiz oran ust esikte yanlis alarm 0.30 -> 0.40 7 7 1.00 20 0.40 -> 0.50 11 12 0.92 8 0.50 -> 0.60 7 3 2.33 5 0.60 -> 0.80 13 4 3.25 1 farklarin kumenin cozunurlugune gore buyuklugu adim duyarlilik farki adim yanlis eng farki adim 0.30 -> 0.40 0.0752 7.0 0.0476 7.0 0.40 -> 0.50 0.1183 11.0 0.0817 12.0 0.50 -> 0.60 0.0753 7.0 0.0204 3.0 0.60 -> 0.80 0.1398 13.0 0.0272 4.0
Süpürme tablosu tek yönlü bir iyileşme göstermez. Eşik 0,30’dan 0,80’e çıkarken kesinlik 0,7568’den 0,9787‘e yükseliyor, yanlış engelleme payı 0,1837’den 0,0068‘e iniyor ve işaretlenen 111 kayıt 47’ye düşüyor. Aynı hareket duyarlılığı 0,9032’den 0,4946‘ya indiriyor: en yüksek eşikte savunma **93 zararlının 47’sini kaçırıyor**. Yalnız kesinlik raporlanan bir kurulum 0,80’de kusursuza yakın görünür; kaçan sütunu yazılmadığı sürece bu görüntü sürer.
İkinci tablo eşik seçimini bir tercih olmaktan çıkarıp bir hesaba dönüştürür. 0,30’dan 0,50’ye kadar takas bire birdir: 7 zararlıya karşılık 7 temiz kayıt, sonra 11’e karşılık 12. 0,50’nin üstünde oran kırılıyor: 0,50 → 0,60 adımında 3 temiz kayıt 7 zararlıya mal oluyor (2,33), 0,60 → 0,80 adımında 4 temiz kayıt 13 zararlıya (3,25).
Atlatmaya en açık bölge burasıdır. Yanlış alarm şikâyetini azaltmak için eşiği 0,50’nin üstüne çıkaran bir savunma, kazandığı temiz trafiğin iki ila üç katı kadar zararlıyı serbest bırakır ve bunu hiçbir gösterge kötüleşmeden yapar: kesinlik yükselir, yanlış engelleme payı düşer, işaretlenen kayıt azalır. Atlatma burada bir yöntemle değil, savunmayı işletenin kendi ayarıyla açılır.
Son sütun bu bölgenin niçin en pahalı olduğunu yazar. Eşik 0,60’ta yanlış alarm 5 kayıttır, 147 temizin 0,0340’ı; oradan 0,80’e çıkmak 4 temiz kayıt kazandırıp 13 zararlıyı serbest bırakıyor. Gevşetmenin en pahalı olduğu yer, yanlış alarmın zaten en az olduğu yerdir: kazanılacak temiz trafik tükendiğinde her adım yalnız kaçan zararlıyı büyütür.
Üçüncü tablo bu farkların ölçülebilir olup olmadığını söyler. Duyarlılık farklarının en küçüğü 0,0752, kümenin adımının (0,0108) yedi katı; yanlış engelleme farklarının en küçüğü 0,0204, adımın (0,0068) üç katı. Süpürmenin hiçbir basamağı çözünürlüğün altında kalmıyor, dolayısıyla dört adımın tamamı gerçek bir ölçümdür. Tabana en yakın olan 0,50 → 0,60 adımıdır: ölçülebilir, ama üzerine politika kurulmayacak kadar ince.
Savunma Hangi Sınıfta Önce Çöker
Toplam duyarlılık bir ortalamadır ve beş zararlı sınıfın hepsini aynı kefeye koyar. Üçüncü blok onu sınıf başına ayırır ve yanına kural süzgecinin aynı sınıflardaki payını koyar.
ESIK = (0.30, 0.40, 0.50, 0.60, 0.80) print("sinif basina duyarlilik: savunmanin o sinifta yakaladigi pay") print(f"{'sinif':<18} {'kayit':>5} {'kural':>7} " + " ".join(f"{e:>6.2f}" for e in ESIK)) for s in SINIF[1:]: g = [k for k in KAYIT if k["sinif"] == s] kr = sum(1 for k in g if kural_suzgeci(k)) / len(g) print(f"{s:<18} {len(g):>5} {kr:>7.4f} " + " ".join(f"{sum(1 for k in g if model_suzgeci(k, e)) / len(g):>6.4f}" for e in ESIK)) def puan_ikinci(k): """Ayni kayit, ikinci kosum: puanin gurultusu ikinci tohumla yeniden cekilir.""" p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]] r = uretec(20260219 ^ izno(k["no"])) return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6) print(f"\n{'esik':<5} {'duyarlilik':>21} {'adim':>5} {'yanlis engelleme':>21} {'adim':>5}" f" {'karari degisen':>15}") for e in ESIK: m1 = olc(KAYIT, lambda k, e=e: model_suzgeci(k, e)) m2 = olc(KAYIT, lambda k, e=e: puan_ikinci(k) >= e) fd = abs(m2["duyarlilik"] - m1["duyarlilik"]) fy = abs(m2["yanlis_engelleme_payi"] - m1["yanlis_engelleme_payi"]) d = sum(1 for k in KAYIT if model_suzgeci(k, e) != (puan_ikinci(k) >= e)) print(f"{e:<5.2f} {m1['duyarlilik']:>10.4f} {m2['duyarlilik']:>10.4f} {fd / (1 / 93):>5.1f}" f" {m1['yanlis_engelleme_payi']:>10.4f} {m2['yanlis_engelleme_payi']:>10.4f}" f" {fy / (1 / 147):>5.1f} {d:>15}")
sinif basina duyarlilik: savunmanin o sinifta yakaladigi pay sinif kayit kural 0.30 0.40 0.50 0.60 0.80 dolayli_yonerge 24 1.0000 1.0000 1.0000 0.9583 0.8333 0.6667 gizli_alan_istegi 17 0.9412 0.9412 0.8824 0.7059 0.5882 0.4706 yetki_asimi 10 0.9000 0.9000 0.9000 0.8000 0.6000 0.4000 kaynak_taklidi 23 0.8696 0.9565 0.8696 0.8261 0.8261 0.6087 bozulmus_girdi 19 0.2632 0.6842 0.4737 0.2105 0.2105 0.2105 esik duyarlilik adim yanlis engelleme adim karari degisen 0.30 0.9032 0.9140 1.0 0.1837 0.1837 0.0 5 0.40 0.8280 0.8280 0.0 0.1361 0.1293 1.0 13 0.50 0.7097 0.7419 3.0 0.0544 0.0544 0.0 11 0.60 0.6344 0.6344 0.0 0.0340 0.0136 3.0 9 0.80 0.4946 0.4624 3.0 0.0068 0.0068 0.0 5
Sınıf tablosu, tek bir duyarlılık sayısının neyi gizlediğini gösterir. Eşik 0,50’de toplam duyarlılık
0,7097 iken dolayli_yonerge sınıfında 0,9583, bozulmus_girdi sınıfında 0,2105: fark 0,7478 ve
savunma birincisinde neredeyse eksiksiz, ikincisinde neredeyse yok. Bozulmuş girdi ilk çöken
sınıftır — daha 0,40’ta 0,4737’ye iniyor, 0,50’de dibe vurup üç eşik boyunca orada kalıyor. Nedeni
ağırlık tablosundadır: o sınıfın taşıdığı iki bayrağın ağırlıkları eşiği geçmeye yetmez. Kural
süzgecinin payı da orada düşüktür (0,2632), çünkü o iki bayrak kural listesinde hiç yoktur. Bu
sınıfın kendisi ayrı bir derste ele alınır.
Kural sütunu bir karşılaştırma daha verir: eşik 0,50’de model süzgeci dolayli_yonerge dışında her
sınıfta ve toplamda kural süzgecinin altındadır (0,7097’ye karşı 0,7957). Daha yüksek kesinlik daha
iyi savunma demek değildir; iki sayı ayrı yönlere gider ve hangisinin seçileceği bir ölçüm değil
bir karardır.
Doğru soru “hangisi daha iyi” değil “hangi eşikte hangisi baskın”dır. Kural süzgecinin üçlüsü 0,7629 / 0,7957 / 0,1565. Model süzgecinin üçünde birden onu geçtiği tek nokta 0,40’tır: 0,7938 / 0,8280 / 0,1361. Böyle bir nokta bulunması zorunlu değildir; başka bir kümede hiçbir eşikte baskın olmaması da olağandır.
İkinci koşum tablosu bandı iki eksende birden verir; adim sütunları farkı kümenin adımına böler.
Eşik 0,40 ve 0,60’ta duyarlılık iki koşumda tamamen aynı çıkıyor, ama aynı eşiklerde 13 ve 9
kaydın kararı değişiyor: toplam durur, tek tek kayıtlar durmaz. Duyarlılıkta 0,30 bir adım, 0,50
ile 0,80 üç adım oynuyor; yanlış engellemede 0,40 bir adım, 0,60 üç adım. Bir adımlık oynamalar
bandın tam üstündedir ve bulgu sayılmaz; üç adımlık farklar ölçülebilir ama bir eşik seçimini
taşımaz. İki eksenin sonucu aynıdır: bu kümede eşiği ondalık hassasiyetle seçmek anlamsızdır.
Özet
- Eşik bir savunma değil bir takas noktasıdır: yükseldikçe kesinlik 0,7568’den 0,9787’e çıkar, duyarlılık 0,9032’den 0,4946’ya iner, yanlış engelleme payı 0,1837’den 0,0068’e düşer.
- Eşiği yükseltmenin değişim oranı 0,50’ye kadar bire birdir; üstünde serbest kalan her temiz kayıt 2,33 ve 3,25 zararlıya mal olur.
- Atlatmaya en açık bölge 0,50’nin üstüdür ve hiçbir gösterge kötüleşmeden açılır; en pahalı olduğu yer yanlış alarmın zaten en az olduğu yerdir (0,60’ta 5 kayıt, 0,0340).
- Sınıf başına duyarlılık ortalamanın gizlediğini açar: eşik 0,50’de dolaylı yönerge 0,9583, bozulmuş girdi 0,2105; ilk çöken sınıf bozulmuş girdidir ve kural süzgeci de orada zayıftır.
- Süpürmenin hiçbir basamağı çözünürlüğün altında değildir (en küçük fark duyarlılıkta 7, yanlış engellemede 3 adım); dört adımın tamamı gerçek bir ölçümdür.
- İkinci koşumda 0,40 ve 0,60’ta duyarlılık aynı kalır ama 13 ve 9 kaydın kararı değişir; bir adımlık oynamalar bandın tam üstünde olduğu için bulgu sayılmaz.
Sonraki Adım
Bu iki derste savunmanın ölçüsü hep aynı soruya bağlıydı: kayıt durduruldu mu, durdurulmadı mı. Kimi zararın ise durdurmayla ilgisi yoktur. Bir kayıt geçtiğinde kaybedilen şey bazen bir eylem değil bir bilgidir: sistem yönergesinin kendisi, bir abonenin kimliği ya da bir erişim dizgesi. Orada savunma da başkalaşır — engellemek yerine alanı çıkarmak, yani maskeleme. Sonraki ders yalnız sayar: gizli alan adı taşıyan kaç kayıt var, maskeleme kaçından alanı çıkarıyor, süzgeç kaçını yakalıyor ve geriye hiçbirinin yakalamadığı kaç kayıt kalıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.