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.