İçeriğe geç
academia.sh

Ders 08 / 21

Yapay Zekâ Kırmızı Takım Yöntemi

Kırmızı takım yönteminin bir saldırı yordamı olarak değil, kapsam ve sayım olarak ele alınması: dört sınıfı on denemeyle tarayan dar bir kampanya 40 denemede 4 geçen kayıt ve 0,1000 geçen pay bildiriyor, aynı kampanyaya beşinci sınıf eklendiğinde sayı 50 denemede 12 geçen ve 0,2400 oluyor ve eklenen sınıf tek başına 8'ini veriyor. Deneme seçimini değiştirmek aynı büyüklükte 0,1800 veriyor, tüm zararlı kayıtlar 0,2043 veriyor, genişletilmiş kural 0,0860'a indiriyor. Raporda satırı olmayan sınıfın denemesi sıfırdır ve geçen payı ölçülmemiştir; kampanyanın kapsamı dünya hakkında değil planın kendisi hakkında bir ifadedir. Ders konu kapanışıdır ve sekiz dersin savunmasının tek bir süzgeç olduğunu yazar.

İçindekiler

Önceki ders bir sınıfı adıyla ekledi ve savunmanın orada neredeyse kör olduğunu gösterdi. O sınıf, kimse aramadığı için yıllarca sayılmadan durabilirdi; sayıya dönüşmesinin tek nedeni birinin bakmayı akıl etmesiydi. Bu, savunma tarafında rahatsız edici bir boşluk bırakır: bir sistemin denenmiş olduğunu söylemek, denenmemiş olanın ne olduğunu söylemez.

Kırmızı takım yöntemi bu boşluğu kapatmaya çalışan sistematik denemedir. Bu derste yordam olarak ele alınmaz. Sızma testinin yordamı Güvenlik Araçları ve Sızma Testi kursunda ölçüldü ve tekrarlanmaz; burada kırmızı takım tek bir şeye indirgenir: kapsam ve sayım. Kaç sınıf denendi, her birinde kaç deneme yapıldı, savunmayı geçen pay ne, ve denenmemiş olan raporda hangi sayıyla görünüyor.

  • SY88. Kayıt kümesi, sınıflar, öznitelikler ve savunma kurgudur; gerçek bir model ya da süzgeç çağrılmaz. Tohum 20260218.
  • SY89. 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.
  • SY90. Deneme üretmek diye bir adım yoktur. Kampanya, kümede zaten duran kayıtları sınıf sınıf seçmektir. Çalışan hiçbir saldırı, yük ya da atlatma yöntemi yazılmaz.
  • SY91. Kampanyanın ölçtüğü tek sayı savunmayı geçen paydır; bu, o sınıftaki duyarlılığın tümleyenidir.
  • SY92. Kampanya yanlış alarmı ölçmez. Yalnız zararlı kayıtlara bakar, dolayısıyla kursun iki sayısından yalnız birini üretir; ikincisi kümenin tamamından okunur.
  • SY93. Savunmasız taban aynıdır: durdurulan zararlı 0, yanlış alarm 0, geçen pay 1,0000.
  • SY94. Çözünürlük iki katmanlıdır: kümenin adımı 1/93 = 0,0108, kampanyanın adımı 1/deneme, sınıfın adımı 1/o sınıftaki deneme. Her satır kendi adımını yazar.

Kampanya Bir Yordam Değil Bir Kapsamdır

Bir kampanyayı üç şey belirler: hangi sınıflar kapsandı, her sınıfta kaç deneme yapıldı ve hangi savunmaya karşı yapıldı. Üçü de plan kararıdır ve üçü de rapordaki sayıyı doğrudan oynatır. İlk blok ortak tanımı kurar: 240 kurgu destek talebi, altı sınıf, yedi yapısal öznitelik ve kural süzgeci. Öznitelikler bayraktır, içerik değildir; kaydın metni sınıfından bağımsızdır.

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


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


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

Kapsanan Sınıf ve Geçen Pay

İkinci blok kampanyayı bir işleve indirger ve iki planı yan yana koşar. Dar plan, bozulmuş girdi sınıfı henüz bilinmezken yazılmış olanıdır: dört sınıf, sınıf başına on deneme. Geniş plan aynı kampanyaya beşinci sınıfı ekler ve başka hiçbir şeyi değiştirmez.

ZARARLI_SINIF = SINIF[1:]
GENIS = ("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
         "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi")


def kural_genis(k):
    return kural_suzgeci(k, GENIS)


def kampanya(siniflar, basina, karar, bastan=True):
    """Kirmizi takim KAPSAM sayimi. Deneme uretmek degil kumeden kayit secmektir;
    hicbir saldiri yordami calistirilmaz. Olculen sey savunmayi gecen paydir."""
    satir, top_d, top_g = [], 0, 0
    for s in siniflar:
        a = [k for k in KAYIT if k["sinif"] == s]
        alt = a[:basina] if bastan else a[-basina:]
        g = sum(1 for k in alt if not karar(k))
        satir.append((s, len(alt), g, g / len(alt), 1 / len(alt)))
        top_d, top_g = top_d + len(alt), top_g + g
    return satir, top_d, top_g


def rapor(ad, siniflar, basina, karar, bastan=True):
    satir, d, g = kampanya(siniflar, basina, karar, bastan)
    print(f"{ad}: kapsanan sinif {len(satir)}/{len(ZARARLI_SINIF)}  deneme {d}  gecen {g}"
          f"  gecen pay {g / d:.4f}  kampanya adimi {1 / d:.4f}")
    for s, n, gc, p, c in satir:
        print(f"   {s:<20} deneme {n:>2}  gecen {gc:>2}  pay {p:.4f}  adim {c:.4f}")


rapor("dar kampanya  ", ZARARLI_SINIF[:4], 10, kural_suzgeci)
rapor("genis kampanya", ZARARLI_SINIF, 10, kural_suzgeci)
dar kampanya  : kapsanan sinif 4/5  deneme 40  gecen 4  gecen pay 0.1000  kampanya adimi 0.0250
   dolayli_yonerge      deneme 10  gecen  0  pay 0.0000  adim 0.1000
   gizli_alan_istegi    deneme 10  gecen  1  pay 0.1000  adim 0.1000
   yetki_asimi          deneme 10  gecen  1  pay 0.1000  adim 0.1000
   kaynak_taklidi       deneme 10  gecen  2  pay 0.2000  adim 0.1000
genis kampanya: kapsanan sinif 5/5  deneme 50  gecen 12  gecen pay 0.2400  kampanya adimi 0.0200
   dolayli_yonerge      deneme 10  gecen  0  pay 0.0000  adim 0.1000
   gizli_alan_istegi    deneme 10  gecen  1  pay 0.1000  adim 0.1000
   yetki_asimi          deneme 10  gecen  1  pay 0.1000  adim 0.1000
   kaynak_taklidi       deneme 10  gecen  2  pay 0.2000  adim 0.1000
   bozulmus_girdi       deneme 10  gecen  8  pay 0.8000  adim 0.1000

Dar kampanyanın raporu iyi bir rapordur. Kırk deneme yapıldı, dördü geçti, geçen pay 0,1000. Dört satırın hiçbiri alarm vermiyor: en kötü sınıf 0,2000, en iyisi 0,0000. Bu tablonun okuyucusuna söylediği şey açıktır — savunma denemelerin onda dokuzunu durdurdu.

Geniş kampanya aynı savunmayı, aynı deneme yoğunluğunu ve aynı dört satırı taşıyor. Tek fark bir satır daha olması. Geçen pay 0,2400’e çıkıyor, yani ikiye katlanıyor, ve on iki geçen kaydın sekizi yeni satırdan geliyor. Dört satır harfi harfine aynı kaldı; değişen tek şey neye bakıldığı. Bir kampanyanın sayısı savunmanın gücünü ölçmez, planın kapsamını ölçer.

Denenmeyen Sınıfın Sayısı

Üçüncü blok kapsamı üç yönde daha oynatır: aynı büyüklükte başka bir deneme seçimi, tüm zararlı kayıtlar, ve genişletilmiş kural. Sonunda kümenin iki sayısı ve dar kampanyanın raporunda satırı olmayan sınıf basılır.

rapor("ayni kampanya, sondan secim", ZARARLI_SINIF, 10, kural_suzgeci, bastan=False)
rapor("tum zararli kayitlar     ", ZARARLI_SINIF, 999, kural_suzgeci)
rapor("tum kayitlar, genis kural", ZARARLI_SINIF, 999, kural_genis)
print("\nsavunmanin iki sayisi (tum kume):")
for ad, karar in (("savunmasiz taban", lambda k: False), ("kural", kural_suzgeci),
                  ("kural + bayrak", kural_genis)):
    o = olc(KAYIT, karar)
    print(f"  {ad:<17} durdurulan {o['dp']:>2}  yanlis alarm {o['yp']:>2}"
          f"  duyarlilik {o['duyarlilik']:.4f}  yanlis engelleme {o['yanlis_engelleme_payi']:.4f}")
print("\nkumede tanimli zararli sinif:", len(ZARARLI_SINIF),
      " dar kampanyanin raporunda satiri olmayan:", ZARARLI_SINIF[4:],
      " o satirin denemesi:", 0)
ayni kampanya, sondan secim: kapsanan sinif 5/5  deneme 50  gecen 9  gecen pay 0.1800  kampanya adimi 0.0200
   dolayli_yonerge      deneme 10  gecen  0  pay 0.0000  adim 0.1000
   gizli_alan_istegi    deneme 10  gecen  0  pay 0.0000  adim 0.1000
   yetki_asimi          deneme 10  gecen  1  pay 0.1000  adim 0.1000
   kaynak_taklidi       deneme 10  gecen  1  pay 0.1000  adim 0.1000
   bozulmus_girdi       deneme 10  gecen  7  pay 0.7000  adim 0.1000
tum zararli kayitlar     : kapsanan sinif 5/5  deneme 93  gecen 19  gecen pay 0.2043  kampanya adimi 0.0108
   dolayli_yonerge      deneme 24  gecen  0  pay 0.0000  adim 0.0417
   gizli_alan_istegi    deneme 17  gecen  1  pay 0.0588  adim 0.0588
   yetki_asimi          deneme 10  gecen  1  pay 0.1000  adim 0.1000
   kaynak_taklidi       deneme 23  gecen  3  pay 0.1304  adim 0.0435
   bozulmus_girdi       deneme 19  gecen 14  pay 0.7368  adim 0.0526
tum kayitlar, genis kural: kapsanan sinif 5/5  deneme 93  gecen 8  gecen pay 0.0860  kampanya adimi 0.0108
   dolayli_yonerge      deneme 24  gecen  0  pay 0.0000  adim 0.0417
   gizli_alan_istegi    deneme 17  gecen  1  pay 0.0588  adim 0.0588
   yetki_asimi          deneme 10  gecen  1  pay 0.1000  adim 0.1000
   kaynak_taklidi       deneme 23  gecen  3  pay 0.1304  adim 0.0435
   bozulmus_girdi       deneme 19  gecen  3  pay 0.1579  adim 0.0526

savunmanin iki sayisi (tum kume):
  savunmasiz taban  durdurulan  0  yanlis alarm  0  duyarlilik 0.0000  yanlis engelleme 0.0000
  kural             durdurulan 74  yanlis alarm 23  duyarlilik 0.7957  yanlis engelleme 0.1565
  kural + bayrak    durdurulan 85  yanlis alarm 30  duyarlilik 0.9140  yanlis engelleme 0.2041

kumede tanimli zararli sinif: 5  dar kampanyanin raporunda satiri olmayan: ['bozulmus_girdi']  o satirin denemesi: 0

İlk satır kampanyanın kendi bandını verir. Aynı savunma, aynı beş sınıf, aynı elli deneme; tek fark hangi kayıtların seçildiği. Geçen pay 0,2400 yerine 0,1800 çıkıyor. Üç kayıtlık bu fark savunmayla ilgili değildir ve kampanyanın toplam adımı 0,0200 olduğu için gürültüye de yıkılamaz — kapsam sabitken bile seçim tek başına 0,0600 oynatıyor. Bir kampanya sayısı tekrarlanabilir değildir; tekrar edilen kampanya başka bir sayı verir.

İkinci satır kapsamı yoğunlaştırır: sınıf başına on yerine tüm kayıtlar, 93 deneme. Geçen pay 0,2043. Bozulmuş girdi satırı 0,8000’den 0,7368’e iniyor, fark 0,0632; on denemelik kampanyanın adımı 0,1000 olduğuna göre o kampanya bu iki sayıyı birbirinden ayıramazdı. Sayıyı ondalıkla yazmak onu hassas yapmaz.

Üçüncü satır kampanyayı savunma değişikliğine karşı koşar. Genişletilmiş kural geçen payı 0,2043’ten 0,0860‘a indiriyor; kazancın tamamı yine tek satırdadır, 0,7368’den 0,1579’a. Kampanya bunu başarı olarak bildirir ve eksik bildirir. Aynı savunmanın yanlış alarmı 23’ten 30’a çıktı ve bu sayı kampanyanın hiçbir satırında yoktur, çünkü kampanya yalnız zararlı kayıtlara bakar. Kırmızı takım raporu, yapısı gereği kursun iki sayısından yalnız birini üretir; ikincisi tüm kümeden ayrıca okunmalıdır.

Son satır dersin en önemli cümlesini taşır. Dar kampanyanın raporunda bozulmus_girdi için bir satır yoktur ve o satırın deneme sayısı sıfırdır. Tabloyu toplayan biri 40 deneme, 4 geçen ve 0,1000 görür; kayıp sınıf toplamlara sıfır katkı yapar. Ama o sıfır ölçülmüş bir sıfır değildir — bakılmamış olmanın sayısıdır. Sınıf kapsama girer girmez tek başına on iki geçen kaydın sekizini verdi. Denenmeyen sınıfın sayısı sıfır değil bilinmezdir, ve bir raporun bu ikisini ayırt edecek biçimde yazılması zorunludur: kapsanan sınıflar ve kapsanmayanlar ayrı listelenmedikçe, kapsam boşluğu bir başarı sayısı gibi görünür.

Bunun daha sert bir hâli de vardır. Bu kümede tanımlı zararlı sınıf sayısı beştir; altıncı bir yüzey varsa, üzerinde koşturulan hiçbir kampanyanın hiçbir satırında görünmez. Kapsam bir sayı değil bir iddiadır ve dünya hakkında değil planın kendisi hakkında bir şey söyler.

Özet

  • Kırmızı takım burada bir yordam değil bir sayımdır: kapsanan sınıf, sınıf başına deneme ve savunmayı geçen pay.
  • Dar kampanya dört sınıfta 40 denemede 0,1000 geçen pay bildirir; beşinci sınıf eklenince aynı savunma 50 denemede 0,2400 verir ve on iki geçen kaydın sekizi yeni satırdan gelir.
  • Kampanyanın sayısı kendi seçiminden bir band taşır: aynı büyüklükte başka bir seçim 0,1800 verir, fark 0,0600 ve savunmayla ilgisi yoktur.
  • Kapsam yoğunlaştıkça çözünürlük artar: 93 denemede geçen pay 0,2043, bozulmuş girdi satırı 0,7368; on denemelik kampanya bunu 0,8000’den ayıramazdı.
  • Kampanya yalnız zararlı kayıtlara baktığı için kursun iki sayısından birini üretir; genişletilmiş kural geçen payı 0,0860’a indirirken yanlış alarmı 23’ten 30’a çıkarır ve bu sayı raporda yoktur.
  • Raporda satırı olmayan sınıfın deneme sayısı sıfırdır ve geçen payı bilinmezdir; kapsanan ile kapsanmayan ayrı yazılmadıkça boşluk başarı gibi görünür.

Sonraki Adım

Sekiz derste yüzey sayıldı. Modele giren metin sınıflara ayrıldı, kaynağına göre dağıtıldı, eşik süpürmesiyle tarandı, gizli alan adı taşıyan kayıtlar sayıldı, yan etkili araç isteği ayrıldı, çıktı tarafı ölçüldü, anlam taşımayan bozulma ayrı bir sınıf olarak eklendi ve sonunda kapsamın kendisi bir sayıya dönüştü. Bütün bunlarda savunma hep aynı şeydi: tek bir süzgeç. Kimi zaman dört kurallık bir liste, kimi zaman bir bayrakla genişletilmiş beş kurallık liste, kimi zaman bir puan ile bir eşik. Yaptığı iş hiç değişmedi — kaydı ya geçirdi ya engelledi, ve bedelini hep aynı para biriminden ödedi: yanlış alarm. Oysa engellemek savunmanın tek hamlesi değildir. Bir alanı silmek, bir metni yönerge saymamak, bir aracın yetkisini daraltmak ve bir eylemi insana sormak da savunmadır ve hiçbiri kaydı durdurmaz. Sonraki konu bu katmanları tek tek kurar ve her birini kendi bedeliyle ölçer: neyi yakaladığını, neyi yanlışlıkla durdurduğunu ve hangi yeteneği götürdüğünü.

İ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