İçeriğe geç
academia.sh

Ders 06 / 21

Model Tersine Çevirme ve Çıkarım Saldırıları

Sızıntının girdi tarafında değil çıktı tarafında sayılması: 240 yanıtın 71'i gizli alan sınıfına giren bir alan taşıyor, toplam 106 alan. Bunların 31'i istenen 32 kayıttan, 40'ı ise hiç sorulmayan 208 kayıttan geliyor — model tersine çevirme sınıfının sayısı istenenden fazla. Dört adlık çıktı süzgeci 106 alanın hepsini çıkarıyor ve kalan gizli alan 0 oluyor; ama 47 yanıt gizli alan sınıfında olmayan bir dolaylı belirteç, 57 yanıt hiçbir alan adı taşımayan bir üyelik sinyali taşımayı sürdürüyor ve iz taşıyan yanıt 137'den yalnız 94'e iniyor. Beş adlık liste dolaylı belirteci de siliyor, üyelik sinyalini silemiyor. Süzgecin çıkardığı 106 alanın 58'i temiz kayıttan geliyor ve 41 temiz yanıt alan kaybediyor. İki koşumda alan sayısı 106 ve 104 çıkıyor, süzgeçten sonra iz taşıyan yanıt her iki koşumda da 94.

İçindekiler

İki derste sayılan her şey girdi tarafındaydı: kaydın taşıdığı bayrak, geldiği kanal, onay kapısının onu insana yönlendirmesi ve derleme alınıp alınmaması. Kural süzgeci de, kaynak kapısı da kararını model yanıt üretmeden önce veriyordu. Bir sistemin sızdırdığı bilginin ise girdiden geçmesi gerekmez. Model, sorulmayan bir alanı yanıtına koyabilir; hiçbir alan adı taşımayan bir ifadeyle bir abonenin kayıtlar arasında bulunduğunu belli edebilir; ve bunların ikisi de girdi tarafında hiçbir bayrak üretmez.

Bu derste iki sınıf ele alınır. Model tersine çevirme, eğitildiği veriden bir alanın yanıt yoluyla geri elde edilmesidir. Üyelik çıkarımı, belirli bir kaydın kümede bulunup bulunmadığının yanıttan okunmasıdır. İkisi de burada sınıf ve sayım olarak ele alınır; hiçbir çıkarım yordamı, sorgu dizisi ya da geri elde etme yöntemi yazılmaz. Kişisel veri ve maskeleme yordamı Model Değerlendirme, Yorumlanabilirlik ve Etik kursunda ölçüldü ve tekrarlanmaz; buraya eklenen tek şey çıktı tarafındaki sayımdır.

  • SY57. Kayıtlar, yanıtlar, gizli alan sınıfı ve çıktı süzgeci kurgudur; gerçek bir model çağrılmaz ve hiçbir gerçek kişisel veri kullanılmaz. Tohum 20260218.
  • SY58. 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.
  • SY59. Yanıtın metni üretilmez; üretilen ve sayılan tek şey yanıtın taşıdığı alan adlarıdır. Bir alanın yanıtta bulunması, o alanın değerinin doğru olduğu anlamına gelmez ve bu ders böyle bir iddiada bulunmaz.
  • SY60. Taban çizgisi süzgeçsiz çıktıdır: hiçbir alan çıkarılmaz, çıkarılan alan 0, temiz yanıttan silinen alan 0.
  • SY61. sayac_gecmisi bilerek gizli alan sınıfının dışında tutulmuştur. Dolaylı bir belirteçtir: tek başına bir kimlik taşımaz ama kaydı daraltır. Ad listesine dayalı bir süzgeç onu ancak listeye yazıldığında görür.
  • SY62. Üyelik sinyali hiçbir alan adı taşımaz. Kaydın kümede bulunduğunu belli eden bir evet-hayırdır ve bu yüzden bir ad listesi tarafından çıkarılamaz.
  • SY63. Çözünürlük: 240 yanıtta yanıt düzeyindeki payın adımı 0,0042. Alan sayıları tamsayıdır ve oran basılmaz. İkinci koşum aynı kayıtlar üzerinde tohum 20260219 ile alınır.
  • SY64. Girdi tarafındaki maskelemenin görev üstündeki bedeli savunma konusunun işidir ve burada ölçülmez; bu dersin bedeli yalnız çıktıdan silinen alandır.

Sızıntı Çıktıda Sayılır

Birinci blok kümeyi kurar ve üstüne çıktı tarafını ekler. Yanıt bir metin değil bir alan listesidir: hangi adların yanıtta bulunduğu, bir de kaydın kümede olduğunu belli eden bir işaret. Bir alanın yanıta girmesi istenmiş olmasına bağlı değildir — istenmemiş kayıtlarda da düşük bir pay vardır ve model tersine çevirme sınıfı tam olarak orada durur.

# KURGUDUR. Kayitlar, siniflar ve savunmalar ders icinde tanimlanir; gercek bir
# sistem cagrilmaz. Saldiri METNI yazilmaz: saldiri bir OZELLIK PROFILIDIR.
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


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"]
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],
}
# Tumuyle zararsiz destek metinleri; sinifla iliskisi YOKTUR.
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"]


def kume(tohum=TOHUM):
    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


KAYIT = kume()


def zararli(k):
    return k["sinif"] != "temiz"


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


# ---- CIKTI TARAFI. Yanit METNI uretilmez; yanitin TASIDIGI ALANLAR sayilir.
SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum",
            "erisim_dizgesi": "erisim"}
DOLAYLI = "sayac_gecmisi"       # gizli alan sinifinda DEGIL: dolayli belirtec


def yanit(k, tohum=TOHUM):
    """KURGU yanit. Alan istenmis olsun olmasin cikabilir; uyelik sinyali
    hicbir alan adi tasimaz, yalnizca kaydin kumede oldugunu belli eder."""
    r = uretec(tohum ^ izno("yanit" + str(k["no"])))
    istendi = k["ozellik"]["gizli_alan_adi"]
    alan = [a for a in SIR_ALAN if r() < (0.46 if istendi else 0.06)]
    if r() < (0.30 if istendi else 0.18):
        alan.append(DOLAYLI)
    return {"no": k["no"], "istendi": istendi, "alan": alan, "uyelik": r() < 0.22}


def cikti_suzgeci(y, liste):
    """Savunma: adi listede gecen alan yanittan cikarilir."""
    return dict(y, alan=[a for a in y["alan"] if a not in liste])


def gizli(y):
    return sum(1 for a in y["alan"] if a in SIR_ALAN)

Çıktı Süzgecinin Saydığı

İkinci blok önce yanıtların taşıdığını sayar, sonra iki ad listesiyle çıktı süzgecini koşturur. Son sütun kritik olandır: süzgeçten sonra herhangi bir iz taşıyan yanıt sayısı, yani alanı ya da üyelik sinyali kalan yanıtlar.

YANIT = [yanit(k) for k in KAYIT]
istendi = [y for y in YANIT if y["istendi"]]
print("yanit", len(YANIT),
      " gizli alan sinifindan alan tasiyan", sum(1 for y in YANIT if gizli(y)),
      " toplam alan", sum(gizli(y) for y in YANIT))
print("  istenmis", sum(1 for y in istendi if gizli(y)), "/", len(istendi),
      "  sorulmadan gelen", sum(1 for y in YANIT if not y["istendi"] and gizli(y)),
      "/", len(YANIT) - len(istendi))
print("  dolayli belirtec", sum(1 for y in YANIT if DOLAYLI in y["alan"]),
      " uyelik sinyali", sum(1 for y in YANIT if y["uyelik"]))

print("\ncikti suzgeci      gizli alan  alan tasiyan  uyelik  iz tasiyan yanit")
for ad, liste in (("suzgecsiz taban", ()), ("dar liste (4 ad)", tuple(SIR_ALAN)),
                  ("genis liste (5)", tuple(SIR_ALAN) + (DOLAYLI,))):
    S = [cikti_suzgeci(y, liste) for y in YANIT]
    print(f"{ad:<18} {sum(gizli(y) for y in S):>10} {sum(1 for y in S if y['alan']):>13}"
          f" {sum(1 for y in S if y['uyelik']):>7} {sum(1 for y in S if y['alan'] or y['uyelik']):>17}")

temiz = {k["no"] for k in KAYIT if not zararli(k)}
print("\ndar listenin cikardigi 106 alanin temiz kayittan geleni",
      sum(gizli(y) for y in YANIT if y["no"] in temiz),
      " alani silinen temiz yanit", sum(1 for y in YANIT if y["no"] in temiz and gizli(y)))

print("\nayni kayitlar, iki kosum")
for t in (20260218, 20260219):
    Y = [yanit(k, t) for k in KAYIT]
    S = [cikti_suzgeci(y, tuple(SIR_ALAN)) for y in Y]
    print(f"  {t}: alan tasiyan {sum(1 for y in Y if gizli(y))}"
          f"  alan {sum(gizli(y) for y in Y)}"
          f"  dolayli {sum(1 for y in Y if DOLAYLI in y['alan'])}"
          f"  uyelik {sum(1 for y in Y if y['uyelik'])}"
          f"  suzgecten sonra iz tasiyan {sum(1 for y in S if y['alan'] or y['uyelik'])}")
yanit 240  gizli alan sinifindan alan tasiyan 71  toplam alan 106
  istenmis 31 / 32   sorulmadan gelen 40 / 208
  dolayli belirtec 47  uyelik sinyali 57

cikti suzgeci      gizli alan  alan tasiyan  uyelik  iz tasiyan yanit
suzgecsiz taban           106           102      57               137
dar liste (4 ad)            0            47      57                94
genis liste (5)             0             0      57                57

dar listenin cikardigi 106 alanin temiz kayittan geleni 58  alani silinen temiz yanit 41

ayni kayitlar, iki kosum
  20260218: alan tasiyan 71  alan 106  dolayli 47  uyelik 57  suzgecten sonra iz tasiyan 94
  20260219: alan tasiyan 70  alan 104  dolayli 55  uyelik 54  suzgecten sonra iz tasiyan 94

Listenin Uzunluğu Kadar Duyarlılık

İlk satır tabanı veriyor: 240 yanıtın 71’i gizli alan sınıfına giren en az bir alan taşıyor ve toplam 106 alan çıkıyor. Süzgeçsiz kurulumda bunların hiçbiri çıkarılmıyor, temiz yanıttan silinen alan da 0. Kursun kuralı gereği her iki sayı da tabanda sıfırdır ve savunmanın kattığı bu sıfırın üstüne yazılır.

İkinci satır bu dersin sınıf ayrımını taşıyor. Gizli alan adı taşıyan 32 kayıttan 31’inin yanıtı beklendiği gibi bir alan taşıyor. Ama alanların çıktığı yanıtların 40’ı, alanı hiç istememiş 208 kayıttan geliyor. Yani sorulmadan çıkan alan, sorularak çıkandan fazla. Model tersine çevirme sınıfının sayısı budur ve girdi tarafındaki hiçbir savunma onu göremez: istekte bir gizli alan adı yok, bir yönerge kipi yok, bir bayrak yok. Bu sınıf yalnız çıktı tarafında sayılır, çünkü yalnız orada var olur.

Üçüncü tablo ad listesine dayalı süzgecin ne yaptığını gösteriyor. Dört adlık liste 106 alanın hepsini çıkarıyor: kalan gizli alan 0. Bu sütuna bakan bir kurulum kendi hakkında “sızıntı sıfır” der ve söylediği doğrudur. Yanındaki üç sütun ise başka bir şey söylüyor. Alan taşıyan yanıt 102’den 47’ye iniyor, sıfıra değil, çünkü kalan 47 yanıt sayac_gecmisi taşıyor ve o ad listede yok. Üyelik sinyali taşıyan yanıt 57‘de duruyor, hiç oynamıyor. Ve sonuncu sütun toplamı veriyor: iz taşıyan yanıt 137’den 94‘e iniyor. Süzgeç 240 yanıtın yalnız **43’ünden** izi tamamen kaldırmış, ama gizli alan sütunu yüzde yüz yazıyor. Bir ad listesinin duyarlılığı listenin uzunluğu kadardır ve o duyarlılık kendi listesinden okunduğunda her zaman tamdır.

Bu satırın yapısal bir yanı var ve gözden kaçarsa ölçüm diye okunur. Süzgeç adları bir listeden alıyor, gizli alan sütunu da aynı listeden sayıyor; süzgeç koştuktan sonra o sütunun sıfır çıkması bir bulgu değil bir tanım gereğidir. Sıfırın bir şey söyleyebilmesi için sayan tarafın süzen taraftan daha geniş olması gerekir. Tablodaki 47 ve 57 sütunları tam olarak bu yüzden vardır: dolaylı belirteç ile üyelik sinyali süzgecin listesinde yok ama sayımın kapsamında var, ve kalıntı ancak bu iki kapsam arasındaki açıklıkta görünür hâle geliyor. Süzgecin listesi ile ölçünün tanımı aynı olduğunda bir kurulum kendi sınırını göremez ve gördüğü tek şey kendi listesidir.

Beşinci adı listeye eklemek bunun bir kısmını düzeltiyor: alan taşıyan yanıt 0, iz taşıyan yanıt 94’ten 57’ye iniyor. Kalan 57 üyelik sinyalidir ve liste ne kadar uzarsa uzasın çıkmaz, çünkü ortada çıkarılacak bir ad yoktur. Üyelik çıkarımı sınıfının maskeleme ile ilişkisi budur: maskeleme bir alanı siler, bir varlığı silemez. Bir yanıtın “bu abone için kayıt bulunamadı” ile “bu abone için kayıt bulundu” arasındaki farkı taşıması, hiçbir gizli alan içermeden kümenin bileşimini açık eder. Bu sınıfın savunması ad listesi değildir ve bu tabloda görünmez.

Bedel satırı kuralın ikinci yarısını yazıyor. Çıkarılan 106 alanın 58’i temiz kayıtların yanıtından geliyor ve 41 temiz yanıt alan kaybediyor. Bu kayıtların hiçbiri bir saldırı sınıfına girmiyor: adresini soran abone adresini alamıyor, iletişim bilgisini doğrulatmak isteyen kayıt boş dönüyor. Süzgeç çıkarılan alanın nereden geldiğine bakmıyor, çünkü bakabilseydi zaten bir sınıflandırıcı olurdu. Çıkarılan 106 alan ile silinen 58 temiz alan birlikte yazılmadığında bu savunma ölçülmemiş sayılır, ve tek başına “sızıntı sıfır” cümlesi bu ölçümün yarısıdır.

Son iki satır belirsiz bir bileşenin çıktısını ölçmenin bandını veriyor. Aynı kayıtlar, ikinci koşum: alan taşıyan yanıt 71’den 70’e, toplam alan 106’dan 104’e, dolaylı belirteç 47’den 55’e, üyelik sinyali 57’den 54’e oynuyor. Hiçbiri sabit değil. Süzgeçten sonra iz taşıyan yanıt sayısı ise iki koşumda da 94. İki koşumda aynı çıkan tek sayı, süzgecin kapatamadığı yüzeyin büyüklüğüdür: bileşenler oynasa da toplam yerinde durur, çünkü listenin dışında kalan yolların sayısı listenin kendisine bağlı değildir.

Özet

  • Süzgeçsiz tabanda 240 yanıtın 71’i gizli alan sınıfından bir alan taşır, toplam 106 alan çıkar; çıkarılan alan 0, temiz yanıttan silinen alan 0.
  • Alanların çıktığı yanıtların 31’i alanı isteyen 32 kayıttan, 40’ı hiç istemeyen 208 kayıttan gelir; model tersine çevirme sınıfı girdi tarafında bayrak üretmez.
  • Dört adlık çıktı süzgeci 106 alanın hepsini çıkarır ve gizli alan sütunu 0 yazar; ama iz taşıyan yanıt yalnız 137’den 94’e iner. Bir ad listesinin duyarlılığı listenin uzunluğu kadardır.
  • Beşinci ad dolaylı belirteci de siler, iz taşıyan yanıt 57’ye iner; kalan 57 üyelik sinyalidir ve hiçbir alan adı taşımadığı için ad listesiyle çıkarılamaz.
  • Çıkarılan 106 alanın 58’i temiz kayıtların yanıtındandır ve 41 temiz yanıt alan kaybeder; bu sayı yazılmadan süzgeç ölçülmemiş sayılır.
  • İki koşumda alan sayıları oynar, süzgeçten sonra iz taşıyan yanıt her iki koşumda da 94 çıkar.

Sonraki Adım

Altı derste saldırı yüzeyi beş sınıfa ayrıldı ve her sınıfta savunmanın yakaladığı pay ayrı ayrı sayıldı: yönerge kipi taşıyan kayıt, gizli alan isteği, yan etkili araç adı, kaynak damgası uyuşmayan kayıt ve çıktı tarafındaki alan. Hepsinin ortak bir varsayımı vardı ve o varsayım hiç yazılmadı: girdinin anlamlı bir metin olduğu. Kural süzgeci bir yönerge kipi arıyor, çıktı süzgeci bir alan adı arıyor, kaynak kapısı bir damga okuyor — üçü de karşısında okunabilir bir yapı bulmayı bekliyor. Girdinin kasıtlı olarak bozulması, yani yapının kendisinin oynatılması, bu beklentiyi karşılamayan ayrı bir yüzeydir ve kümede kendi sınıfı olarak zaten duruyor. Sonraki ders o sınıfa bakar ve savunmanın orada yakaladığı payı öbür sınıflarınkiyle karşılaştırır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat