Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Dosya Yükleme Güvenliği Derinlemesine: Magic Byte Kontrolü, Görseli Yeniden Kodlamak, Zararlı Yazılım Taraması, Zip Bomb ve Blob'a Doğrudan SAS ile Yükleme
Yüklenen dosyanın adı da Content-Type'ı da istemcinin yazdığı metin; güvenlik, içeriği doğrulayıp dosyayı onaylanana kadar karantinada tutmaktan geçiyor. Magic byte ile izin listesini, polyglot'u etkisiz bırakan yeniden kodlamayı, EPUB'da zip bomb ve Zip Slip limitlerini, ClamAV ve Defender for Storage taramasını, tek blob'a yetkili kısa ömürlü SAS'ı ve imzalı indirme linkini Bookstore üzerinde uçtan uca kuruyoruz.
Uygulama Güvenlik Incident'ına Müdahale: Tespit, Kapsam Belirleme, Kanıtı Korumak, İletişim ve Bildirim
Bir güvenlik incident'ında önce kanıt korunur, etkilenen kayıtlar tahminle değil audit log'dan çıkarılır, sonra düzeltilir ve hukuk ile kişisel verilerden sorumlu kişi ilk saatte dahil edilir. Bookstore'da bir kurumun siparişlerinin başka kurumca okunduğu BOLA vakası: NIST SP 800-61r3, hash'li kanıt kopyası, etkilenen kayıt sorgusu ve testi, düzeltme, müşteri ve KVKK bildirimi, runbook ve tabletop exercise.
Pentest ile Çalışmak: Kapsam, Rules of Engagement, Bulguları Okumak, Retest ve Rapor Sonrası
Pentest'in değeri, test başlamadan yazılan kapsam ve rules of engagement ile test bittikten sonra her bulgunun bir regression testine ve bir karara dönüşmesine bağlıdır. Pentest, DAST, bug bounty ve red team farkı; Bookstore'un Kurumsal Sipariş pentest'inde kapsam, test hesapları ve durma koşulları, severity itirazı, kanıtlı false positive, kök nedene göre gruplama, F-01 ve F-02 için düzeltme ve testler, retest ve threat model güncellemesi.
Kendi Ürünün için Zafiyet Yönetimi: security.txt, Coordinated Disclosure, GitHub Security Advisory ve CVE
Dışarıdan gelen zafiyet bildirimi için önce bir kapı gerekir: RFC 9116'ya uygun security.txt, SECURITY.md ve GitHub private vulnerability reporting; sonra triage, draft advisory'de gizli düzeltme, CVE talebi ve düzeltilmiş sürümle aynı gün yayın. Bookstore API'sinden security.txt sunmak ve testlemek, sectxt doğrulaması, Bookstore.Contracts NuGet paketi için advisory akışı, bug bounty ve safe harbor.
Güvenlik Requirement'larını Yazmak: OWASP ASVS 5.0 ile Seviye Seçimi, Acceptance Criteria ve Security Champion
Güvenlik requirement'ı, hedeflenen ASVS seviyesinin yazılı olarak seçilmesi ve seçilen her maddenin bir testle ya da kanıtla doğrulanmasıdır; 345 maddeyi doldurmak değil. Bookstore için ASVS 5.0 seviye 2 hedefi ve bilerek eklenen bir seviye 3 maddesi, requirement dosyası, güvenlik acceptance criteria'sı ve abuse story, Definition of Done, dosya ile testleri eşleyen xUnit testi, security champion ve NIST SSDF eşlemesi.
STRIDE ile Tehdit Bulmak ve Önceliklendirmek: Element Başına STRIDE, Attack Tree, Risk Puanlama ve Mitigation Kararı
STRIDE'ı DFD'nin her elemanına türüne göre uygulayıp tehditleri olasılık × etki ile sıralamak, her biri için mitigate, eliminate, transfer ya da accept kararı vermek ve kararı bir teste ya da risk register satırına bağlamak gerekir. Bookstore'un webhook'u ve kurumsal satın alma onayı üzerinde LINDDUN, attack tree, DREAD'in neden bırakıldığı ve dört göz kuralını doğrulayan xUnit testleri, gerçek çıktılarla.
Threat Modeling Nedir? Dört Soru, Data Flow Diagram ve Trust Boundary ile Bookstore Checkout'unu Modellemek
Threat modeling, kod yazılmadan önce sistemin bir temsili üzerinde "ne ters gidebilir?" diye sormaktır ve en çok tasarım aşamasında işe yarar. Threat Modeling Manifesto'nun dört sorusu, DFD elemanları ve trust boundary'lerle Bookstore'un checkout, ödeme ve kargo akışını modelliyor, modeli OWASP Threat Dragon 2.6.2 ile JSON olarak repo'da versiyonluyor ve PR template'ine bağlıyoruz.
Yurt Dışına Aktarım ve Veri İhlali Hazırlığı: Cloud Region, LLM Sağlayıcıları, Standart Sözleşme ve 72 Saatlik Bildirim
Yurt dışına aktarım yalnız sunucunun yeri değildir; log, backup, e-posta, analytics ve LLM prompt'ları da aktarımdır ve 2024'ten beri yeterlilik kararı, standart sözleşme gibi uygun güvenceler ya da arızi hâllerden birine dayanmalıdır. Bookstore'da alt işleyen envanterini kodda tutuyor, standart sözleşmenin beş iş günlük bildirimini başlangıçta kontrol ediyor, erişim kaydıyla bir ihlalin kapsamını ve 72 saatlik bildirimin son anını ilk saatte çıkarıyoruz.
Aydınlatma, Açık Rıza ve Çerezler: Consent Kaydı, Çerez Banner'ı, Consent Mode ve Ticari İleti İzinleri (İYS)
Aydınlatma her veri işlemede yapılır, açık rıza ise yalnız rızaya dayanan işlemede ve ayrıca alınır; rıza da ispat edilebilir, sürümlü ve geri alınabilir olmalıdır. Bookstore'da append-only ConsentRecord'u, Kurum'un çerez rehberine göre eşit butonlu bir Angular banner'ını, varsayılanı denied olan Google Consent Mode'u, bunları doğrulayan Playwright testlerini ve ticari e-posta izinlerinin üç iş günü içinde İYS'ye bildirilmesini kuruyoruz.
Log, Telemetry ve Analytics'te Kişisel Veri: URL'ler, Exception Mesajları, IP Adresi, Session Replay ve Hata Raporlama Araçları
Kişisel veri log'a çoğu zaman bir LogInformation satırıyla değil; URL'deki e-postayla, log'a verilen bir record'la, exception mesajıyla, span tag'iyle ve metric label'ıyla girer. Bookstore'un checkout akışında bu sızıntıları gerçek çıktılarla gösteriyor, canary değerleri arayan bir testle kilitliyor, tarayıcı hata raporlarını temizleyip IP adresini kısaltıyor ve telemetry'yi envantere ekliyoruz.
Saklama Süresi, Silme ve Anonimleştirme: "Hesabımı Sil", Soft Delete, Backup'lar, Cache'ler ve Periyodik İmha Job'ı
"Hesabımı sil" talebi tek bir DELETE değil, verinin her parçası için ayrı bir karardır: profil silinir, siparişler yasal süre boyunca kişiden koparılıp saklanır, süre dolunca anonimleşir. Bookstore'da foreign key tuzağını, soft delete'in neden yetmediğini, kopyaların silme yollarını, periyodik imha job'ını, imha kaydını ve backup'tan geri yüklemede silinen müşterinin geri gelmesini erasure ledger ile çözmeyi gerçek çıktılarla gösteriyoruz.
Kişisel Veriyi Korumak: Always Encrypted, Uygulama Seviyesinde Şifreleme, Pseudonymization, Maskeleme ve Test Verisi
Hassas bir kişisel veri alanını korumanın yolu, tehdide göre katman seçmektir: TDE diski, Always Encrypted DBA'yı, uygulama seviyesinde AES-GCM backup ve replica'yı korur, maskeleme ise yalnız ekranı. Bookstore'da fatura kimlik numarasını purpose'a bağlı AES-GCM ile şifreliyor, HMAC blind index ile arıyor, destek ekibine maskeli gösteriyor ve test ortamını Bogus ile sahte kontrol haneli sentetik veriye taşıyoruz.