Zihinsel model
M14’ün önceki üç dersinde (SIKE/Rainbow, HAWK, Simon 2026) gördüğün saldırılar, hepsi matematiksel/teorik seviyedeydi: bir algoritmanın veya bir problemin kendisi kırıldı. Bu son ders farklı bir katmana iniyor: matematiği tamamen sağlam olan bir standart (ML-KEM), gerçek, isimlendirilmiş bir implementasyon hatası yüzünden nasıl güvenlik açığına sahip olabiliyor.
KyberSlash: gizli bir sayı, herkese açık bir sayıya bölünüyor
Kyber’in (ML-KEM’in standartlaşmadan önceki adı) referans implementasyonunda, hem şifre çözme hem şifreleme kodunda, şöyle bir satır vardı: gizli (secret) bir t değeri, herkese açık (public) sabit KYBER_Q = 3329’a bölünüyordu. Sorun şu: birçok CPU/derleyici kombinasyonunda, bir bölme işleminin ne kadar sürdüğü, bölünen sayının (payın) değerine bağlı olabiliyor. Pay gizli olduğu için, bu süre farkı bir zamanlama yan kanalı (timing side channel) açıyor: saldırgan, işlemin ne kadar sürdüğünü ölçerek, gizli veri hakkında bilgi sızdırabiliyor.
Bu hata iki ayrı ama ilişkili biçimde bulundu: KyberSlash1, şifre çözme (decapsulation) tarafındaki bölme, Tamvada/Bhargavan/Kiefer tarafından bağımsız olarak bulundu ve pq-crystals/kyber referans kodunda 1 Aralık 2023'teSOURCED yamalandı. KyberSlash2, şifreleme (encapsulation) tarafındaki bölme, Prasanna Ravi ve Matthias Kannwischer tarafından 30 Aralık 2023'teSOURCED açıklandı; decapsulation işlemi hem kendi kodunu hem de encapsulation kodunu çağırdığı için, KyberSlash2 de decapsulation zamanlamasından istismar edilebiliyordu. Hakemli, CHES 2025 En İyi Makale ödülü alan bir akademik yayın (IACR TCHES 2025, issue 2, pp. 209-234, CHES 2025 Best Paper AwardSOURCED), gizli anahtarların gerçek donanımda (Raspberry Pi 2, Cortex-M4) dakikalar/saatler içinde kurtarılabildiğini gösterdi.
Bu hatanın etkisi tek bir kütüphaneyle sınırlı kalmadı: referans koddan türetilen düzinelerce kütüphane (liboqs, Bouncy Castle, AWS-LC, Cloudflare CIRCL, PQClean ve daha fazlası) 2023 sonundan 2024 sonuna kadar tek tek yamalandı. Java dünyasında bu hatanın resmi CVE (Common Vulnerabilities and Exposures, kamuya açık, numaralandırılmış güvenlik açığı kaydı) kaydı, Bouncy Castle için CVSS (Common Vulnerability Scoring System, önem derecesini 10 üzerinden özetleyen standart puanlama) puanı 8.2SOURCED, gerçek açıklamadan iki buçuk yıldan fazla süre sonra, 2026’da yayımlandı, formal CVE kaydının gerçek zamanlı ifşadan ne kadar geride kalabileceğinin somut bir örneği.
Aynı pencere, farklı bir hata ailesi: derleyici kaynaklı zamanlama sızıntısı
Aynı dönemde, ilişkili ama teknik olarak farklı bir hata daha bulundu: Clang derleyicisinin (sürüm 15-18) belirli optimizasyon seviyelerinde (-Os/-O1), Kyber referans kodunun bir bölümünü, gizli veriye bağlı bir dallanma (branch) üretecek şekilde derlediği keşfedildi (CVE-2024-36405, liboqs’ta; CVE-2024-37880, doğrudan referans kodda). Bu, KyberSlash’in bölme hatasıyla aynı aileden (zamanlama yan kanalı) ama farklı bir kök nedene sahip: kaynak kodun kendisi değil, derleyicinin o kodu nasıl makine koduna çevirdiği sorunluydu. liboqs’ta bu açık, yaklaşık 10 dakikadaSOURCED bir ML-KEM-512 anahtarını kurtarabiliyordu.
Bu iki hata ailesinin bir arada var olması önemli bir dersi gösteriyor: “sabit zamanlı kod yazdım” demek, kaynak kod seviyesinde doğru olsa bile, derleyicinin/donanımın o niyeti bozmayacağının garantisi değil.
ML-DSA tarafında: güç analizi ve FIPS’in kendi tutumu
Zamanlama saldırılarının ötesinde, güç analizi (power analysis) de gerçek bir implementasyon tehdidi. KTH Kraliyet Teknoloji Enstitüsü’nden bir ekip (Wang, Ngo, Gärtner, Dubrova), Dilithium’un (ML-DSA’nın standart öncesi adı) anahtar-açma (unpacking) işlemine karşı, derin öğrenme destekli bir güç analizi saldırısı yayımladı: ARM Cortex-M4 üzerinde ~9%SOURCED tek-iz (single-trace) başarı oranı, birden fazla iz kullanıldığında neredeyse %100’e çıkıyor.
Bu implementasyon-seviyesi riskler karşısında, NIST’in kendi standart metinleri farklı bir tutum sergiliyor. FIPS 203’ün (ML-KEM) metninde “side-channel” kelimesi hiç geçmiyor, sadece genel bir “implementasyonun güvenli tasarlanması implementerin sorumluluğundadır” cümlesi var. FIPS 204 (ML-DSA) ise farklı: standardın kendisi, imzalamanın “hedged” (rastgelelik eklenmiş) veya tam “deterministic” (rastgelesiz) yapılması seçimini, doğrudan side-channel ve fault saldırı direnciyle ilişkilendiriyor, deterministic varyantın side-channel saldırılara karşı (özellikle fault saldırılarına karşı) daha savunmasız olabileceğini ve side-channel’ın önemli olduğu platformlarda kullanılmaması gerektiğini açıkça yazıyor. Bu fark, iki standardın kendi iç tasarım kararlarından kaynaklanıyor: ML-DSA’nın rastgelelik seçimi doğrudan bu riske bağlı olduğu için standart bunu açıkça ele almak zorunda kalıyor, ML-KEM’de böyle bir tasarım kararı yok.
Sonuç: matematik ile kod iki farklı güvence katmanı
M14’ün dört dersi birlikte şunu gösteriyor: bir algoritmanın matematiksel güvenliği (SIKE/Rainbow/Simon 2026’nın konusu), o algoritmayı seçen bir kararın standartlaşma sürecinden geçip geçmediği (HAWK’ın konusu), ve o standardı uygulayan kodun implementasyon güvenliği (bu dersin konusu), üç ayrı, birbirinden bağımsız güvence katmanı. “ML-KEM/ML-DSA’ya geçtik” demek, bu üç katmandan sadece ilkini kapatıyor; bir bankanın gerçek güvenliği, hangi kütüphaneyi, hangi sürümde, hangi derleyiciyle, hangi donanımda çalıştırdığına da bağlı, tam olarak M13’te gördüğün vendor questionnaire’ın “implementasyonunuz zamanlama saldırılarına karşı test edildi mi” sorusunu sorması gereken nedeni budur.