Kimlik Doğrulama Nedir?
Kimlik doğrulama, iddia ettikleri kişi olduklarından emin olmak için kullanıcı veya sistem gibi bir varlığın kimliğini doğrulama işlemidir. Güvenlik sistemlerinin temel bir unsurudur ve erişim ayrıcalıklarının verilmesinde ve hassas bilgilerin korunmasında hayati bir rol oynar.
Bilgisayar sistemleri ve ağları bağlamında kimlik doğrulama genellikle aşağıdaki adımları içerir:
1. Sunum: Erişim elde etmeye çalışan kuruluş, kullanıcı adı ve şifre, dijital sertifika veya biyometrik özellik (parmak izi veya iris taraması gibi) gibi kimlik bilgilerini sunar.
2. Doğrulama: Sistem, sunulan kimlik bilgilerini saklanan veya önceden kaydedilen bilgilerle karşılaştırarak doğrular. Bu doğrulama süreci, varlığın iddia edilen kimliğinin dosyadaki kayıtlarla eşleşmesini sağlar.
3. Yetkilendirme: Varlığın kimliği başarıyla doğrulandıktan sonra sistem, önceden tanımlanmış yetkilendirme kurallarına dayalı olarak uygun erişim ayrıcalıklarını verir. Bu ayrıcalıklar, belirli kaynaklara erişmeyi, belirli eylemleri gerçekleştirmeyi veya sistem içinde belirli düzeyde yetki almayı içerebilir.
Kimlik doğrulama mekanizmaları, belirli gereksinimlere ve ihtiyaç duyulan güvenlik düzeyine bağlı olarak değişiklik gösterebilir. Yaygın kimlik doğrulama yöntemleri arasında parolalar, kriptografik anahtarlar, dijital sertifikalar ve parola ile tek seferlik doğrulama kodu gibi birden çok kimlik doğrulama biçimini birleştiren çok faktörlü kimlik doğrulama (MFA) teknikleri yer alır.
Genel olarak kimlik doğrulama, erişim isteyen kişi veya kuruluşların kimliklerine güven tesis ederek sistemlerin ve verilerin bütünlüğünü ve güvenliğini sağlamak için kritik bir temel görevi görür.
Kimlik Doğrulaması Neden Önemlidir?
Kimlik doğrulama, güvenlik alanında birkaç temel nedenden dolayı son derece önemlidir:
1. Kimlik Doğrulaması: Kimlik doğrulama, bir sisteme veya kaynağa erişim isteyen varlığın gerçekten iddia ettiği kişi olmasını sağlar. Kuruluşlar, kimlikleri doğrulayarak kötü niyetli aktörlerin yetkisiz erişimini önleyebilir ve veri ihlali veya yetkisiz faaliyet riskini azaltabilir.
2. Erişim Kontrolü: Kimlik doğrulama, kuruluşların ayrıntılı erişim kontrollerini uygulamasına ve kimliği doğrulanmış varlıklara verilen ayrıcalıkların düzeyini belirlemesine olanak tanır. Kimlikleri doğrulayarak sistemler, kullanıcıların yalnızca ihtiyaç duydukları kaynaklara erişmelerini sağlamak için uygun yetkilendirme politikalarını uygulayabilir, böylece içeriden gelen tehditler veya hassas bilgilere yetkisiz erişim riski azaltılabilir.
3. Veri Koruma: Doğru kimlik doğrulama, verilerin gizliliğinin ve bütünlüğünün korunmasına yardımcı olur. Kuruluşlar, erişim izni vermeden önce kullanıcıların veya sistemlerin kimliğini doğrulayarak, hassas verilerin yetkisiz görüntülemeye, değiştirmeye veya silinmeye karşı güvende kalmasını sağlayabilir.
4. Hesap Verebilirlik ve Denetlenebilirlik: Kimlik doğrulama, bir sistem içinde gerçekleştirilen eylemlerin hesap verebilirliğini sağlamada hayati bir rol oynar. Kuruluşlar, belirli eylemleri kimliği doğrulanmış kimliklerle ilişkilendirerek faaliyetleri izleyebilir ve izleyebilir, adli soruşturmaları, uyumluluk gerekliliklerini ve denetim süreçlerini kolaylaştırabilir.
5. Uyumluluk ve Mevzuat Gereksinimleri: Birçok sektör ve yargı bölgesinde, güçlü kimlik doğrulama uygulamaları gerektiren özel düzenlemeler ve standartlar vardır. Bu gereksinimlerin karşılanması, kuruluşların uyumluluğu sürdürmesi, yasal sonuçlardan kaçınması ve itibarını koruması açısından çok önemlidir.
6. Kullanıcı Hesaplarının Korunması: Kimlik doğrulama, kullanıcı hesaplarını korumak ve kişisel veya gizli bilgilere yetkisiz erişimi önlemek için gereklidir. Kuruluşlar, çok faktörlü kimlik doğrulama gibi güçlü kimlik doğrulama önlemlerini uygulayarak hesap güvenliğinin ihlal edilmesi ve yetkisiz kullanım riskini önemli ölçüde azaltabilir.
Genel olarak kimlik doğrulama, herhangi bir güvenlik stratejisinin kritik bir bileşenidir. Yetkisiz erişime karşı temel bir savunma katmanı sağlar, hassas verileri korur, hesap verebilirliği sağlar ve kuruluşların düzenleyici yükümlülüklerini yerine getirmesine yardımcı olur. Kuruluşlar, sağlam kimlik doğrulama uygulamaları uygulayarak güven oluşturabilir ve sistem ve kaynaklarının güvenliğini ve bütünlüğünü koruyabilir.
Yetki?
Yetkilendirme, kimliği doğrulanmış bir varlığın bir sistem veya uygulama içinde hangi eylemlere veya kaynaklara erişmesine izin verildiğini belirleme sürecidir. Varlığın kimliğine ve atanmış ayrıcalıklara dayalı olarak erişimi kontrol etmek için kurallar ve izinler oluşturmayı içerir.
Bir varlığın kimliği doğrulandıktan sonra yetkilendirme süreci başlar. Sistem, kimliği doğrulanmış varlığın rol, grup üyeliği veya belirli erişim hakları gibi özelliklerini değerlendirir ve bunları önceden tanımlanmış yetkilendirme politikalarıyla karşılaştırır. Bu politikalar, farklı varlıklar veya gruplar için izin verilen eylemleri veya kaynakları belirtir.
Kimlik doğrulama ve yetkilendirme, güvenlik alanında farklı ancak birbirine bağlı kavramlardır. İşte ikisi arasındaki temel farklar:
Kimlik doğrulama
– Kimlik doğrulama, iddia ettikleri kişi olduklarından emin olmak için kullanıcı veya sistem gibi bir varlığın kimliğini doğrulama işlemidir.
– Kullanıcı adı ve şifre, dijital sertifika veya biyometrik bilgiler gibi kuruluşun kimlik bilgilerinin doğruluğunun teyit edilmesine odaklanır.
– Kimlik doğrulamanın amacı, bir sisteme veya kaynağa erişmeye çalışan varlığın kimliğine güven sağlamaktır.
– Başarılı kimlik doğrulama, varlığa, sonraki yetkilendirme kararları için temel görevi gören, kimlik doğrulaması yapılmış bir durum verir.
Yetki
– Yetkilendirme, doğrulanmış kimliklere ve önceden belirlenmiş yetkilendirme kurallarına göre kimliği doğrulanmış varlıklara erişim ayrıcalıkları verme veya reddetme işlemidir.
– Kimliği doğrulanmış bir varlığın bir sistem veya uygulama içinde hangi eylemlere veya kaynaklara erişmesine izin verildiğini belirler.
– Yetkilendirme, farklı varlıklar veya gruplar için izin verilen eylemleri veya kaynakları belirten önceden tanımlanmış kurallara ve politikalara dayanır.
– Varlıkların rollerine, sorumluluklarına ve atanan ayrıcalıklarına göre uygun erişim düzeylerine sahip olmasını sağlar.
– Yetkilendirme, erişim kontrolünün ve en az ayrıcalık ilkesinin uygulanmasının kritik bir bileşenidir.
Özetle, kimlik doğrulama bir varlığın kimliğini doğrularken, yetkilendirme, kimliği doğrulanmış varlığın sistem içinde ne yapmasına veya erişmesine izin verildiğini belirler. Kimlik doğrulama, kimliğe güven sağlar ve yetkilendirme, bu güvene dayalı olarak uygun erişim ayrıcalıklarını kontrol eder ve verir. Her iki süreç de sistemlere ve kaynaklara güvenli ve kontrollü erişim sağlamak için birlikte çalışır.
JSON Web Token
JWT, JSON Web Token anlamına gelir. Bir JSON nesnesi olarak taraflar arasında bilgilerin güvenli bir şekilde iletilmesinin kompakt ve bağımsız bir yolunu tanımlayan açık bir standarttır (RFC 7519). JWT’ler, modern web uygulamalarında ve API’lerde genellikle kimlik doğrulama ve yetkilendirme amacıyla kullanılır.
Bir JWT üç bölümden oluşur: Base64URL kodlaması kullanılarak birleştirilen ve tek bir dize olarak kodlanan bir başlık/header, bir veri yükü/payload ve bir imza. Her bölüm farklı türde bilgiler içerir:
Başlık: Başlık genellikle belirtecin türü ve belirteci imzalamak veya şifrelemek için kullanılan şifreleme algoritmaları hakkında meta veriler içerir. Yaygın algoritmalar arasında HMAC, RSA veya ECDSA bulunur.
Yük/payload: Talepler veya gövde olarak da bilinen veri, kimliği doğrulanmış kullanıcı hakkındaki gerçek verileri veya iddiaları veya diğer ilgili bilgileri taşır. Talepler, standart talepleri (ör. ihraççı, konu, sona erme süresi) ve uygulama tarafından tanımlanan özel talepleri içerebilir.
İmza: İmza, başlıktan belirtilen şifreleme algoritması kullanılarak kodlanmış başlık, kodlanmış veri ve gizli anahtarın (veya genel/özel anahtar çiftinin) birleştirilmesiyle oluşturulur. İmza, token alıcısının bütünlüğünü ve orijinalliğini doğrulamasını sağlar.
JWT’ler, bilgileri kompakt ve taşınabilir bir şekilde güvenli bir şekilde iletme yetenekleri nedeniyle popülerlik kazanmıştır. HTTP üstbilgileri, sorgu parametreleri aracılığıyla veya istek gövdesi içinde kolayca iletilebilirler. Alıcı, iletim sırasında belirtecin tahrif edilmediğinden veya değiştirilmediğinden emin olmak için JWT’nin imzasını doğrulayabilir. JWT’ler, tek oturum açma (SSO), oturum yönetimi ve güvenli API iletişimi dahil olmak üzere çeşitli senaryolarda yaygın olarak kullanılır. Farklı platformlar ve programlama dilleri arasında ölçeklenebilirlik, uygulama kolaylığı ve birlikte çalışabilirlik gibi avantajlar sunarlar. Ancak olası güvenlik açıklarını azaltmak ve JWT tabanlı kimlik doğrulama ve yetkilendirme mekanizmalarının bütünlüğünü sağlamak için güvenli anahtar yönetimi ve doğrulama kontrolleri gibi uygun güvenlik önlemlerinin uygulanması önemlidir.
Örnek: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf 36POk6yJV_adQssw5c`
Başlık:
Base64URL kodlu başlık: ` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 `
Şifresi çözülmüş başlık:
{ "alg": "HS256", "typ": "JWT" }
Başlık, imza için kullanılan şifreleme algoritması (bu durumda, HMAC-SHA256 olan HS256) ve belirtecin türü (JWT) hakkında bilgi içerir.
Yük:
Base64URL kodlu veri: ` eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ `
Kodu çözülmüş yük:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Yük / payload, token ile ilişkili talepleri veya bilgileri içerir. Bu örnekte veri, kullanıcı kimliğini temsil eden konuyu (alt), kullanıcının adını (ad) ve verilen zaman damgasını (iat) içerir.
İmza:
İmza, belirtilen şifreleme algoritması (HS256) kullanılarak kodlanmış başlık, kodlanmış veri yükü ve gizli anahtarın birleştirilmesiyle oluşturulur. İmza, JWT’nin bütünlüğünü ve orijinalliğini sağlar.
Genel olarak JWT, noktalarla ayrılmış üç birleştirilmiş parçadan oluşur: header.payload.signature. Kimliği doğrulanmış varlık hakkında gerekli bilgileri taşır ve güvenli iletim ve kimlik doğrulama amacıyla kullanılır. JWT alıcısı, belirtecin bütünlüğünü ve orijinalliğini sağlamak için sağlanan gizli anahtarı kullanarak imzayı doğrulayabilir.
Not: Burada verilen örnekte basitlik amacıyla simetrik bir anahtar (HS256) kullanılmıştır. Uygulamada JWT’ler, imzayı oluşturmak için özel bir anahtarın kullanıldığı ve imza doğrulaması için karşılık gelen bir genel anahtarın kullanıldığı RSA veya ECDSA gibi asimetrik algoritmaları da kullanabilir.
Geleneksel yöntemlerin farkı nedir?
JWT’ler modern uygulamalarda çeşitli nedenlerden dolayı kimlik doğrulama ve yetkilendirme için kullanılır:
– Stateless ve Scalable: JWT’ler stateless tokenlerdir; bu, sunucuların oturum bilgilerini saklamasına gerek olmadığı anlamına gelir. Bu, sunucu tarafı oturum yönetimine veya veritabanı aramalarına güvenilmediği için ölçeklenebilirliğe olanak tanır.
– Merkezi Olmayan ve Dağıtılmış: JWT’ler, bağımsız/self-contained oldukları için farklı sistemler veya hizmetler arasında kolayca paylaşılabilir. Bu, merkezi bir oturum deposuna dayanmadan JWT’nin doğrulanmasıyla kimlik doğrulamanın yapılabileceği mikro hizmetler veya API’ler gibi esnek ve merkezi olmayan mimarilere olanak tanır.
– Etki Alanları Arası ve Platformlar Arası Uyumluluk: JWT’ler JSON’u temel alır ve bu da onları farklı programlama dilleri ve platformlarıyla uyumlu hale getirir. Sistemler ve etki alanları arasında birlikte çalışabilirliğe izin vererek HTTP üstbilgileri, sorgu parametreleri olarak veya istek gövdesi içinde iletilebilirler.
– Azaltılmış Veritabanı Aramaları: JWT’ler gerekli tüm bilgileri tokenin kendisinde içerir ve oturum doğrulama veya alma için sık veritabanı sorgularına olan ihtiyacı ortadan kaldırır. Bu, veritabanı aramalarına olan bağımlılığı azaltarak performansı artırır.
– Parçalı Yetkilendirme ve Talepler: JWT’ler, veri yüküne özel talepler ekleyerek kullanıcı rollerine, izinlere veya niteliklere dayalı olarak ayrıntılı yetkilendirme kararlarına olanak sağlayabilir. Bu, yetkilendirme amacıyla ek veritabanı aramalarına olan ihtiyacı ortadan kaldırır.
– Güvenlik ve Bütünlük: JWT’ler dijital olarak imzalanmıştır ve tokenin bütünlüğünü ve orijinalliğini sağlar. Alıcılar imzayı gizli anahtarı veya genel anahtarı kullanarak doğrulayabilir, bu da iletim sırasında güven ve emniyet sağlar.
JWT’ler avantajlar sunsa da belirli kullanım durumları için uygunluklarının dikkate alınması önemlidir. Ek karmaşıklığa neden olurlar ve güvenli anahtar yönetimi, belirtecin geçerlilik süresinin dolması ve iptal mekanizmaları gibi uygun güvenlik önlemleri hayati önem taşır.
JWT’leri kullanma kararı, bir uygulamanın veya sistemin özel gereksinimlerine, mimarisine ve güvenlik hususlarına bağlıdır.
Kid nedir?
Günümüzün birbirine bağlı dijital ortamında, hassas bilgilerin korunmasında güvenli kimlik doğrulama mekanizmaları çok önemlidir. JSON Web Tokenları (JWT’ler), güvenli kimlik doğrulama ve yetkilendirme için popüler bir seçim olarak ortaya çıktı. Kompaktlıkları, kullanım kolaylıkları ve bilgileri güvenli bir şekilde aktarma yetenekleri, onları yaygın olarak benimsenen bir çözüm haline getiriyor. Ancak en iyi tasarlanmış güvenlik önlemleri bile güvenlik açıklarından muaf değildir. Son zamanlarda, JWT uygulamasında “JWT Kid Injection güvenlik açıkları” olarak bilinen kritik bir zayıflık gün ışığına çıktı. Bu güvenlik açığı, saldırganların JWT içindeki “kid” (Anahtar Kimliği) parametresinden yararlanarak kötü amaçlı SQL sorguları ve diğer olası saldırıları yürütmesine olanak tanır.
Bu eğitimde JWT Kid Injection güvenlik açıklarının karmaşık ayrıntılarını inceleyerek nedenlerini, potansiyel etkilerini ve hafifletme stratejilerini araştıracağız. Bu güvenlik açığının anlaşılması geliştiriciler, güvenlik uzmanları ve güvenli kimlik doğrulama sistemlerinin oluşturulmasında veya sürdürülmesinde rol alan herkes için çok önemlidir.
Önceki tartışmamızda JSON Web Belirteçlerinin (JWT’ler) temellerini ve bunların modern kimlik doğrulama mekanizmalarındaki önemini araştırdık.
JWT Kid Injection güvenlik açıklarının mekaniğini derinlemesine inceleyerek bu güvenlik açığının var olmasının altında yatan nedenleri araştıracağız. Enjeksiyon vektörlerini, saldırganların “kid” parametresinden nasıl yararlandığını ve ele alınmaması halinde olası sonuçları analiz edeceğiz.
Kid nedir?
JSON Web Belirteçleri (JWT’ler) bağlamında “kid”, Anahtar Kimliği anlamına gelir. Belirteci imzalamak için hangi anahtarın kullanıldığını belirtmek için kullanılan JWT içindeki isteğe bağlı bir başlık parametresidir. “kid” değeri genellikle anahtar yönetimi altyapısı içindeki anahtar tanımlayıcı veya parmak izi gibi belirli bir anahtara karşılık gelir.
“Kid” parametresinin amacı, token doğrulama sırasında anahtar seçimine ve doğrulamaya yardımcı olmaktır. Bir JWT alındığında alıcı, belirtecin imzasını doğrulamak için uygun anahtarı almak veya belirlemek için “kid” değerini kullanabilir. Bu, kimlik doğrulama sürecini aksatmadan kriptografik anahtarların dinamik olarak döndürülmesine veya güncellenmesine olanak tanır.
Burada “kid” parametresine sahip bir JWT başlığı örneği verilmiştir:
{ "alg": "HS256", "typ": "JWT", "kid": "my_key_id" }
Bu örnekte “kid” parametresi “my_key_id” olarak ayarlanmıştır. Bu, JWT’nin “my_key_id” değeriyle tanımlanan belirli bir anahtar kullanılarak imzalandığını gösterir. Bu JWT’nin alıcısı bunu aldığında imzayı doğrulamak için hangi anahtarın kullanılacağını belirlemek için “kid” değerine başvurabilir. Başka bir örneğe bakalım;
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwia2lkIjoiMTIzNDU2Nzg5MCJ9.1LKTITDqS5FvdShvJzgOAWpH4b5R 6wBqqhi_xE9zizg
Başlık
{ "alg": "HS256", "typ": "JWT" }
Yük (Veri)
{ "sub": "1234567890", "name": "John Doe", "kid": "1234567890" }
“Kid” parametresinin gerçek değeri, uygulamaya ve kullanılan anahtar yönetimi altyapısına bağlı olarak değişebilir. Her bir tuşa atanan benzersiz bir tanımlayıcı veya bütünlüğünü ve benzersizliğini sağlamak için anahtarın özelliklerinden türetilen bir parmak izi olabilir.
“Kid” parametresi, güvenli anahtar seçimi ve rotasyonu için bir mekanizma sağlayarak JWT’nin bütünlüğünü ve orijinalliğini korurken kriptografik anahtarların verimli yönetimine olanak tanır.
kid Enjeksiyon
Anahtar Kimliği enjeksiyonu veya KID enjeksiyonu olarak da bilinen JWT kid enjeksiyonu, JSON Web Token’larını (JWT’ler) etkileyen bir güvenlik açığı veya saldırı vektörünü ifade eder. JSON Web Belirteçleri, web uygulamalarında kimlik doğrulama ve yetkilendirme için popüler bir yöntemdir.
JWT’de başlık, belirteci imzalamak için kullanılan algoritma ve imza doğrulaması için kullanılan anahtarı tanımlayan Anahtar Kimliği (KID) dahil olmak üzere belirteçle ilgili meta verileri içerir. KID genellikle belirli bir şifreleme anahtarıyla ilişkili benzersiz bir tanımlayıcıdır.
JWT KID enjeksiyon saldırısı, bir saldırganın, sunucuyu imza doğrulaması için amaçlanan anahtardan farklı bir anahtar kullanması için kandırmak amacıyla JWT başlığındaki KID değerini değiştirdiğinde meydana gelir. Saldırgan tarafından kontrol edilen bir anahtara karşılık gelen geçerli bir KID değeri enjekte ederek imza doğrulama sürecini atlayabilir veya zayıf veya güvenliği ihlal edilmiş bir anahtar kullanarak diğer kullanıcıların kimliğine bürünmelerine, yetkisiz erişim elde etmelerine veya başka kötü niyetli eylemler gerçekleştirmelerine olanak tanıyabilirler. JWT KID enjeksiyon saldırısının etkinliği, spesifik uygulamaya ve sunucunun KID değerini nasıl işlediğine bağlıdır. Sunucu, uygun doğrulama olmadan KID değerine körü körüne güvenirse, ciddi bir güvenlik ihlaline yol açabilir.
JSON Web Token’ları (JWT’ler), çok yönlü olacak ve farklı senaryolara uyarlanabilecek şekilde tasarlanmıştır; bu, özelleştirme fırsatları getirir ancak aynı zamanda uygulama ve kullanım hataları nedeniyle güvenlik açıklarının olasılığını da artırır. JWT’lerle ilgili bazı yaygın güvenlik açıkları şunlardır:
Güvenli Olmayan Anahtar Yönetimi
İmzalama ve doğrulama için kullanılan kriptografik anahtarların yanlış yönetimi, belirteçlere yetkisiz erişime veya tahrifata yol açabilir. Örneğin, bir geliştiricinin JWT’leri imzalamak için kullanılan gizli anahtarı yanlışlıkla ifşa etmesi durumunda, saldırgan yetkisiz erişim elde etmek için sahte belirteçler oluşturabilir.
Zayıf İmza Algoritmaları
Zayıf veya güncel olmayan imza algoritmalarının kullanılması JWT’lerin güvenliğini tehlikeye atabilir. Örneğin, bir uygulama JWT imzaları için SHA-1 gibi savunmasız bir karma algoritması kullanıyorsa, bir saldırgan geçerli belirteçleri taklit edebilir ve kullanıcıların kimliğine bürünebilir.
kid SQL Enjeksiyonu
“Kid” (anahtar tanımlayıcı) parametresini işlerken yetersiz giriş doğrulama ve temizleme, SQL enjeksiyon saldırılarına kapı açabilir. Örneğin, “kid” parametresi uygun şekilde doğrulanmazsa ve bir saldırgan “OR 1=1 –” gibi kötü amaçlı bir değer sağlarsa, bu, yetkisiz veritabanı erişimine veya veri manipülasyonuna yol açabilir.
Yol/Path Geçişi
Belirtecin içeriği gibi giriş parametrelerinin yetersiz doğrulanması, yol geçiş saldırılarına neden olabilir. Bir uygulama belirteç verilerini uygun şekilde temizlemezse, saldırgan dosya sistemini geçebilir ve amaçlanan kapsamın dışındaki hassas dosyalara erişebilir. Örneğin, belirteç verisi bir dosya adı parametresi içeriyorsa ve saldırgan `../../../etc/passwd` sağlıyorsa, bu durum sistem dosyalarının yetkisiz bir şekilde ifşa edilmesine yol açabilir.
Bu güvenlik açıklarını azaltmak için, uygun giriş doğrulama, güvenli anahtar yönetimi ve güçlü şifreleme algoritmalarının kullanılması da dahil olmak üzere güvenli kodlama uygulamalarının izlenmesi önemlidir. JWT’leri güvenli bir şekilde işleyen çerçeveler veya kitaplıklar kullanmak ve bunları güncel tutmak da risklerin en aza indirilmesine yardımcı olabilir. Düzenli güvenlik değerlendirmeleri, sızma testleri ve kod incelemeleri, uygulamanızdaki JWT uygulamalarına özgü güvenlik açıklarını belirlemek ve ele almak için çok önemlidir.
kid SQL Enjeksiyonu
Bir uygulama “kid” parametresini kullanarak anahtarı bir veritabanından alırsa, SQL enjeksiyonuna yönelik olası bir güvenlik açığı vardır. Bu senaryoda, bir saldırgan “kid” parametresi için döndürülen değeri kontrol etmek için SQL sorgusunu değiştirebilir ve böylece kötü amaçlı bir belirteç imzalamasına olanak tanıyabilir.
Uygulamanın “kid” parametresine dayalı olarak JWT anahtarını almak için güvenlik açığı bulunan bir SQL sorgusu kullandığını varsayalım.
SELECT key FROM keys WHERE key='key1'
Saldırgan daha sonra anahtar değerini kontrol etmek için kid parametresine UNION SELECT ifadesini enjekte edebilir:
{ "alg": "HS256", "typ": "JWT", "kid": "ABC' UNION SELECT 'XYZ" }, { "name": "John Doe", "user_name": "john.doe", "is_admin":true }
SQL enjeksiyonu başarılı olursa uygulama imza anahtarını almak için aşağıdaki sorguyu kullanır:
SELECT key FROM keys WHERE key='ABC' UNION SELECT 'XYZ'
Bu sorgunun çalıştırılmasıyla “kid” parametresi “XYZ” değeriyle doldurulur ve saldırgana yalnızca “XYZ” kullanarak kötü amaçlı bir jeton imzalama olanağı sağlanır.
SQL enjeksiyonu da dahil olmak üzere çeşitli enjeksiyon saldırılarını önlemek için, uygulamaların “kid” parametresini kullanmadan önce değerini uygun şekilde temizlemesi ve doğrulaması çok önemlidir. Bu, uygulama süreçlerinde yalnızca amaçlanan ve arındırılmış verilerin kullanılmasını sağlayarak yetkisiz manipülasyon ve olası güvenlik ihlalleri riskini azaltır.
kid Uzaktan Kod Çalıştırma
JWT başlığındaki Anahtar Kimliği (kid) parametresi genellikle ilgili anahtarı bir veritabanından veya dosya sisteminden almak için kullanılır. Bu anahtar daha sonra JWT’nin imzasını doğrulamak için kullanılır. Ancak kid parametresi enjeksiyon saldırılarına karşı savunmasızsa ciddi güvenlik risklerine neden olabilir. Bu güvenlik açığından yararlanan bir saldırgan, potansiyel olarak imza doğrulama sürecini atlayabilir ve Uzaktan Kod Yürütme (RCE), SQL Enjeksiyonu (SQLi) ve Yerel Dosya Ekleme (LFI) dahil olmak üzere çeşitli saldırılar başlatabilir. Kid parametresinin bütünlüğünü ve güvenliğini sağlamak için sağlam giriş doğrulama ve temizleme tekniklerinin uygulanması çok önemlidir. Uygulama bunu yaparak yetkisiz erişim riskini azaltabilir ve potansiyel istismar senaryolarını önleyebilir.
{ "alg": "HS256", "typ": "JWT", "kid": "key1" }, { "name": "John Doe", "user_name": "john.doe", "is_admin": false }
Kid parametresi komut enjeksiyonuna açıksa, saldırgan bu parametrenin değerini sunucuda rastgele komutların yürütülmesine izin verecek şekilde değiştirebilir. Bu tür bir güvenlik açığı, uzaktan kod yürütülmesine neden olabilir ve saldırganın, JWT’yi işleyen uygulama veya hizmetin ayrıcalıklarıyla komutları yürütmesine olanak tanır. Kid parametresine yönelik komut ekleme saldırıları riskini azaltmak için güçlü giriş doğrulama ve temizleme önlemlerinin uygulanması çok önemlidir. Bunu yaparak uygulama, yetkisiz komutların yürütülmesini önleyebilir ve sistemin genel güvenliğini artırabilir.
{ "alg": "HS256", "typ": "JWT", "kid": "key1|/usr/bin/uname" }, { "name": "John Doe", "user_name": "john.doe", "is_admin": false }
kid Dizini Geçişi
Bir uygulama, anahtarı dosya sisteminden almak için kid parametresini kullanıyorsa, dizin geçişi saldırılarına açık olabilir. Bu senaryoda, bir saldırgan kid parametresini, uygulamanın doğrulama anahtarı olarak belirli bir dosyayı kullanmasını sağlayacak şekilde değiştirebilir. Saldırgan, dizin geçiş tekniklerinden yararlanarak uygulama içindeki statik bir dosyanın konumunu tahmin edebilir ve onu anahtar olarak kullanmaya zorlayabilir.
Örneğin önceki JWT örneğini ele alalım. Bir saldırgan, uygulamayı boş bir anahtar kullanmaya ikna etmek amacıyla anahtar kaynağı olarak “/dev/null” eklemeyi deneyebilir. Saldırgan, dizin geçişindeki güvenlik açıklarından yararlanarak kid parametresini istediği belirli dosya yoluna (bu durumda “/dev/null”) gidecek şekilde yönlendirir. “/dev/null”, kendisine yazılan tüm verileri atan özel bir dosya olduğundan, onu anahtar olarak kullanmak, imza doğrulama işlemini etkili bir şekilde işe yaramaz hale getirir.
Saldırgan, uygulamanın boş bir anahtar kullandığını öğrendiğinde, kötü amaçlı bir belirteç oluşturabilir ve bu bilinen anahtarı kullanarak onu imzalayabilir. Sonuç olarak, saldırgan bütünlük kontrolünü atlayabilir ve potansiyel olarak yetkisiz erişim elde edebilir veya sistem içinde başka kötü niyetli eylemler gerçekleştirebilir.
{ "alg": "HS256", "typ": "JWT", "kid": "../../../../../../dev/null" }, { "name": "John Doe", "user_name": "john.doe", "is_admin": true }
Bir dizin geçiş saldırısı ‘/dev/null’ dosyasına başarılı bir şekilde ulaşırsa, saldırgan gerçekten de anahtar olarak boş bir dize kullanarak kötü amaçlı bir token imzalayabilir. Bu teknik aynı zamanda CSS dosyaları gibi bilinen diğer statik dosyalara da uygulanabilir.
Bir uygulamanın sunucudaki bir dosyadan anahtarı almak için kid parametresini kullandığını varsayalım. Dizin geçişinde olası bir güvenlik açığının farkında olan bir saldırgan, sistemdeki hassas dosyalara erişmek için kid parametresini değiştirmeye çalışır.
Örneğin, saldırgan kid parametresinin değeri olarak “../../etc/passwd” eklemeyi deneyebilir. Bu yol, Linux sistemindeki kullanıcı hesapları hakkında temel bilgileri içeren /etc/passwd dosyasını temsil eder. Saldırgan, dizinleri başarıyla geçerek ve bu dosyaya erişerek kullanıcı adları, kullanıcı kimlikleri, giriş dizinleri ve kabuk bilgileri gibi kullanıcı hesabı ayrıntılarını elde edebilir.
Saldırgan bu hassas bilgilere eriştikten sonra, kötü amaçlı belirteçler hazırlayarak veya ele geçirilen kullanıcı hesaplarından daha fazla yararlanmak için yararlanarak saldırılarını potansiyel olarak artırabilir.
Bu tür dizin geçiş saldırılarına karşı korunmak için, kid parametresi işlenirken katı giriş doğrulama ve temizleme işlemlerinin uygulanması çok önemlidir. Ayrıca uygulama, anahtar alımı için kullanılan dosya yollarının uygun şekilde doğrulanmasını sağlamalı ve erişimi yalnızca yetkili ve güvenli konumlarla sınırlandırmalıdır. Düzenli güvenlik değerlendirmeleri ve sistemi güvenlik yamalarıyla güncel tutmak, dizin geçişindeki güvenlik açıkları riskini azaltmaya ve uygulamanın genel güvenliğini artırmaya da yardımcı olabilir.
SOC Üyesinin Log Üzerine Yaklaşımı
Bir Güvenlik Operasyon Merkezi (SOC) üyesi olarak, JWT kid enjeksiyonlarını tespit etmek ve bunlara yanıt vermek için sistematik bir yaklaşım takip edebilirsiniz. Yaklaşımın genel taslağını aşağıda bulabilirsiniz:
Tehdit İstihbaratı İzleme
– JWT’ler ve kimlik doğrulama mekanizmalarıyla ilgili en son güvenlik açıkları ve saldırılar hakkında güncel kalın.
– Bilinen JWT kid enjeksiyon tekniklerini veya güvenlik ihlali göstergelerini (IOC’ler) belirlemek için tehdit istihbaratı beslemelerini, güvenlik tavsiyelerini ve sektör raporlarını izleyin.
Log İzleme ve Analizi
– Web sunucuları, uygulama sunucuları ve kimlik doğrulama sunucuları gibi ilgili sistemlerden günlükleri toplayın ve analiz edin.
– Beklenmeyen veya kötü amaçlı “kid” değerlerine sahip istekler dahil, JWT kullanımıyla ilgili anormallikleri veya şüpheli etkinlikleri arayın.
– JWT kid enjeksiyon saldırılarının kalıplarını veya göstergelerini belirlemek için JWT ile ilgili günlükleri diğer güvenlik günlükleriyle ilişkilendirin.
Güvenlik Olayı Tespiti
– Potansiyel JWT kid enjeksiyon saldırılarının tespitini otomatikleştirmek için SIEM (Güvenlik Bilgileri ve Olay Yönetimi) veya günlük analiz araçları gibi güvenlik olayı tespit mekanizmalarını uygulayın.
– JWT isteklerindeki anormal veya kötü amaçlı “kid” değerlerini tanımlamak için özel algılama kuralları veya kullanım durumları geliştirin.
– Normal JWT davranışı için eşikler veya temel çizgiler oluşturun ve sapmalar meydana geldiğinde uyarıları veya bildirimleri tetikleyin.
Gerçek zamanlı izleme
– JWT ile ilgili faaliyetleri aktif olarak izlemek için gerçek zamanlı izleme araçlarından ve tekniklerinden yararlanın.
– Potansiyel kid enjeksiyon saldırılarına karşı gelen JWT isteklerini incelemek için WAF (Web Uygulaması Güvenlik Duvarı) veya IDS/IPS (İzinsiz Giriş Tespit/Önleme Sistemi) gibi araçları kullanın.
– Şüpheli kalıpları veya anormal JWT kullanımını tespit etmek için davranış analizi tekniklerini kullanın.
Olay Müdahalesi ve Azaltma
– Özellikle JWT kid enjeksiyon saldırılarına yönelik bir olay müdahale planı geliştirin.
– Bu tür olayların ele alınmasına yönelik yükseltme prosedürlerini, müdahale eylemlerini ve iletişim kanallarını tanımlayın.
– Belirlenen JWT kid enjeksiyonu olaylarını araştırmak ve azaltmak için ilgili ekiplerle (ör. geliştirme, ağ) işbirliği yapın.
– Savunmasız sistemlere yama uygulamak, güvenlik yapılandırmalarını güncellemek veya güvenliği ihlal edilmiş JWT anahtarlarını iptal etmek gibi gerekli iyileştirme önlemlerini uygulayın.
Olay Sonrası Analiz ve İyileştirmeler
– Alınan müdahale tedbirlerinin temel nedenini, etkisini ve etkinliğini anlamak için olay sonrası analiz yapın.
– JWT kid enjeksiyon olaylarından öğrenilen derslere dayanarak güvenlik kontrollerini, tespit kurallarını veya önleme mekanizmalarını güncelleyin.
– Genel güvenlik duruşunu iyileştirmek için SOC ekibi içinde ve diğer paydaşlarla bilgi ve içgörüleri paylaşın.
Bu yaklaşımın kuruluşunuzun özel güvenlik gereksinimlerine, altyapısına ve mevcut araçlarına göre değişebileceğini unutmayın. JWT Kid saldırısının tespiti için;
“kid” İddiasını Doğrulayın: JWT’yi doğrularken, “kid” iddiasını güvenilir anahtar tanımlayıcılardan oluşan bir beyaz listeyle karşılaştırın. “Kid” değeri güvenilir değerlerden hiçbiriyle eşleşmiyorsa veya tamamen eksikse, bunu şüpheli veya yetkisiz bir istek olarak değerlendirebilirsiniz.
Günlükleri İzleyin ve Analiz Edin: “Kid” parametresine sahip istekler de dahil olmak üzere JWT ile ilgili etkinliklerin günlüklerini tutun. Farklı veya geçersiz “kid” değerlerine sahip tekrarlanan istekler veya belirli “kid” değerlerini hedefleyen yüksek hacimli istekler gibi olağandışı veya şüpheli kalıplar açısından günlükleri analiz edin.
Hız Sınırlandırmayı Uygulama: Belirli bir “kid” değeri için zaman aralığı başına izin verilen istek sayısını sınırlamak amacıyla hız sınırlama veya istek azaltma mekanizmaları uygulayın. Bu, kaba kuvvet saldırılarının veya farklı “kid” değerlerini hedef alan aşırı isteklerin önlenmesine yardımcı olabilir.
IP Tabanlı Kısıtlamaları Uygulayın: JWT’lerle isteklerin kaynak IP adreslerini izleyin ve izleyin. Aynı IP adresinden veya şüpheli bir IP adresinden farklı “kid” değerlerine sahip birden fazla istek fark ederseniz, bu isteklerin meşruluğunu doğrulamak için ek önlemler alabilirsiniz.