Ders 03 / 21
Veri Sızdırma
Sistem yönergesi ve gizli veri ifşasının yalnız sayımla ölçülmesi: 240 kayıtlık kurgu kümede 32 kayıt gizli alan adı taşıyor (23 zararlı, 9 temiz) ve alan sınıfları erişim dizgesi 8, iletişim 10, abone kimliği 9, adres 5 diye dağılıyor. Sızdırma yüzeyi 35 kayıt, 26'sı zararlı. Tam kural süzgeci 25'ini durduruyor ve maskelemenin üstüne kattığı sıfır; gizli alan kuralı çıkarılmış dar süzgeç 16'sını durdururken maskeleme 9 kaydın alanını çıkarıyor. Her iki kurulumda hiçbirinin yakalamadığı kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve en düşük eşikte bile işaretlenmeyen bir kayıt. Maskeleme tek başına bir karar gibi ölçüldüğünde kesinlik 0,7188, duyarlılık 0,2473, yanlış engelleme payı 0,0612 veriyor; ikinci koşumda kalıntı 0'a iniyor.
İçindekiler
Önceki iki ders savunmanın ölçüsünü tek bir soruya bağladı: 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 — modele verilen sistem yönergesinin kendisi, bir abonenin kimliği, bir adres ya da bir erişim dizgesi. Bu tür bir kayıp geri alınamaz: engellenen bir işlem yeniden denenebilir, ifşa olan bir alan geri toplanamaz.
Veri sızdırma bu derste yalnız sayılır. Hiçbir sızdırma yordamı, sorgu biçimi ya da ifşa örneği yazılmaz; yazılan şey dört sayıdır: 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. Bu son sayı dersin asıl bulgusudur.
- SY17. Kayıt kümesi, sınıflar, gizli alan sınıfları ve savunma katmanları kurgudur; gerçek bir kişisel veri ya da erişim dizgesi kullanılmaz. Tohum 20260218.
- SY18. Bu bir saldırı dersi değildir. Koşan kodun tamamı savunma tarafındadır: sayım, maskeleme ve süzgeç. Çalışan bir sızdırma yordamı ya da sorgu biçimi yazılmaz.
- SY19. 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.
- SY20. Kişisel veri ve maskeleme yordamı Uygulama Güvenliği ve Makine Öğrenmesi kurslarında ölçüldü; tekrarlanmaz. Burada yalnız modele giden veride sayım yapılır.
- SY21. Maskeleme bir engelleme değildir: kaydı durdurmaz, yalnız alanı çıkarır. Onu bir karar gibi ölçmek bir yaklaşımdır ve ders bunu ayrıca yazar.
- SY22. Bir kaydın hangi alan sınıfını istediği kayıt numarasından türetilir; bu bir tespit değil, sayımı bölmek için kurulmuş bir dağılımdır.
- SY23. Sızdırma yüzeyi iki koşulun birleşimidir: gizli alan adı bayrağı taşıyan kayıtlar ve
gizli_alan_istegisınıfındaki kayıtlar. İkisi örtüşür, birbirini kapsamaz. - SY24. Duyarlılığın en küçük adımı 1/93 = 0,0108, yanlış engelleme payının adımı 1/147 = 0,0068’dir. Bir kayıtlık bir kalıntı bu bandın tam üstündedir.
Sızdırma Bir Eylem Değil Bir Kayıptır
Sızdırmanın iki hedefi vardır ve ikisi de sistemin kendi bağlamında durur. Birincisi sistem
yönergesi ifşasıdır: modele verilen yönergenin çıktıya taşınması. Zararı metnin gizli olması
değil, savunmanın hangi kurallara dayandığının görünür olmasıdır. İkincisi gizli veri
ifşasıdır: bağlama girmiş bir abone kaydının, adresin ya da erişim dizgesinin yanıtta görünmesi.
Kayıt kümesi ikisini tek bir yapısal bayrakta toplar — gizli_alan_adi — ve dört alan sınıfına
böler: kimlik, iletişim, konum, erişim.
# KURGUDUR. Kayit kumesi, siniflar, gizli alan siniflari ve savunma katmanlari ders # icinde tanimlanir; gercek bir kisisel veri kullanilmaz. 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 # ---- SAVUNMA 4: kisisel veri maskeleme (yalnizca sayim) SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum", "erisim_dizgesi": "erisim"} def maskele(k): """Kurgu: gizli alan adi tasiyan kayitlarda alan cikarilir.""" return {"maskelendi": k["ozellik"]["gizli_alan_adi"]} # ---- 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}
Kaç Kayıt İstiyor
İkinci blok yüzeyi sayar: kaç kayıt gizli alan adı taşıyor, hangi alan sınıfını istiyor ve bu kayıtların kaçı gerçekten zararlı.
ALAN = list(SIR_ALAN) def alan_sinifi(k): """Gizli alan adi tasiyan kayitta hangi alan sinifinin istendigi (kurgu, kayda bagli).""" return ALAN[izno(k["no"]) % len(ALAN)] bayrakli = [k for k in KAYIT if k["ozellik"]["gizli_alan_adi"]] print("gizli alan adi tasiyan kayit:", len(bayrakli), " zararli:", sum(1 for k in bayrakli if zararli(k)), " temiz:", sum(1 for k in bayrakli if not zararli(k))) print("\nalan sinifi istek zararli temiz duyu") for a in ALAN: g = [k for k in bayrakli if alan_sinifi(k) == a] print(f"{a:<16} {len(g):>5} {sum(1 for k in g if zararli(k)):>8}" f" {sum(1 for k in g if not zararli(k)):>6} {SIR_ALAN[a]}") print("\nbayrakli kayitlarin sinif dagilimi") for s in SINIF: n = sum(1 for k in bayrakli if k["sinif"] == s) if n: print(f" {s:<18} {n:>3}") print("\nmaskeleme tek basina bir karar gibi olculurse") m = olc(KAYIT, lambda k: maskele(k)["maskelendi"]) print(f" cikarilan alan {m['dp'] + m['yp']} bunlarin zararlisi {m['dp']}" f" temizi {m['yp']} dokunulmayan zararli {m['yn']}") print(f" kesinlik {m['kesinlik']} duyarlilik {m['duyarlilik']}" f" yanlis engelleme payi {m['yanlis_engelleme_payi']}")
gizli alan adi tasiyan kayit: 32 zararli: 23 temiz: 9 alan sinifi istek zararli temiz duyu abone_kimlik 9 6 3 kimlik iletisim 10 6 4 iletisim adres 5 4 1 konum erisim_dizgesi 8 7 1 erisim bayrakli kayitlarin sinif dagilimi temiz 9 dolayli_yonerge 4 gizli_alan_istegi 14 yetki_asimi 2 kaynak_taklidi 2 bozulmus_girdi 1 maskeleme tek basina bir karar gibi olculurse cikarilan alan 32 bunlarin zararlisi 23 temizi 9 dokunulmayan zararli 70 kesinlik 0.7188 duyarlilik 0.2473 yanlis engelleme payi 0.0612
Otuz iki kayıt gizli alan adı taşıyor ve bunların 9’u temiz. Bu dokuz kayıt bir saldırı değildir: kendi adresini soran ya da kendi abone kimliğini doğrulatmak isteyen sıradan taleplerdir. Gizli alan adı bir suçlama değil bir sayımdır — bayrağın kendisi niyeti göstermez, yalnız kaydın hangi alana dokunduğunu söyler.
Bayrak sınıflara da eşit dağılmıyor. On dördü gizli_alan_istegi sınıfından, ama dokuzu temiz ve
kalan dokuzu dört ayrı zararlı sınıftan geliyor. Sızdırma, tek bir sınıfın davranışı değil, birçok
sınıfın yan ürünü olabilen bir sonuçtur; yalnız bir sınıfı hedef alan bir savunma bu yüzden
yüzeyin bir bölümünü hiç görmez.
Alan sınıfı tablosu bedeli eşitlemez. Sekiz istek erisim_dizgesi sınıfına gidiyor ve yedisi
zararlı. Bir iletişim alanının ifşası rahatsız edicidir, bir erişim dizgesinin ifşası kalıcıdır:
dizge yenilenene kadar geçerlidir ve yenileme haber alınmasına bağlıdır. Sayının büyüklüğü zararın
büyüklüğü değildir.
Son bölüm maskelemeyi bir karar gibi ölçer ve bunun neden yanıltıcı olduğunu gösterir. Kesinlik 0,7188, duyarlılık 0,2473, yanlış engelleme payı 0,0612. Duyarlılığın bu kadar düşük olması maskelemenin kötü bir savunma olduğu anlamına gelmez: maskeleme 93 zararlının 70’ini yakalamayı hiç denemez, çünkü işi engellemek değil alanı çıkarmaktır. Bir savunmanın yanlış ölçüye sokulması, onu ölçmemekten daha yanıltıcıdır.
Katmanın Kattığı ve Kalıntı
Üçüncü blok sızdırma yüzeyini kurar ve üç katmanı sırayla uygular: önce süzgeç durdurur, kalanlarda maskeleme alanı çıkarır, geriye kalan kalıntıdır. Kurulum iki kez koşar — biri tam kural süzgeciyle, öbürü gizli alan kuralı listeden çıkarılmış dar süzgeçle.
DAR = ("yonerge_kipi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor") YUZEY = [k for k in KAYIT if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"] ZARARLI = [k for k in YUZEY if zararli(k)] print("sizdirma yuzeyi:", len(YUZEY), " bunlarin zararlisi:", len(ZARARLI)) print(f"\n{'kurulum':<30} {'durduran':>8} {'maskeleyen':>11} {'kalinti':>8}" f" {'toplam duyarlilik':>18}") for ad, kural in (("tam kural suzgeci", None), ("gizli alan kurali cikarilmis", DAR)): karar = kural_suzgeci if kural is None else (lambda k, kr=kural: kural_suzgeci(k, kr)) s = [k for k in ZARARLI if karar(k)] ek = [k for k in ZARARLI if not karar(k) and maskele(k)["maskelendi"]] print(f"{ad:<30} {len(s):>8} {len(ek):>11}" f" {len(ZARARLI) - len(s) - len(ek):>8} {olc(KAYIT, karar)['duyarlilik']:>18.4f}") kalinti = [k for k in ZARARLI if not kural_suzgeci(k) and not maskele(k)["maskelendi"]] for k in kalinti: print("\nkalinti kaydi no", k["no"], " sinif", k["sinif"], " kaynak", k["kaynak"]) print(" isaretli ozellik:", [o for o in OZELLIK if k["ozellik"][o]] or "yok") print(" puani", round(puan(k), 4), " en dusuk esikte (0.30) isaretlendi mi:", model_suzgeci(k, 0.30)) print(" metni:", k["metin"]) def kume(tohum): """Ayni tanim, baska tohum: kalintinin bandi icin ikinci kosum.""" ks = [] 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])} ks.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz, "metin": METIN[int(r() * len(METIN))], "uzunluk": 40 + int(r() * 260)}) return ks print(f"\n{'kosum':<8} {'bayrakli':>8} {'yuzey':>6} {'zararli':>8} {'dar suzgec':>11}" f" {'maskeleme':>10} {'kalinti':>8}") for ad, ks in (("birinci", KAYIT), ("ikinci", kume(20260219))): y = [k for k in ks if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"] z = [k for k in y if zararli(k)] d = [k for k in z if kural_suzgeci(k, DAR)] e = [k for k in z if not kural_suzgeci(k, DAR) and maskele(k)["maskelendi"]] print(f"{ad:<8} {sum(1 for k in ks if k['ozellik']['gizli_alan_adi']):>8} {len(y):>6}" f" {len(z):>8} {len(d):>11} {len(e):>10} {len(z) - len(d) - len(e):>8}")
sizdirma yuzeyi: 35 bunlarin zararlisi: 26 kurulum durduran maskeleyen kalinti toplam duyarlilik tam kural suzgeci 25 0 1 0.7957 gizli alan kurali cikarilmis 16 9 1 0.6989 kalinti kaydi no 16 sinif gizli_alan_istegi kaynak kullanici isaretli ozellik: yok puani 0.0088 en dusuk esikte (0.30) isaretlendi mi: False metni: mahallede kesinti ne zaman bitecek kosum bayrakli yuzey zararli dar suzgec maskeleme kalinti birinci 32 35 26 16 9 1 ikinci 25 26 16 10 6 0
İlk satır kursun ikinci iddiasının bir örneğidir ve adıyla yazılır: tam kural süzgecinin üstüne
maskeleme eklemek sıfır katıyor. Süzgeç 26 zararlının 25’ini zaten durduruyor, çünkü
gizli_alan_adi onun dört kuralından biri. Maskelemenin dokunacağı hiçbir kayıt kalmıyor, ama
maskeleme yine de 9 temiz kayıttan alanı çıkarıyor ve o kayıtlarda yanıt eksik dönüyor. Eklenen
katman hiçbir yeni zararlı yakalamadan bir bedel yüklüyor; katmanın değeri kendisinden değil,
altındaki katmanın ne bıraktığından gelir.
İkinci satır bunu doğrular. Gizli alan kuralı listeden çıkarıldığında süzgeç 26’nın 16’sını durduruyor, toplam duyarlılık 0,7957’den 0,6989’a iniyor ve maskelemenin dokunacağı 9 kayıt doğuyor. Aynı savunma, aynı kümede, altındaki katmana göre 0 ya da 9 kayıt koruyor. Bir katmanın sayısı tek başına anlamsızdır; ancak yığının geri kalanıyla birlikte okunur.
Üçüncü sayı her iki kurulumda da aynıdır: kalıntı 1. Kayıt 16 gizli_alan_istegi
sınıfındandır, kullanıcıdan gelir ve hiçbir bayrak taşımaz. Puanı 0,0088, yani en düşük eşikte
bile işaretlenmiyor; kural süzgeci bakacağı bayrağı bulamıyor, maskeleme çıkaracağı alanı. Metni de
yardımcı olmuyor — sıradan bir kesinti sorusu. Profili temiz kayıtlardan ayırt edilemeyen bir
zararlı kayıt, hiçbir katmanın yakalayamayacağı kalıntıdır.
Son tablo kalıntının büyüklüğünün ölçülemediğini yazar. Bir kayıt, duyarlılık ekseninde tam olarak bir adımdır (0,0108) ve kümenin çözünürlüğünün üstünde değil tam üstündedir. İkinci tohumla üretilmiş kümede aynı kurulum kalıntıyı 0 buluyor. İki koşumun söylediği şey şudur: kalıntı sıfır değildir ama kaç olduğu bu kümeyle söylenemez. Sıfır olmadığını bilmek yeterlidir, çünkü bir sistemin güvenli sayılması kalıntının sıfır olmasına değil, ne olduğunun yazılmasına bağlıdır.
Özet
- Sızdırmanın kaybı geri alınamaz: engellenen bir işlem yeniden denenebilir, ifşa olan bir alan geri toplanamaz; bu yüzden ölçü durdurma değil sayımdır.
- 32 kayıt gizli alan adı taşıyor ve 9’u temiz; bayrak bir suçlama değil sayımdır ve on dört ayrı
kayıtla
gizli_alan_istegisınıfının dışına, dört zararlı sınıfa yayılır. - Alan sınıfları arasında sayı ile zarar orantılı değildir: en küçük öbek olan erişim dizgesi (8 istek, 7’si zararlı) en kalıcı sonucu taşır.
- Maskeleme bir karar gibi ölçüldüğünde duyarlılığı 0,2473’tür, ama bu onun kötülüğü değil yanlış ölçüye sokulmasıdır; işi engellemek değil alanı çıkarmaktır.
- Tam kural süzgecinin üstünde maskelemenin kattığı 0’dır ve bedeli 9 temiz kayıttan silinen alandır; gizli alan kuralı çıkarıldığında aynı katman 9 kayıt korur.
- Kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve profili temiz kayıtlardan ayırt edilemeyen bir kayıt; ikinci koşumda 0 çıkar, yani büyüklüğü bu kümeyle ölçülemez.
Sonraki Adım
Üç derste yüzey tek bir yerden okundu: modele giren metin. Enjeksiyonun iki biçimi kaynakla ayrıldı, süzgecin eşiği süpürüldü, gizli alan isteyen kayıtlar sayıldı ve hiçbirinin yakalamadığı kalıntı yazıldı. Bütün bu ölçüler modelin okuduğu şeyle ilgiliydi. Oysa bir sistemin elinde okumaktan fazlası vardır — çağırabildiği araçlar, onların yan etkileri ve arkasındaki yetki — ve modelin eğitildiği veri hiç sorulmadı. Böyle bir kaydın zararı bir bilgiyi taşımasından değil, bir eylemi tetiklemesinden doğar, ve savunma da başkalaşır: süzmek yerine sormak. Sonraki ders yan etkili araç adı taşıyan kayıtları sayar ve insan onayı kapısının kesinliğini ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.