İçeriğe geç
academia.sh

Ders 13 / 21

Güvenilmeyen İçerik İşaretleme

Hiçbir kaydı engellemeyen bir savunmanın sayılması: kullanıcı dışı kaynaktan gelen metin veri olarak işaretlenir ve yönerge kipi taşısa bile yönerge sayılmaz. Savunmasız tabanda durdurulan zararlı 0, yanlış alarm 0; işaretleme 93 zararlının 42'sini hiçbir kaydı engellemeden etkisizleştiriyor, 51'i kalıyor ve yanlış alarmı sıfır. Etkisizleşme iki sınıfta toplanıyor: dolaylı yönergenin 0,9167'si, kaynak taklidinin 0,8696'sı; gizli alan isteği, yetki aşımı ve bozulmuş girdi sınıflarında 0,0000. İşaretlemenin asıl değeri süzgeci sıkabilmesidir: kural süzgeci tek başına 0,7957 kapsıyor ve 23 temiz kaydı engelliyor, işaretleme ile model süzgecinin 0,50 eşiği 0,7634 kapsıyor ve yalnızca 8 temiz kaydı engelliyor. Bedel yanlış alarm değildir: işaretlenen 103 kaydın 47'si temizdir ve bunların yalnızca 1'i yönerge kipi taşır, yani yitirilen yol tek bir kayıttır ve çözünürlüğün tam bir adımıdır.

İçindekiler

Bir önceki ders yetki kapısını ölçtü ve dört daraltma adımının toplam 49 temiz kaydı engellediğini saydı. O dersteki her savunma aynı biçimde çalışıyordu: bir kaydı durduruyordu. Süzgeç de, içerik denetimi de, maskeleme de, yetki kapısı da bir şeyi geçirmeyerek koruyordu ve dördünün de bedeli aynı yerden çıkıyordu — yanlışlıkla engellenen temiz kayıt.

Oysa zararlı bir kaydı etkisiz kılmanın tek yolu onu durdurmak değildir. Erişilen bir belgeden gelen metnin zararı çoğu zaman içeriğinden değil, o içeriğin yönerge olarak okunmasından gelir. Metin veri sayılırsa aynı kayıt hiç engellenmeden zararsızlaşır. Bu ders o savunmayı ölçer ve tek bir soruyu sorar: hiçbir kaydı durdurmayan bir katman 93 zararlının kaçını kapsıyor ve bunun karşılığında ne ödüyor.

  • SV49. Kod bir benzeticidir; gerçek bir model uç noktası ya da belge dağarcığı çağrılmaz. Kayıt kümesi, sınıflar ve öznitelikler kurgudur, tohum 20260218.
  • SV50. Saldırı bir metin değil, bir öznitelik profilidir. Kayıtların taşıdığı altı cümle sıradan destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnız yapısal bayraklarda durur. Kodda çalışan bir yük, şablon ya da yönerge dizisi yoktur.
  • SV51. Taban çizgisi savunmasız kurulumdur: durdurulan zararlı 0, yanlış alarm 0.
  • SV52. Kursun kuralı: durdurduğu pay ile yanlışlıkla durdurduğu pay birlikte yazılmayan savunma ölçülmemiş sayılır.
  • SV53. İşaretleme bir engelleme değildir. Kullanıcı dışı kaynaktan gelen metin veri olarak damgalanır; yönerge kipi taşısa bile yönerge sayılmaz. Hiçbir kayıt durdurulmaz, hiçbir kayıt silinmez, hiçbir alan çıkarılmaz.
  • SV54. Etkisizleşen kayıt, zararı yönerge olarak okunmaya dayanan bir sınıfta olan ve kullanıcı dışı bir kaynaktan gelen kayıttır. İki koşul birlikte aranır.
  • SV55. Kapsanan zararlı, işaretlemenin etkisizleştirdiği ile süzgecin engellediğinin birleşimidir; aynı kayıt iki kez sayılmaz.
  • SV56. İşaretlemenin bedeli yanlış alarm değildir, çünkü engellenen kayıt sıfırdır. Bedel, veri sayılan temiz bir kaydın yitirdiği yönerge yoludur ve ayrıca sayılır.
  • SV57. Çözünürlük: duyarlılığın adımı 1/93=0,01081/93 = 0{,}0108, yanlış engelleme payının adımı 1/147=0,00681/147 = 0{,}0068. İşaretlemenin kararında çekiliş yoktur ve ölçü koşumdan bağımsızdır.

Ortak Tanım

Kayıt kümesi, sınıflar, savunma katmanları ve ölçü kurs boyunca aynıdır. Kümede 240 kurgu destek kaydı vardır; kaynak alanı bir kaydın nereden geldiğini söyler ve işaretleme yalnız bu alana bakar.

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"]
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 3: guvenilmeyen icerik isaretleme (yonerge sayilmaz)
def isaretle(k):
    """Kullanici disindaki kaynaktan gelen metin VERI olarak isaretlenir;
    yonerge kipi tasiyor olsa bile yonerge sayilmaz."""
    return {"veri_olarak": k["kaynak"] != "kullanici"}


def isaretleme_etkisi(kayitlar):
    """Isaretleme yalnizca 'yonerge olarak okunma' yolunu kapatir."""
    etkisiz, kalan = 0, 0
    for k in kayitlar:
        if not zararli(k):
            continue
        yonergeye_dayali = k["sinif"] in ("dolayli_yonerge", "kaynak_taklidi")
        if yonergeye_dayali and isaretle(k)["veri_olarak"]:
            etkisiz += 1
        else:
            kalan += 1
    return etkisiz, kalan


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


print("kayit:", len(KAYIT), "- zararli:", sum(zararli(k) for k in KAYIT))
print("kaynak:", {s: sum(k["kaynak"] == s for k in KAYIT) for s in KAYNAK})
kayit: 240 - zararli: 93
kaynak: {'kullanici': 137, 'erisilen_belge': 72, 'arac_ciktisi': 31}

Veri ile Yönerge Ayrımı

İşaretleme tek bir varsayımı bozar: modele giren her metnin aynı ağırlıkta okunması. Kullanıcının kendi isteği yönergedir, çünkü ajanın hizmet ettiği irade odur. Erişilen bir belgeden ya da bir araç çıktısından gelen metin ise veridir — okunur, alıntılanır, özetlenir, ama davranışı değiştirmez. isaretle işlevi bu damgayı yalnız kaynak alanına bakarak koyar ve hiçbir kaydı durdurmaz.

Ayrımın kimi etkilediği sınıfa bağlıdır. Bir kaydın zararı yönerge olarak okunmasına dayanıyorsa, damga o zararı ortadan kaldırır. Zararı başka bir şeye dayanıyorsa damga hiçbir şey yapmaz: gizli bir alan adı istemek, veri veri olarak okunduğunda da bir istektir.

def etkisizlesti(k):
    """Zarari YONERGE OLARAK OKUNMAYA dayanan ve kullanici disi kaynaktan gelen kayit,
    hicbir sey engellenmeden etkisiz kalir: metin veri sayilir, yonerge sayilmaz."""
    return (zararli(k) and k["sinif"] in ("dolayli_yonerge", "kaynak_taklidi")
            and isaretle(k)["veri_olarak"])


etkisiz, kalan = isaretleme_etkisi(KAYIT)
isaretli = [k for k in KAYIT if isaretle(k)["veri_olarak"]]
temiz_isaretli = [k for k in isaretli if not zararli(k)]
print("taban      : durdurulan zararli 0 , yanlis alarm 0")
print("isaretleme : etkisizlesen", etkisiz, ", kalan zararli", kalan,
      ", kapsanan pay", round(etkisiz / 93, 4))
print("isaretlenen kayit", len(isaretli), "- bunlarin temizi", len(temiz_isaretli),
      "- yonerge kipi tasiyani", sum(k["ozellik"]["yonerge_kipi"] for k in temiz_isaretli))
print("engellenen kayit 0 - yanlis alarm 0")

print("\nsinif basina isaretlemenin etkisizlestirdigi")
for s in SINIF[1:]:
    g = [k for k in KAYIT if k["sinif"] == s]
    e = sum(etkisizlesti(k) for k in g)
    print(f"  {s:<18} {e:>2}/{len(g):<3} {e / len(g):.4f}")


def kurulum(karar=None, isaretlemeli=True):
    """Kapsanan zararli = isaretlemenin etkisizlestirdigi VEYA suzgecin engelledigi."""
    s = olc(KAYIT, karar) if karar else {"dp": 0, "yp": 0, "yanlis_engelleme_payi": 0.0}
    kaps = sum(1 for k in KAYIT if zararli(k)
               and ((isaretlemeli and etkisizlesti(k)) or (karar is not None and karar(k))))
    return kaps, s["dp"] + s["yp"], s["yp"], s["yanlis_engelleme_payi"]


print("\nkurulum                 kapsanan   pay   engellenen  yanlis alarm  yanlis-eng")
for ad, karar, im in [("taban", None, False),
                      ("yalniz isaretleme", None, True),
                      ("yalniz kural suzgeci", kural_suzgeci, False),
                      ("isaretleme + kural", kural_suzgeci, True),
                      ("isaretleme + model 0,50", lambda k: model_suzgeci(k, 0.50), True),
                      ("isaretleme + model 0,60", lambda k: model_suzgeci(k, 0.60), True),
                      ("isaretleme + model 0,80", lambda k: model_suzgeci(k, 0.80), True)]:
    kaps, eng, ya, yep = kurulum(karar, im)
    print(f"{ad:<24} {kaps:>7} {kaps / 93:>7.4f} {eng:>11} {ya:>13} {yep:>11.4f}")
taban      : durdurulan zararli 0 , yanlis alarm 0
isaretleme : etkisizlesen 42 , kalan zararli 51 , kapsanan pay 0.4516
isaretlenen kayit 103 - bunlarin temizi 47 - yonerge kipi tasiyani 1
engellenen kayit 0 - yanlis alarm 0

sinif basina isaretlemenin etkisizlestirdigi
  dolayli_yonerge    22/24  0.9167
  gizli_alan_istegi   0/17  0.0000
  yetki_asimi         0/10  0.0000
  kaynak_taklidi     20/23  0.8696
  bozulmus_girdi      0/19  0.0000

kurulum                 kapsanan   pay   engellenen  yanlis alarm  yanlis-eng
taban                          0  0.0000           0             0      0.0000
yalniz isaretleme             42  0.4516           0             0      0.0000
yalniz kural suzgeci          74  0.7957          97            23      0.1565
isaretleme + kural            77  0.8280          97            23      0.1565
isaretleme + model 0,50       71  0.7634          74             8      0.0544
isaretleme + model 0,60       67  0.7204          64             5      0.0340
isaretleme + model 0,80       60  0.6452          47             1      0.0068

Engellemeyen Savunmanın Sayısı

İkinci satır bu kursun en dikkat çekici satırıdır. İşaretleme 93 zararlının 42’sini etkisizleştiriyor — kapsanan pay 0,4516 — ve bunu yaparken hiçbir kaydı engellemiyor. Engellenen kayıt sütunu 0, yanlış alarm sütunu 0, yanlış engelleme payı 0,0000. Kursun kuralı bir savunmanın iki sayısını birlikte ister; bu savunmanın ikinci sayısı tam olarak sıfırdır ve bu bir yuvarlama değil, sayımın kendisidir.

Karşılaştırma için üçüncü satıra bakmak gerekir. Kural süzgeci daha fazlasını kapsıyor — 0,7957 — ama bunun için 97 kaydı engelliyor ve bu engellemelerin 23’ü temiz kayıt üzerindedir. İki savunma aynı türden değildir: biri kapsamayı engellemeyle satın alır, öbürü bedava alır.

Asıl bulgu son üç satırdadır. İşaretleme, arkasındaki süzgecin eşiğini sıkmaya izin verir. Yönergeye dayalı zararlının büyük bölümü zaten etkisizleştiği için süzgecin onları yakalaması gerekmez; süzgeç yalnız kalan 51 kayda odaklanabilir. İşaretleme ile model süzgecinin 0,50 eşiği birlikte 0,7634 kapsıyor ve yalnızca 8 temiz kaydı engelliyor. Kural süzgecinin tek başına verdiği 0,7957 ile arasındaki fark üç kayıttır, yani 3×0,0108=0,03233 \times 0{,}0108 = 0{,}0323; buna karşılık yanlış engelleme payı 0,1565’ten 0,0544’e iniyor, yani on beş temiz kayıt daha az engelleniyor ve bu 15×0,0068=0,102115 \times 0{,}0068 = 0{,}1021’dir. Üç kayıtlık kapsam farkı, on beş kayıtlık engelleme farkının karşılığında verilmiştir. En sıkı satırda, 0,80 eşiğinde, engellenen temiz kayıt bire düşüyor ve kapsam yine de 0,6452’de kalıyor.

Dördüncü satır ayrıca şunu gösteriyor: işaretlemeyi kural süzgecinin üstüne koymak kapsamı 0,7957’den 0,8280’e çıkarıyor ve yanlış engelleme payını hiç değiştirmiyor. Bir önceki derste yetki kapısını süzgecin üstüne koymak duyarlılığı 0,0430 büyütürken yanlış engellemeyi 0,0952 büyütmüştü. Aradaki fark katmanın türünden gelir: engellemeyen bir katmanın üst üste koyulması bedelsizdir.

İşaretlemenin Duvarı

Sınıf dağılımı, savunmanın nerede bittiğini açıkça söylüyor. Etkisizleşme yalnız iki sınıfta gerçekleşiyor: dolayli_yonerge sınıfının 0,9167’si ve kaynak_taklidi sınıfının 0,8696’sı. Öbür üç sınıfta sayı 0,0000’dır. Bu bir eksiklik değil, tanımın sonucudur: işaretleme yalnız “yönerge olarak okunma” yolunu kapatır ve gizli alan isteği, yetki aşımı ya da bozulmuş girdi bu yoldan geçmez.

Geriye kalan 51 kaydın 46’sı bu üç sınıftan gelir. Kalan 5 kayıt ise ilk iki sınıftadır ama kaynağı kullanıcıdır — dolaylı yönergenin 2’si, kaynak taklidinin 3’ü. İşaretleme onlara yapısı gereği dokunamaz, çünkü kullanıcının kendi metnini veri saymak ajanı işlevsiz bırakır. Aynı küme içinde kullanıcı kaynaklı 37 zararlı kayıt vardır; bu katmanın kapsayamayacağı alan budur ve kapsamayı 0,4516’da tutan sınır da odur.

Bedel sütununun sıfır olması, savunmanın hiçbir şeye mal olmadığı anlamına gelmiyor. İşaretlenen 103 kaydın 47‘si temizdir ve bu kayıtlar da veri sayılır. Bunların içinde yönerge kipi taşıyan bir kayıt vardır: erişilen bir belgeden gelen ve gerçekten bir işlem isteyen tek temiz kayıt. İşaretleme onun yolunu da kapatır. Yitirilen yetenek 1/147=0,00681/147 = 0{,}0068’dir, yani kümenin çözünürlüğünün tam bir adımı — ölçülebilir en küçük bedel. Bu bedeli yazmamak, savunmayı bedelsiz göstermek olurdu; yazmak ise onun ne kadar küçük olduğunu göstermenin tek yoludur.

Özet

  • Güvenilmeyen içerik işaretleme, kullanıcı dışı kaynaktan gelen metni veri olarak damgalar; yönerge kipi taşısa bile yönerge sayılmaz ve hiçbir kayıt durdurulmaz.
  • İşaretleme 93 zararlının 42’sini etkisizleştiriyor (kapsanan pay 0,4516), 51 zararlı kalıyor ve engellenen kayıt ile yanlış alarm sıfırdır.
  • Etkisizleşme iki sınıfta toplanıyor: dolayli_yonerge 0,9167, kaynak_taklidi 0,8696; öbür üç sınıfta 0,0000, çünkü onların zararı yönerge olarak okunmaya dayanmıyor.
  • İşaretleme süzgecin eşiğini sıkmaya izin verir: işaretleme ile model süzgecinin 0,50 eşiği 0,7634 kapsıyor ve 8 temiz kaydı engelliyor; kural süzgeci tek başına 0,7957 kapsıyor ve 23 temiz kaydı engelliyor.
  • İşaretlemeyi kural süzgecinin üstüne koymak kapsamı 0,8280’e çıkarıyor ve yanlış engelleme payını hiç değiştirmiyor; engellemeyen bir katmanı eklemek bedelsizdir.
  • Bedel sıfır değil, en küçüktür: işaretlenen 103 kaydın 47’si temizdir ve bunların yönerge kipi taşıyan 1’i yolunu yitirir, yani 0,0068 — çözünürlüğün tam bir adımı.

Sonraki Adım

İşaretleme kapsamayı bedelsiz büyüttü, ama duvarı belliydi: geriye kalan 51 kaydın hiçbirine dokunmuyor ve bunların içinde en pahalı sınıf duruyor. Yetki aşımı ve gizli alan isteği taşıyan kayıtlar, bir kez geçtiklerinde geri alınamayan işlemlere yönelir; bir kaydın silinmesi, bir tutarın yazılması ya da bir bilginin dışarı gitmesi sonradan düzeltilemez. Böyle bir eylem için otomatik bir kararın kesinliği yeterli değildir. Sonraki ders kapıyı insana açar ve iki şeyi sayar: insana giden kaydın kaçı gerçekten zararlı ve kapı, sorulan istem sayısı büyüdükçe kaç zararlıyı yakalamayı bırakıyor.

İ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