M14 / What breaks

Side-channel ve implementasyon: matematik doğru, kod yanlış olabilir

FoundationsPractitionerAdvisor

After this lesson you can

  • KyberSlash1/2 gibi gerçek, isimlendirilmiş bir zamanlama saldırısını, kök nedenini (sabit-zamanlı olmayan bölme) ve etkilenen implementasyonları anlatır
  • FIPS 203'ün side-channel konusunda sessiz kalmasıyla FIPS 204'ün açıkça ele almasının farkını, ve bunun neden 'standart doğru olsa da implementasyon kırılabilir' dersine bağlandığını anlatır

Before thisSimon 2026/DCP: yaşayan bir iddianın güncel durumu

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.

Numbers to know

  • KyberSlash kök nedeni: gizli (secret) bir sayının, sabit (public) KYBER_Q=3329'a bölünmesi, birçok CPU/derleyici kombinasyonunda gizli sayıya bağlı bir sürede tamamlanıyor, bu da bir zamanlama kanalı açıyor. KyberSlash1 (decapsulation, 1 Aralık 2023'te yamalanan) ve KyberSlash2 (encapsulation, 30 Aralık 2023'te açıklanan), decapsulation her ikisini de çağırdığı için ikisi de decapsulation zamanlamasından istismar edilebiliyordu
  • Aynı kod tabanında, aynı açıklama penceresinde, ama farklı bir hata sınıfı: CVE-2024-36405/37880, Clang 15-18 derleyicisinin belirli optimizasyon bayraklarıyla (-Os/-O1) gizli-veriye-bağlı bir dallanma (branch) üretmesi, bölme hatasıyla aynı aile ama teknik olarak farklı bir kök neden; liboqs'ta bir ML-KEM-512 anahtarını ~10 dakikada kurtarabiliyordu
  • FIPS 203 (ML-KEM) metninde 'side-channel' kelimesi hiç geçmiyor, sadece genel 'implementasyon güvenliği implementerin sorumluluğu' dilini kullanıyor; FIPS 204 (ML-DSA) ise hedged/deterministic imzalama seçiminin side-channel/fault saldırı direnciyle doğrudan ilişkisini üç ayrı yerde açıkça tartışıyor

Lab: KyberSlash'in kök neden koduna bak

[not run] Bu bir kod-okuma alıştırması, kendi ortamında çalıştırılabilir bir komut değil

Requires: internet erişimi. Check your setup

shell
# kyberslash.cr.yp.to sitesindeki kök-neden kod parçasını bul: 't = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1;' satırını incele
Recorded output
t (gizli veri) bir bölmenin payı (numerator), KYBER_Q (herkese açık) paydası (denominator); sorunun kaynağı payın gizli olması, paydanın değil

At the table

How to say this in a bank meeting.

To an executive
Standart matematiksel olarak sağlam olsa bile, o standardı uygulayan kod hâlâ gerçek, isimlendirilmiş güvenlik açıklarına sahip olabilir. Bu yüzden 'ML-KEM'e geçtik' demek, 'güvenliyiz' demek değil; hangi kütüphanenin, hangi sürümünün, hangi yamanın kullanıldığı hâlâ kritik.
To an architect
KyberSlash, referans implementasyondaki (pq-crystals/kyber) bir hataydı, ML-KEM'in FIPS 203 spesifikasyonunun kendisinde değil; ama bu hata, o referans koddan türetilen düzinelerce kütüphaneye (liboqs, Bouncy Castle, AWS-LC, Cloudflare CIRCL dahil) miras kaldı. Bir tedarikçi değerlendirmesinde (M13'te gördüğün), 'hangi kütüphaneyi, hangi sürümde kullanıyorsunuz' sorusu, 'hangi algoritmayı kullanıyorsunuz' sorusundan daha az önemli değil.
Objection
“"ML-KEM/ML-DSA matematiksel olarak güvenli değil miydi, nasıl hâlâ bir güvenlik açığı olabilir?"”
Answer
Matematiksel güvenlik (kaba kuvvetle veya bilinen algoritmik saldırılarla kırılamamak) ile implementasyon güvenliği (bir yan kanaldan, örneğin zamanlama farkından, gizli veriyi sızdırmamak) iki farklı iddia. FIPS 203/204, birinci iddiayı garanti ediyor; ikincisi implementasyonun sorumluluğunda, ve FIPS 203'ün kendi metni bunu açıkça söylüyor. KyberSlash, matematiği değil, kodu kırdı.

Sources

Checkpoint

Answer first, then compare with the model answer and score yourself against the rubric. Saved in this browser only.

  1. 01Recall

    KyberSlash'in kök nedeni nedir, hangi iki alt-versiyonu (1 ve 2) var, aralarındaki fark ne?

  2. 02Recall

    FIPS 203 ile FIPS 204'ün side-channel konusundaki metinleri arasındaki fark nedir?

  3. 03Scenario

    Bankanızın bir ML-KEM implementasyonu, 2023'ten kalma, hiç güncellenmemiş bir kütüphane sürümü kullanıyor. Bu dersten hangi iki somut soruyu sorarak riski değerlendirirsin?

  4. 04Hostile

    Bir denetçi 'FIPS 203/204 sertifikalı bir modül kullanıyoruz, side-channel riskimiz yok değil mi' diye soruyor. CAVP/CMVP kapsamının (M5'te gördüğün) side-channel testlerini kapsayıp kapsamadığını sorgulayarak yanıtla.

Project linkP4 (capstone) risk bölümüne, 'algoritma doğru seçildi ama implementasyon riski hâlâ var' başlığının somut örneği; vendor questionnaire'a (M13) eklenecek bir soru: 'implementasyonunuz KyberSlash sınıfı zamanlama açıklarına karşı ne zaman ve nasıl test edildi?'