Yazılım geliştirme
PHP'de zamanlama saldırıları: Pratik bir örnek - `hash_equals()` neden önemlidir
Wordpress/Laravel/PHP'de API belirteçlerine yönelik gerçekçi bir zamanlama saldırısı örneği ister misiniz? Zamanlama saldırılarına karşı ipuçları ve en iyi uygulama önlemleri de dahil olmak üzere bu konuyu burada ele alıyoruz.
Birçok geliştirici API anahtarlarını, belirteçlerini veya diğer gizli dizeleri kontrol ederken === veya == kullanarak basit karşılaştırmaya güvenir. İlk bakışta bu makul görünse de bir sorun vardır: karşılaştırmadaki zamanlama farklılıkları saldırganlar tarafından istismar edilebilir.
Bu makalede, zamanlama saldırısının kavramsal olarak nasıl çalıştığına dair gerçekçi bir örnek anlatılmaktadır.
Gerçek senaryo (basitleştirilmiş örnek)
Dahili bir mikro hizmetin bir sorgu parametresi belirteci ile istekleri kabul ettiğini ve bunu ortamda depolanan bir GitHub API belirteci ile karşılaştırdığını düşünün.
Güvensiz kod (basitleştirilmiş):
$expected = getenv('GITHUB_API_TOKEN');$provided = $_GET['token] ?? '';if ($provided === $expected) { } PHP
Bunun neden sorunlu olduğunu bir sonraki bölümde açıklayacağım.
Zamanlama saldırısı nasıl çalışır?
Eğer token karşılaştırma uygulaması karakter karakter karşılaştırıyorsa ve ilk hatada hemen iptal ediyorsa, o zaman doğru ilk karaktere sahip bir istek ortalama olarak biraz daha uzun sürecektir.
Bu nedenle doğru bir ilk karakter, yanlış bir ilk karaktere göre ortalama olarak biraz daha uzun bir işlem süresine yol açar. Aynı durum ikinci karakter için de geçerlidir ve bu şekilde devam eder.
Bir saldırgan, her pozisyon için olası tüm karakterleri test ederek, yanıt sürelerini çok sık ölçerek ve bunları istatistiksel olarak analiz ederek bundan yararlanır. En büyük ortalama/orantılı olarak daha uzun süreye sahip karakter muhtemelen doğrudur. Bu şekilde token adım adım yeniden oluşturulur.
Neden hash_equals() doğru seçimdir
PHP, hash_equals() ile sabit zamanlı bir dizge karşılaştırma işlevi sağlar. Her iki dizge de aynı uzunlukta olduğu sürece, karşılaştırmanın yürütme süresinin ortak öneklere bağlı olmamasını sağlar.
Güvenli alternatif (Laravel, PHP, Wordpress için):
$expected = getenv('GITHUB_API_TOKEN'); $provided = $_GET['token'] ?? '';if (hash_equals($expected, $provided)) { } PHP
Not: hash_equals() sadece uzunlukların eşit olması durumunda "zamandan bağımsızdır". Belirteçleri uzunluğu sabit olacak şekilde tasarlamak iyi bir uygulamadır (örneğin HMAC'ler, sabit uzunluklu UUID'ler veya rastgele sabit uzunluklu Base64 dizeleri).
Bunu biliyor muydunuz? Yalnızca UUID-V4 tamamen rastgele üretilir ve bu nedenle güvenlik belirteçleri için sıklıkla kullanılır. Zaman veya cihazla ilgili hiçbir bilgi içermediğinden, yüksek düzeyde öngörülemezlik sunar ve böylece kalıplara veya tahminlere dayalı saldırılara karşı koruma sağlar. Güvenli, tahmin edilmesi zor tanımlayıcılar söz konusu olduğunda UUID-V4'ün tercih edilmesinin nedeni de tam olarak budur.
Ek savunma önlemleri - hash_equals() işlevinden daha fazlası
- Sabit belirteç uzunluğu
UUID-V4 gibi sabit uzunlukta belirteçler kullanın. Bir saldırgan uzunluğu tahmin ederse, karakterlerin kendileri güvenli olduğu sürece bu daha az yardımcı olur.
- Hız sınırlama
IP başına veya hesap başına istekleri sınırlayın. Zamanlama saldırıları çok sayıda ölçüm gerektirir; hız sınırlaması saldırgan için çaba ve maliyeti önemli ölçüde artırır.
- Günlük tutma ve izleme
Olağandışı kalıpları tanıyın (çok sayıda token denemesi, belirli parametrelerin sistematik değişimi) ve otomatik olarak tepki verin.
- Salt / HMAC / İmzalar
Ham statik anahtarları açıkça karşılaştırmak yerine imzalı belirteçler (gizli anahtarlı HMAC) veya OAuth belirteçleri kullanın.
- TLS/HTTPS
Şifreleme iletişim kanallarını korur - sunucu içlerine yönelik zamanlama saldırılarını engellemese de temel bir gerekliliktir.
- Token rotasyonu
Token'ların kullanım ömrünün kısa olması, ele geçirilen bir token'ın faydasını azaltır.
Sonuç
Zamanlama saldırıları tamamen teorik bir sorun değildir - pratikte araştırılmışlardır ve özellikle halka açık uç noktalar için ciddi sonuçları olabilir. İyi haber: PHP/Laravel/Wordpress geliştiricileri için ilk karşı önlem çok basittir:
- Hassas dizelerin doğrudan karşılaştırmalarını
hash_equals() ile değiştirin.
- Sabit token uzunlukları, hız sınırlaması, günlük kaydı ve güvenli token yönetimi sağlayın.