SEN2008 · 14. hafta · Software Security (II): Secure software construction techniques, Security-related verification and validation

Güvenlik testi ve OWASP Top 10

Statik analiz, dinamik tarama, fuzzing, penetrasyon testi ve kod incelemenin neyi ne zaman bulduğunu, ayrıca OWASP Top 10 (2021) listesini öğrenirsin. Sınavda 'bu senaryo hangi kategori' ve araç metrikleri (precision, recall) sorulur.

security testingstatic analysis (SAST)dynamic analysis (DAST)fuzzingmutation-based fuzzinggeneration-based fuzzingpenetration testingblack-boxwhite-boxgrey-boxfalse positivefalse negativeprecisionrecallcode reviewOWASP Top 10broken access controlIDORSSRF

Güvenli kod yazdın, peki gerçekten güvenli mi? Bunu bilmenin tek yolu test. Bu sayfa güvenli SDLC’nin doğrulama (verification and validation) ayağı: hangi test tekniği hangi açığı bulur, hangisi neyi kaçırır. İkinci yarıda OWASP Top 10 (2021) var. Sınavda en sık görülen iki tip: “bu teknik ne yapar / hangisi kodu çalıştırmaz” ve “bu senaryo OWASP’ın hangi kategorisi”. Arada precision/recall ya da fuzzing olasılığı gibi küçük hesaplar çıkabilir.

Altın kurallar:

  1. Tek teknik yetmez. Statik analiz, dinamik test ve insan incelemesi farklı hataları bulur.
  2. Erken test ucuzdur. SAST ve kod inceleme kod yazılırken çalışır.
  3. Araç çıktısı ham veridir. Her bulgu doğrulanmalı; false positive gürültü, false negative kör nokta.
  4. İzinsiz test yapılmaz. Pentest yazılı izin ve net kapsamla yapılır.
  5. OWASP listesini senaryodan tanı. Kategori adını ezberlemek yetmez, örnekle eşleştir.

Güvenlik testi teknikleri

TeknikNe zamanNasılİyi bulduğuZayıf yanı
Kod inceleme (code review)her commitinsan okur, kontrol listesimantık ve tasarım hataları, eksik yetki kontrolüyavaş, kişiye bağlı
SASTderleme sırasında, CIkodu çalıştırmadan veri akışı analiziinjection, tehlikeli API, sabit parolaçok false positive, çalışma ortamını görmez
DASTtest ortamında çalışan uygulamadışarıdan HTTP istekleri gönderiryapılandırma hataları, reflected XSS, eksik başlıklarkodun hangi satırı olduğunu söyleyemez, kapsamı sınırlı
Fuzzingtest, süreklibinlerce bozuk girdiçökme, bellek hataları, parser açıklarımantık hatalarını bulmaz
Penetrasyon testiyayın öncesi, periyodikyetkili uzman saldırgan gibi düşünürzincirlenmiş açıklar, iş mantığı hatalarıpahalı, anlık fotoğraf
SCACIbağımlılık sürümlerini CVE veritabanıyla karşılaştırırbilinen açıklı kütüphanelerkendi kodundaki hataya bakmaz

Statik analiz (SAST)

SAST, girdinin geldiği yeri kaynak (source), tehlikeli kullanıldığı yeri çıkış (sink) olarak işaretler ve aradaki yolda temizleme (sanitization) olup olmadığına bakar. Buna taint analysis denir.

String id = request.getParameter("id");              // source: güvenilmeyen
String sql = "SELECT * FROM orders WHERE id = " + id;
stmt.executeQuery(sql);                               // sink: SQL motoru
// SAST uyarısı: tainted data flows from getParameter to executeQuery

Avantajı: henüz çalışan bir sistem gerekmez, her yolu inceler. Dezavantajı: bir değerin gerçekte zararsız olduğunu her zaman anlayamaz, yanlış alarm üretir.

Araç başarısını ölçmek: precision ve recall

Bir araç 60 bulgu raporlasın, 45’i gerçek olsun. Kodda toplam 50 gerçek açık olsun.

KavramAnlamıDeğer
TP (true positive)doğru bulgu45
FP (false positive)yanlış alarm60 − 45 = 15
FN (false negative)kaçırılan gerçek açık50 − 45 = 5

precision=TPTP+FP=4560=0.75recall=TPTP+FN=4550=0.90\text{precision} = \frac{TP}{TP+FP} = \frac{45}{60} = 0.75 \qquad \text{recall} = \frac{TP}{TP+FN} = \frac{45}{50} = 0.90

Güvenlikte false negative daha tehlikelidir (açık canlıya gider), ama çok düşük precision geliştiricinin aracı kapatmasına yol açar. İkisi arasında denge kurulur.

Dinamik analiz (DAST)

DAST çalışan uygulamayı kaynak kodunu görmeden test eder: formları doldurur, parametrelere özel karakterler koyar, yanıtta hata mesajı, yansıyan girdi, eksik güvenlik başlığı (Content-Security-Policy, Strict-Transport-Security) arar. Gerçek ortamı test ettiği için yapılandırma hatalarını görür; ama sadece ulaşabildiği sayfaları test eder. IAST, uygulamanın içine ajan yerleştirerek ikisini birleştirir.

Fuzzing

Fuzzer, programa beklenmedik girdiler verir ve çökme, sonsuz döngü, bellek hatası arar. Özellikle dosya formatı ayrıştırıcıları, ağ protokolleri ve C/C++ kodu için çok etkilidir.

TürGirdiyi nasıl üretir
Mutation-basedgeçerli örnek dosyaları bit çevirerek, bayt ekleyip silerek bozar
Generation-basedformat tanımından (gramer, protokol şeması) sıfırdan üretir
Coverage-guidedyeni kod yolu açan girdileri saklar ve onları mutasyona uğratır (AFL, libFuzzer)

Neden çok girdi gerekir? Bir hata girdi başına pp olasılıkla tetikleniyorsa, nn bağımsız girdide en az bir kez tetiklenme olasılığı:

P=1−(1−p)n≈1−e−npP = 1 - (1-p)^n \approx 1 - e^{-np}

p=10−4p = 10^{-4}, n=10 000n = 10\,000 için P≈0.6321P \approx 0.6321. Aynı hatayı yüksek olasılıkla yakalamak için girdi sayısını birkaç kat artırmak gerekir. Coverage-guided fuzzing tam olarak bu pp‘yi büyütmeye çalışır.

TUZAK · Fuzzing her açığı bulmaz. Çökme üretmeyen hatalar (örn. IDOR, yanlış yetki kontrolü) fuzzer için görünmezdir. Program “doğru” yanıt döner ama başkasının verisini gösterir. Bunlar kod inceleme ve pentestle bulunur.

Penetrasyon testi

Pentest, yetkili bir uzmanın sistemi saldırgan gözüyle ama yazılı izinle ve tanımlı kapsamda test etmesidir. Amaç açığı bulup sahibine raporlamak.

TürTest edenin bilgisi
Black-boxhiçbir iç bilgi yok, dış saldırgan gibi
Grey-boxkısmi bilgi, örn. normal kullanıcı hesabı
White-boxkaynak kod, mimari, yönetici hesapları

Tipik aşamalar: kapsam ve kurallar (rules of engagement) → bilgi toplama → zafiyet tarama → bulguların kontrollü doğrulanması → raporlama (risk seviyesi ve düzeltme önerisiyle) → düzeltmeden sonra yeniden test. Rapor, testin asıl ürünüdür.

OWASP Top 10 (2021)

OWASP (Open Worldwide Application Security Project) web uygulamalarındaki en kritik risk kategorilerini birkaç yılda bir yayımlar. 2021 listesi:

KodKategoriTipik örnekTemel önlem
A01Broken Access ControlURL’deki id’yi değiştirip başkasının kaydını görmek (IDOR)her istekte sunucu tarafı yetki kontrolü, varsayılan reddet
A02Cryptographic Failuresparolayı MD5 ile saklamak, HTTP üzerinden kart verisigüçlü algoritma, TLS, parola için bcrypt/Argon2
A03InjectionSQLi, XSS, OS command injectionparametreli sorgu, çıktı kodlama, allowlist
A04Insecure Designşifre sıfırlamada sınırsız deneme hakkıtehdit modelleme, güvenli tasarım kalıpları
A05Security Misconfigurationvarsayılan parola, açık dizin listeleme, ayrıntılı hatasertleştirme, otomatik yapılandırma
A06Vulnerable and Outdated Componentsyaması çıkmış CVE’li kütüphanebağımlılık envanteri, SCA, düzenli güncelleme
A07Identification and Authentication Failuresbrute-force’a açık login, zayıf oturum yönetimiMFA, hız sınırı, güvenli oturum kimliği
A08Software and Data Integrity Failuresimzasız güncelleme, güvensiz deserializationdijital imza, bütünlük kontrolü, güvenilir CI/CD
A09Security Logging and Monitoring Failuresbaşarısız girişler loglanmıyor, alarm yokmerkezi log, alarm, olay müdahale planı
A10Server-Side Request Forgery (SSRF)sunucu kullanıcının verdiği URL’ye iç ağda istek atıyorhedef allowlist’i, iç adresleri engelle

2017’den 2021’e önemli değişiklikler: Broken Access Control beşinciden birinciye çıktı; XSS ayrı kategori olmaktan çıkıp Injection’a katıldı; Insecure Design, Software and Data Integrity Failures ve SSRF yeni kategoriler olarak eklendi.

İPUCU · Kategoriyi senaryodan bulma. Önce sor: kimlik doğru mu? Doğruysa ama yetkisiz veriye erişiliyorsa A01, kimliğin kendisi sorunluysa A07. Veri yorumlayıcıya kod olarak gidiyorsa A03. Kod değil ayar yanlışsa A05. Açık başkasının kütüphanesindeyse A06. Sunucu kullanıcının verdiği adrese gidiyorsa A10.

Hangi test hangi kategoriyi iyi yakalar? SAST A03’te güçlü, SCA A06’da tam isabet, DAST A05’te iyi. A01 ve A04 çoğunlukla insan işidir: kod inceleme, tehdit modelleme ve pentest.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
SAST programı çalıştırırÇalıştırmaz; DAST ve fuzzing çalıştırır
DAST kaynak koda bakarBakmaz; dışarıdan, çalışan uygulamaya istek atar
Fuzzing mantık hatalarını da bulurÇökme ve takılma arar; IDOR gibi hataları göremez
precision = TP/(TP+FN)O recall; precision = TP/(TP+FP)
Pentest izinsiz yapılabilir, iyi niyetliysem sorun yokYazılı izin ve kapsam olmadan yapılan test yasa dışıdır
OWASP 2021’de birinci InjectionA01 Broken Access Control; Injection A03
XSS 2021’de ayrı kategoriA03 Injection içinde
Login olmuş kullanıcı başkasının faturasını görüyor → A07Kimlik doğru, yetki yanlış: A01
CVE’li logging kütüphanesi → A09A06; A09 logların ve izlemenin eksikliği
Bir kez pentest yeterAnlık fotoğraftır; her büyük değişiklikte tekrarlanır

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

Which technique analyzes source code or bytecode for vulnerabilities without executing the program?

  1. DAST
  2. Fuzzing
  3. SAST
  4. Penetration testing
Cevabı göster
C) SAST

SAST (static application security testing) kodu çalıştırmadan okur: veri akışını izler, executeQuery gibi tehlikeli bir noktaya temizlenmemiş girdi ulaşıyor mu bakar. DAST ve fuzzing çalışan programa girdi gönderir, pentest de çalışan sistem üzerinde yapılır.

Soru 2kolay

What does a fuzzer primarily do?

  1. Reads the code and reports insecure functions
  2. Feeds large numbers of malformed or random inputs to a program and watches for crashes or hangs
  3. Encrypts test data
  4. Generates documentation from code
Cevabı göster
B) Feeds large numbers of malformed or random inputs to a program and watches for crashes or hangs

Fuzzing (bulanık test) programa çok sayıda bozuk, sınırda ya da rastgele girdi verir ve çökme, takılma, bellek hatası arar. Mutation-based fuzzer geçerli örnekleri bozarak, generation-based fuzzer formatın grameri üzerinden girdi üretir. Modern fuzzer'lar (AFL, libFuzzer) kod kapsamına göre girdiyi yönlendirir.

Soru 3kolay

In the OWASP Top 10 (2021), which category is ranked #1?

  1. Injection
  2. Broken Access Control
  3. Cryptographic Failures
  4. Security Misconfiguration
Cevabı göster
B) Broken Access Control

2021 listesinde A01 Broken Access Control. 2017'de birinci olan Injection 2021'de A03'e indi. Test edilen uygulamaların büyük kısmında bir tür erişim kontrolü hatası bulunduğu için zirveye çıktı.

Soru 4orta

A logged-in user views /invoice?id=1043, changes the URL to /invoice?id=1044, and sees another customer's invoice. Which OWASP 2021 category is this?

  1. A03 Injection
  2. A01 Broken Access Control
  3. A07 Identification and Authentication Failures
  4. A10 Server-Side Request Forgery
Cevabı göster
B) A01 Broken Access Control

Kullanıcı kimliği doğru (giriş yapmış), ama sunucu faturanın bu kullanıcıya ait olup olmadığını kontrol etmiyor. Bu IDOR (insecure direct object reference), A01'in tipik örneği. Düzeltme: her istekte invoice.ownerId == currentUser.id kontrolü (complete mediation).

Soru 5orta

In OWASP Top 10 2021, cross-site scripting (XSS) is included in which category?

  1. It has its own category, A07 XSS
  2. A03 Injection
  3. A05 Security Misconfiguration
  4. It was removed from the list
Cevabı göster
B) A03 Injection

2017'de XSS ayrı bir kategoriydi (A7). 2021'de Injection kategorisine katıldı, çünkü kök neden aynı: güvenilmeyen veri bir yorumlayıcıya (SQL motoru, tarayıcı) kod olarak ulaşıyor.

Soru 6orta

An application stores user passwords as unsalted MD5 hashes. Which OWASP 2021 category best fits?

  1. A02 Cryptographic Failures
  2. A06 Vulnerable and Outdated Components
  3. A09 Security Logging and Monitoring Failures
  4. A04 Insecure Design
Cevabı göster
A) A02 Cryptographic Failures

Zayıf ve parola için uygun olmayan hash (MD5, tuzsuz) A02'ye girer. MD5 çok hızlıdır ve tuz olmadan aynı parolalar aynı hash'i verir, önceden hesaplanmış tablolarla çözülebilir. Doğrusu: bcrypt, scrypt ya da Argon2 gibi yavaş, tuzlu bir parola hash fonksiyonu.

Soru 7kolay

A production server still has the vendor's default admin password and directory listing enabled. Which OWASP 2021 category is this?

  1. A05 Security Misconfiguration
  2. A01 Broken Access Control
  3. A08 Software and Data Integrity Failures
  4. A03 Injection
Cevabı göster
A) A05 Security Misconfiguration

Kodda hata yok, ayar yanlış: varsayılan parola, açık dizin listeleme, ayrıntılı hata sayfaları, gereksiz açık servisler. Hepsi A05. Önlem: sertleştirme (hardening) kontrol listesi ve ortamlar arası otomatik, tekrarlanabilir yapılandırma.

Soru 8zor

A SAST tool reports 40 findings; 28 of them are real vulnerabilities. The code actually contains 35 real vulnerabilities. What are the tool's precision and recall?

Cevabı göster
precision = 0.70, recall = 0.80

Doğru pozitif TP = 28, yanlış pozitif FP = 40−28=1240 - 28 = 12, kaçırılan FN = 35−28=735 - 28 = 7.precision=TPTP+FP=2840=0.70\text{precision} = \frac{TP}{TP+FP} = \frac{28}{40} = 0.70recall=TPTP+FN=2835=0.80\text{recall} = \frac{TP}{TP+FN} = \frac{28}{35} = 0.80Precision düşükse geliştiriciler yanlış alarmlardan bıkar, recall düşükse açık kaçar. İkisinin harmonik ortalaması F1 ≈ 0.747.

Soru 9zor

A mutation fuzzer triggers a particular crash with probability 1/50001/5000 per input, independently. It runs 20 000 inputs. What is the expected number of crashing inputs, and the probability of at least one crash (4 decimals)?

Cevabı göster
4 expected, P ≈ 0.9817

Beklenen değer np=20000/5000=4n p = 20000 / 5000 = 4.
En az bir çökme: 1−(1−p)n=1−(1−1/5000)20000≈0.98171 - (1 - p)^n = 1 - (1 - 1/5000)^{20000} \approx 0.9817.
Kontrol: pp küçük olduğunda 1−e−np=1−e−4≈0.98171 - e^{-np} = 1 - e^{-4} \approx 0.9817. Az olasılıklı hataları bulmak için çok sayıda girdi gerekir; fuzzing'in gücü otomasyondan gelir.

Soru 10orta

A penetration tester is given full source code, architecture diagrams and credentials before testing. What type of test is this?

  1. Black-box
  2. White-box
  3. Grey-box
  4. Red-team without scope
Cevabı göster
B) White-box

White-box (beyaz kutu, clear-box) testte test eden her şeyi bilir: kod, mimari, hesaplar. Black-box'ta dışarıdan bir saldırgan gibi hiçbir şey bilmez. Grey-box ikisinin arası, örneğin sadece normal bir kullanıcı hesabı verilir. Her durumda yazılı izin ve kapsam (rules of engagement) şarttır.

Soru 11kolay

An application uses a third-party logging library version with a publicly known critical CVE that has had a patch available for a year. Which OWASP 2021 category is this?

  1. A06 Vulnerable and Outdated Components
  2. A09 Security Logging and Monitoring Failures
  3. A02 Cryptographic Failures
  4. A04 Insecure Design
Cevabı göster
A) A06 Vulnerable and Outdated Components

Açık senin kodunda değil, kullandığın bileşende ve yaması var ama uygulanmamış: A06. İsimdeki "logging" yanıltmasın; A09 olayların loglanmaması ve izlenmemesiyle ilgilidir. Önlem: bağımlılık envanteri (SBOM) ve SCA (software composition analysis) araçları.

Soru 12zor

A feature lets users enter a URL so the server fetches a preview image. An attacker enters http://169.254.169.254/ and the server returns internal cloud metadata. Which OWASP 2021 category is this, and what is the core fix?

  1. A03 Injection; escape HTML
  2. A10 SSRF; validate the destination against an allowlist and block internal address ranges
  3. A07 Authentication Failures; add MFA
  4. A05 Misconfiguration; disable directory listing
Cevabı göster
B) A10 SSRF; validate the destination against an allowlist and block internal address ranges

Sunucu, kullanıcının verdiği adrese kendi adına istek atıyor ve iç ağdaki bir servise ulaşıyor: SSRF (server-side request forgery). Kök çözüm sunucunun gidebileceği hedefleri allowlist ile sınırlamak, iç ağ ve link-local aralıklarını engellemek, yönlendirmeleri takip etmemek. Ağ seviyesinde çıkış (egress) kısıtı ikinci katman.

Doğrulama: Precision, recall, F1 ve fuzzing olasılıkları (1 - (1 - p)^n) node ile hesaplandı (verify/SEN2008/14.mjs). OWASP sıralaması 2021 resmi listesiyle karşılaştırıldı.

Deftere not kartı

SAST: kod çalışmadan, erken, tüm yollar, çok false positive. DAST: çalışan uygulama, dışarıdan, ortam hatalarını da görür Fuzzing: bozuk/rastgele çok girdi → çökme. mutation (örneği boz) | generation (gramerden üret) | coverage-guided P(en az 1) = 1 - (1-p)^n ≈ 1 - e^(-np) beklenen = n·p Pentest: black (bilgi yok) | grey (kısmi) | white (kod+mimari). Yazılı izin + kapsam ŞART Aşamalar: kapsam → keşif → tarama → doğrulama → raporlama → yeniden test precision = TP/(TP+FP) recall = TP/(TP+FN) OWASP 2021: A01 Broken Access Control | A02 Cryptographic Failures | A03 Injection (XSS dahil) A04 Insecure Design | A05 Security Misconfiguration | A06 Vulnerable & Outdated Components A07 Identification & Authentication Failures | A08 Software & Data Integrity Failures A09 Security Logging & Monitoring Failures | A10 SSRF IDOR (id değiştirip başkasının verisi) → A01 varsayılan parola → A05 MD5 parola → A02