Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 12

Kimlik Doğrulama Atlatma Tespit Yöntemleri

Recommended resources

Harika bir önceki derste, veri dönüşümlerinin ve parser farklılıklarının en sağlam güvenlik filtrelerini bile nasıl atlatabileceğini gördük. Bir verinin yorumlanma şeklindeki tutarsızlıkları istismar etme yeteneği, uzman bir kod analistinin en önemli becerilerindendir. Bu derste ise bir adım daha ileri giderek, uygulamanın kendi mantığındaki tutarsızlıkları nasıl istismar edebileceğimizi inceleyeceğiz. Odak noktamız, uygulamanın dijital kalesi olan kimlik doğrulama mekanizmaları olacak.

Bu dersin sonunda, basit parola denetimlerinin ötesine geçerek, kimlik doğrulama akışlarındaki alternatif kod yollarını, zayıf geri dönüş mekanizmalarını ve istismara açık hata yönetimi mantığını tespit edebilecek yetkinliğe ulaşacaksınız. Bu, otomatik araçların genellikle gözden kaçırdığı, ancak bir saldırganın "içeri girmenin" anahtarı olarak kullanabileceği ince mantık hatalarını bulma sanatıdır.

"Mutlu Yol"un Ötesindeki Tehlikeler

Her kimlik doğrulama süreci, geliştiricinin tasarladığı bir "mutlu yol" (happy path) içerir: Kullanıcı doğru kimlik bilgilerini girer, sistem doğrular ve oturum açılır. Ancak güvenlik analistleri olarak bizim asıl ilgi alanımız, bu mutlu yolun dışındaki sayısız "mutsuz yol"dur (unhappy paths). Bu yollar, uygulamanın beklenmedik durumlara verdiği tepkilerdir ve genellikle zafiyetlerin saklandığı yerlerdir:

  • Yanlış parola girilmesi
  • Hesabın kilitlenmesi veya mevcut olmaması
  • Parola sıfırlama veya "kullanıcı adımı unuttum" akışları
  • SSO (Tekli Oturum Açma) başarısız olduğunda devreye giren yerel parola ile oturum açma gibi geri dönüş mekanizmaları
  • Veritabanı bağlantı hatası veya zaman aşımı gibi sistemsel hatalar

Bir saldırgan gibi düşünmek, bu alternatif yolların her birini, ana kapıyı atlatmak için kullanılabilecek potansiyel birer servis kapısı olarak görmeyi gerektirir.


1. Durum Makinesi Olarak Kimlik Doğrulama: "Yarı Açık" (Half-Open) Saldırılar

Kimlik doğrulama sürecini bir durum makinesi (state machine) olarak modelleyebiliriz. Kullanıcı, Kimliği Doğrulanmamış (Unauthenticated) durumundan, çeşitli adımlardan geçerek Tamamen Doğrulanmış (Fully Authenticated) durumuna ulaşır. Zafiyetler, uygulamanın bu durumlar arasındaki geçişleri doğru yönetemediğinde veya bir durumdan diğerine yasa dışı bir geçişe izin verdiğinde ortaya çıkar.

Bu tür mantık hatalarının en bilinen örneklerinden biri "Yarı Açık" (Half-open) saldırıdır. OWASP ASVS belgesi bu saldırı türünü çok net bir şekilde açıklamaktadır.

[PDF] OWASP Uygulama Güvenliği Doğrulama Standardı 4.0

Bu belge, modern uygulama güvenliği için bir standartlar bütünü sunar. Bizim için önemli olan kısım, oturum yönetimi saldırılarını ve özellikle de durum yönetimi zafiyetlerini nasıl açıkladığıdır.

Lütfen "V3.7 Oturum Yönetimini Hedef Alan Saldırılara Karşı Savunma" başlığı altındaki “Half-open Attack” Açıklaması bölümünü okuyun. Özellikle saldırı modelinin tanımına odaklanın. Bu metin, bir saldırganın, parola sıfırlama gibi bir süreci başlatıp yarıda bırakarak, hedef kullanıcının oturum nesnesini nasıl ele geçirebileceğini ve uygulamanın erişim kontrol mekanizmasındaki bir zayıflıktan faydalanarak nasıl yetki kazanabileceğini anlatmaktadır.

Okuduğunuz gibi, "half-open" saldırısının temel mantığı şudur:

  1. Başlatma: Saldırgan, kurban adına parola sıfırlama gibi çok adımlı bir işlemi başlatır.
  2. Durum Oluşturma: Uygulama, kurbanın bilgilerini içeren bir oturum nesnesi oluşturur ancak bu nesneyi partially_authenticated (kısmen doğrulanmış) veya awaiting_password_reset gibi bir durumda işaretler.
  3. İptal ve Sömürü: Saldırgan, işlemi tamamlamadan bu akıştan çıkar ve kurbanın kısmen doğrulanmış oturumuyla uygulamanın başka bir bölümüne gitmeye çalışır.
  4. Zafiyet: Erişmek istediği uç noktanın (endpoint) erişim kontrolü, if (session.user != null) gibi basit bir kontrol yapar, ancak oturumun isAuthenticated == true olup olmadığını, yani tamamen doğrulanmış bir durumda olup olmadığını kontrol etmeyi ihmal eder.

Kod analizi sırasında, özellikle çok adımlı işlemlerde (kayıt, parola sıfırlama, MFA kurulumu) oluşturulan oturum nesnelerinin yaşam döngüsünü ve durumlarını dikkatle izlemelisiniz. Her hassas işlemden önce oturumun sadece var olup olmadığı değil, tamamen doğrulanmış bir durumda olup olmadığı da kontrol edilmelidir.


2. Geri Dönüş Mekanizmaları: En Zayıf Halka Prensibi

Modern uygulamalar genellikle birden fazla kimlik doğrulama ve hesap kurtarma seçeneği sunar. Bunlar, SSO, "sihirli link" ile giriş, SMS/e-posta ile tek kullanımlık kod gönderme veya güvenlik soruları gibi mekanizmalar olabilir. Ancak güvenlik açısından temel bir kural vardır: Bir sistemin güvenliği, en zayıf halkası kadardır.

OWASP ASVS bu prensibi net bir şekilde vurgular:

[PDF] OWASP Uygulama Güvenliği Doğrulama Standardı 4.0

Bu belgenin mimari gereksinimler bölümü, kimlik doğrulama tasarımının temel felsefesine dair önemli bir ilke içerir.

"V1.2 Kimlik Doğrulaması Mimari Gereksinimleri" başlığı altındaki paragrafı okuyun. Bu ilke, bir sistemdeki tüm kimlik doğrulama yollarının (ana parola, parola sıfırlama, çağrı merkezi vb.) eşit güvenlik seviyesinde olması gerektiğini belirtir.

Kod analizi yaparken, uygulamanın ana parola ile giriş mekanizması çok güvenli olabilir. Ancak, üç basit güvenlik sorusunu cevaplayarak parolanın sıfırlanabildiği bir "parolamı unuttum" özelliği varsa, sistemin gerçek güvenliği o güvenlik sorularının zayıflığı kadardır.

Geri dönüş mekanizmalarını incelerken sormanız gereken sorular şunlardır:

  • Alternatif Kanallar Ne Kadar Güvenli? SMS ve e-posta ile gönderilen kodlar, SIM swapping veya e-posta hesabının ele geçirilmesi gibi saldırılara karşı savunmasızdır. ASVS, bu yöntemleri "kısıtlı" olarak tanımlar ve daha güvenli alternatifler (örneğin, push bildirimleri) önerir.
  • Kurtarma Token'ları Güçlü mü? Parola sıfırlama linklerindeki veya tek kullanımlık kodlardaki token'lar yeterli entropiye sahip mi? Tahmin edilebilirler mi?
  • Token Yönetimi Doğru mu? Bu token'lar kısa ömürlü mü ve tek kullanımlık mı? Kullanıldıktan sonra veya süreleri dolduğunda geçersiz kılınıyorlar mı? (LINK, bölüm 2.7.2 ve 2.7.3 bu gereksinimleri detaylandırır).
  • Bilgi Sızıntısı Var mı? Parola sıfırlama akışı, "Böyle bir kullanıcı bulunamadı" veya "E-posta gönderildi" gibi farklı yanıtlar vererek kullanıcı adlarının enumerate edilmesine (taranmasına) olanak tanıyor mu?

3. Hata Yönetimi Mantığı: Fail-Open vs. Fail-Close

Uygulamanın beklenmedik hatalar karşısındaki davranışı, bir güvenlik zafiyeti ile güvenli bir sistem arasındaki farkı yaratabilir. Bu bağlamda iki temel tasarım felsefesi vardır:

  • Fail-Close (Güvenli): Bir hata durumunda (örn. veritabanı bağlantı kopması, LDAP sunucusuna ulaşılamaması), sistem varsayılan olarak erişimi reddeder. Bu, güvenlik açısından doğru yaklaşımdır.
  • Fail-Open (Güvensiz): Hata durumunda sistem varsayılan olarak erişime izin verir. Bu durum genellikle try-catch bloklarının yanlış tasarlanmasından kaynaklanır ve kritik bir zafiyettir.

Örneğin, aşağıdaki Java kod parçasını inceleyelim:

boolean isAuthorized = false; // Default to not authorized
try {
    // Attempt to check permissions against a remote service
    isAuthorized = remotePermissionService.check(user, permission); 
} catch (Exception e) {
    // Log the error, but do nothing else
    log.error("Permission check failed: " + e.getMessage());
    // isAuthorized remains false
}

if (isAuthorized) {
    // Grant access
} else {
    // Deny access
}

Bu kod, fail-close prensibine uyar. isAuthorized değişkeni başlangıçta false olarak ayarlandığı ve catch bloğu bu değeri değiştirmediği için, herhangi bir hata durumunda erişim reddedilecektir. Ancak bu değişken başlangıçta true olsaydı veya catch bloğu içinde yanlışlıkla true olarak ayatlansaydı, bir fail-open zafiyeti oluşurdu.

Bazen bu tür atlatma mantıkları, kasıtlı olarak bir "arka kapı" (backdoor) şeklinde kodun içine yerleştirilebilir. Aşağıdaki akış şeması, bu durumu mükemmel bir şekilde göstermektedir.

Bu akış şeması, bir kimlik doğrulama sürecindeki gizli bir alternatif yolu göstermektedir. Normalde, `checkUsernamePassword` fonksiyonu çağrılır. Ancak kod, önce parolanın bir "backdoor password" olup olmadığını kontrol eder. Eğer eşleşme varsa, normal `DsSecID_checkLogin` fonksiyonunu tamamen atlar ve doğrudan süreci başarılı olarak işaretleyerek devam eder. Bu, kod review sırasında aranması gereken, kasıtlı olarak eklenmiş bir atlatma mekanizmasının kusursuz bir örneğidir.

Ayrıca, hata mesajlarının kendisi de birer bilgi sızıntısı kaynağıdır.

Bilgi Güvenliği Ve Siber Güvenlik Kapsamında Bakanlık ...

Bu tez, genel siber güvenlik konularını ele alırken, hata yönetimine dair temel ve önemli bir prensibi vurgulamaktadır.

"3.2.9. Hata Yönetimi" bölümünde, hata mesajlarının içeriğiyle ilgili önerileri okuyun. Saldırgana sistemin iç yapısı, kullanılan teknolojiler veya geçerli veri hakkında ipuçları verebilecek detaylı hata mesajlarından kaçınılması gerektiği belirtilmektedir.


Kod Review İçin Kontrol Listesi

Bu derste öğrendiklerimizi toparlayarak, kimlik doğrulama atlatmalarını bulmak için pratik bir kontrol listesi oluşturalım:

  1. Tüm Giriş Noktalarını Haritalayın:

    • Sadece /login değil, aynı zamanda API uç noktalarını, parola sıfırlama formlarını, hesap kurtarma sayfalarını, OAuth/OIDC geri dönüş (callback) URL'lerini ve "beni hatırla" fonksiyonlarını da tespit edin.
  2. Durum Yönetimini Sorgulayın:

    • Kullanıcının kimlik doğrulama durumu (unauthenticated, partially-authenticated, fully-authenticated) her hassas işlemde açıkça kontrol ediliyor mu?
    • Parola sıfırlama veya MFA kaydı gibi çok adımlı işlemlerde oluşturulan "yarı açık" oturumların istismar edilip edilemeyeceğini kontrol edin.
  3. Alternatif Yolları Karşılaştırın:

    • Tüm kimlik doğrulama ve hesap kurtarma yollarının güvenlik seviyeleri eşit mi? Güvenlik soruları, SMS kodları veya e-posta linkleri gibi mekanizmalar ana parola mekanizması kadar güçlü mü?
  4. Hata Mantığını İnceleyin (try-catch):

    • Kimlik doğrulama veya yetkilendirme ile ilgili tüm try-catch bloklarında, varsayılan davranış erişimi reddetmek mi (fail-close)?
    • catch blokları, saldırganın işine yarayacak (stack trace, veritabanı sorguları, dahili IP'ler vb.) bilgileri sızdırıyor mu?
  5. Ortama Özgü Kodları Araştırın:

    • if (environment === 'development') veya if (user === 'debug') gibi, geliştirme veya test amacıyla kimlik doğrulamayı atlayan kod blokları var mı? Bu blokların yanlışlıkla üretim ortamına dağıtılması riski var mı? Yukarıdaki akış şeması (LINK), bu tür bir mantığın ne kadar tehlikeli olabileceğinin bir kanıtıdır.

Sonuç

Bu derste, kimlik doğrulamanın sadece doğru şifreyi kontrol etmekten ibaret olmadığını gördük. Gerçek riskler genellikle gözden kaçan alternatif yollarda, zayıf tasarlanmış geri dönüş mekanizmalarında ve güvenli olmayan hata yönetimi mantığında gizlidir. Bir kod analisti olarak göreviniz, uygulamanın sadece "mutlu yolda" değil, tüm bu istisnai durumlarda da güvenli davrandığından emin olmaktır. Temel prensip şudur: Emin değilsen, reddet.

Önceki derslerde veri akışını ve dönüşümünü analiz ettik. Bu derste ise mantık ve durum akışını analiz ettik. Bir sonraki dersimizde, bu ikisini birleştirerek modern uygulamaların temel taşlarından biri olan JSON Web Token (JWT) implementasyonlarına odaklanacağız. JWT'lerin iç yapısındaki mantık hatalarını, özellikle algoritma karışıklığı (algorithm confusion), eksik claim doğrulaması ve anahtar yönetimi zafiyetlerini nasıl tespit edeceğimizi öğreneceğiz.