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ş):

// insecure.php (basitleştirilmiş örnek)$expected = getenv('GITHUB_API_TOKEN');// örneğin 'V1cHt2S67DADJIm9sX9yzCc272EkSC'$provided = $_GET['token'] ?? '';if ($provided === $expected) { // erişim izni ver} 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):

// secure.php$expected = getenv('GITHUB_API_TOKEN'); $provided = $_GET['token'] ?? '';if (hash_equals($expected, $provided)) { // erişim izni ver} 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ı

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. TLS/HTTPS
    Şifreleme iletişim kanallarını korur - sunucu içlerine yönelik zamanlama saldırılarını engellemese de temel bir gerekliliktir.
  6. 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.
Yazar hakkında
Langmeier Software Kurucusu ve CEO'su
Hiçbir şeyi karmaşıklaştırmak istemiyorum. En iyi iş yazılımını geliştirmek istemiyorum. En iyi teknolojiler listesinde yer almak istemiyorum. Çünkü iş uygulamalarının amacı bu değil. Bu, verilerinizin sorunsuz bir şekilde korunduğundan emin olmakla ilgili. Ve siz tam kontrolü elinizde tutarken ve işinizi büyütmeye odaklanabilirken her şeyin sorunsuz çalışmasını sağlamakla ilgilidir. Sadelik ve güvenilirlik benim yol gösterici ilkelerimdir ve bana her gün ilham verirler.
 
Daha fazla bak:
PHP, Güvenlik farkındalığı, Siber Güvenlik
İlgili makaleler