---
title: 'Model Tersine Çevirme ve Çıkarım Saldırıları'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/model-tersine-cevirme-ve-cikarim-saldirilari'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:33+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

İ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.

```python
# 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.

```python
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.
