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.
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:
- Tek teknik yetmez. Statik analiz, dinamik test ve insan incelemesi farklı hataları bulur.
- Erken test ucuzdur. SAST ve kod inceleme kod yazılırken çalışır.
- Araç çıktısı ham veridir. Her bulgu doğrulanmalı; false positive gürültü, false negative kör nokta.
- İzinsiz test yapılmaz. Pentest yazılı izin ve net kapsamla yapılır.
- OWASP listesini senaryodan tanı. Kategori adını ezberlemek yetmez, örnekle eşleştir.
Güvenlik testi teknikleri
| Teknik | Ne zaman | Nasıl | İyi bulduğu | Zayıf yanı |
|---|---|---|---|---|
| Kod inceleme (code review) | her commit | insan okur, kontrol listesi | mantık ve tasarım hataları, eksik yetki kontrolü | yavaş, kişiye bağlı |
| SAST | derleme sırasında, CI | kodu çalıştırmadan veri akışı analizi | injection, tehlikeli API, sabit parola | çok false positive, çalışma ortamını görmez |
| DAST | test ortamında çalışan uygulama | dışarıdan HTTP istekleri gönderir | yapılandırma hataları, reflected XSS, eksik başlıklar | kodun hangi satırı olduğunu söyleyemez, kapsamı sınırlı |
| Fuzzing | test, sürekli | binlerce bozuk girdi | çökme, bellek hataları, parser açıkları | mantık hatalarını bulmaz |
| Penetrasyon testi | yayın öncesi, periyodik | yetkili uzman saldırgan gibi düşünür | zincirlenmiş açıklar, iş mantığı hataları | pahalı, anlık fotoğraf |
| SCA | CI | bağımlılık sürümlerini CVE veritabanıyla karşılaştırır | bilinen açıklı kütüphaneler | kendi 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.
| Kavram | Anlamı | Değer |
|---|---|---|
| TP (true positive) | doğru bulgu | 45 |
| FP (false positive) | yanlış alarm | 60 − 45 = 15 |
| FN (false negative) | kaçırılan gerçek açık | 50 − 45 = 5 |
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ür | Girdiyi nasıl üretir |
|---|---|
| Mutation-based | geçerli örnek dosyaları bit çevirerek, bayt ekleyip silerek bozar |
| Generation-based | format tanımından (gramer, protokol şeması) sıfırdan üretir |
| Coverage-guided | yeni kod yolu açan girdileri saklar ve onları mutasyona uğratır (AFL, libFuzzer) |
Neden çok girdi gerekir? Bir hata girdi başına olasılıkla tetikleniyorsa, bağımsız girdide en az bir kez tetiklenme olasılığı:
, için . 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 ‘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ür | Test edenin bilgisi |
|---|---|
| Black-box | hiçbir iç bilgi yok, dış saldırgan gibi |
| Grey-box | kısmi bilgi, örn. normal kullanıcı hesabı |
| White-box | kaynak 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:
| Kod | Kategori | Tipik örnek | Temel önlem |
|---|---|---|---|
| A01 | Broken Access Control | URL’deki id’yi değiştirip başkasının kaydını görmek (IDOR) | her istekte sunucu tarafı yetki kontrolü, varsayılan reddet |
| A02 | Cryptographic Failures | parolayı MD5 ile saklamak, HTTP üzerinden kart verisi | güçlü algoritma, TLS, parola için bcrypt/Argon2 |
| A03 | Injection | SQLi, XSS, OS command injection | parametreli sorgu, çıktı kodlama, allowlist |
| A04 | Insecure Design | şifre sıfırlamada sınırsız deneme hakkı | tehdit modelleme, güvenli tasarım kalıpları |
| A05 | Security Misconfiguration | varsayılan parola, açık dizin listeleme, ayrıntılı hata | sertleştirme, otomatik yapılandırma |
| A06 | Vulnerable and Outdated Components | yaması çıkmış CVE’li kütüphane | bağımlılık envanteri, SCA, düzenli güncelleme |
| A07 | Identification and Authentication Failures | brute-force’a açık login, zayıf oturum yönetimi | MFA, hız sınırı, güvenli oturum kimliği |
| A08 | Software and Data Integrity Failures | imzasız güncelleme, güvensiz deserialization | dijital imza, bütünlük kontrolü, güvenilir CI/CD |
| A09 | Security Logging and Monitoring Failures | başarısız girişler loglanmıyor, alarm yok | merkezi log, alarm, olay müdahale planı |
| A10 | Server-Side Request Forgery (SSRF) | sunucu kullanıcının verdiği URL’ye iç ağda istek atıyor | hedef 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üşünce | Doğrusu |
|---|---|
| SAST programı çalıştırır | Çalıştırmaz; DAST ve fuzzing çalıştırır |
| DAST kaynak koda bakar | Bakmaz; 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 yok | Yazılı izin ve kapsam olmadan yapılan test yasa dışıdır |
| OWASP 2021’de birinci Injection | A01 Broken Access Control; Injection A03 |
| XSS 2021’de ayrı kategori | A03 Injection içinde |
| Login olmuş kullanıcı başkasının faturasını görüyor → A07 | Kimlik doğru, yetki yanlış: A01 |
| CVE’li logging kütüphanesi → A09 | A06; A09 logların ve izlemenin eksikliği |
| Bir kez pentest yeter | Anlı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ç.
Which technique analyzes source code or bytecode for vulnerabilities without executing the program?
- DAST
- Fuzzing
- SAST
- Penetration testing
Cevabı göster
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.
What does a fuzzer primarily do?
- Reads the code and reports insecure functions
- Feeds large numbers of malformed or random inputs to a program and watches for crashes or hangs
- Encrypts test data
- Generates documentation from code
Cevabı göster
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.
In the OWASP Top 10 (2021), which category is ranked #1?
- Injection
- Broken Access Control
- Cryptographic Failures
- Security Misconfiguration
Cevabı göster
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ı.
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?
- A03 Injection
- A01 Broken Access Control
- A07 Identification and Authentication Failures
- A10 Server-Side Request Forgery
Cevabı göster
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).
In OWASP Top 10 2021, cross-site scripting (XSS) is included in which category?
- It has its own category, A07 XSS
- A03 Injection
- A05 Security Misconfiguration
- It was removed from the list
Cevabı göster
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.
An application stores user passwords as unsalted MD5 hashes. Which OWASP 2021 category best fits?
- A02 Cryptographic Failures
- A06 Vulnerable and Outdated Components
- A09 Security Logging and Monitoring Failures
- A04 Insecure Design
Cevabı göster
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.
A production server still has the vendor's default admin password and directory listing enabled. Which OWASP 2021 category is this?
- A05 Security Misconfiguration
- A01 Broken Access Control
- A08 Software and Data Integrity Failures
- A03 Injection
Cevabı göster
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.
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
Doğru pozitif TP = 28, yanlış pozitif FP = , kaçırılan FN = .Precision düşükse geliştiriciler yanlış alarmlardan bıkar, recall düşükse açık kaçar. İkisinin harmonik ortalaması F1 ≈ 0.747.
A mutation fuzzer triggers a particular crash with probability 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
Beklenen değer .
En az bir çökme: .
Kontrol: küçük olduğunda . Az olasılıklı hataları bulmak için çok sayıda girdi gerekir; fuzzing'in gücü otomasyondan gelir.
A penetration tester is given full source code, architecture diagrams and credentials before testing. What type of test is this?
- Black-box
- White-box
- Grey-box
- Red-team without scope
Cevabı göster
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.
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?
- A06 Vulnerable and Outdated Components
- A09 Security Logging and Monitoring Failures
- A02 Cryptographic Failures
- A04 Insecure Design
Cevabı göster
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ı.
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?
- A03 Injection; escape HTML
- A10 SSRF; validate the destination against an allowlist and block internal address ranges
- A07 Authentication Failures; add MFA
- A05 Misconfiguration; disable directory listing
Cevabı göster
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ı.