- Python’ın varsayılan hash ve HMAC algoritmaları artık doğrulanmış kriptografi kodu olan HACL* ile değiştirildi
- Yaklaşık 15.000 satır C kodu, HACL*’den Python kod tabanına otomatik olarak entegre edildi
- Çeşitli blok algoritmalarını işleyebilmek için streaming API genel amaçlı olarak tasarlanıp doğrulandı
- Bellek ayırma hatalarının ele alınması, AVX2 derleme sorunlarının çözülmesi, CI ortamının optimize edilmesi gibi ileri düzey mühendislik sorunları ele alındı
- Python ve kriptografi topluluğunun iş birliğiyle hem güvenlik hem de bakım kolaylığı somut biçimde sağlandı
Python’un kriptografi algoritmalarında tamamen doğrulanmış koda geçişi
- 2022’de ortaya çıkan SHA3 uygulamasıyla ilgili CVE-2022-37454 sonrasında, Python’da hash altyapısının doğrulanmış koda geçirilmesi gerektiği gündeme geldi
- Sonraki 2,5 yıl içinde Python, yerleşik hash ve HMAC algoritmalarını HACL* tabanlı doğrulanmış uygulamalarla tamamen değiştirdi
- Bu değişim kullanıcılar için tamamen şeffaf biçimde yapıldı ve işlevsellik açısından herhangi bir kayıp olmadı
- HACL* ayrıca Python için bazı ek yetenekler sundu: Blake2’nin çeşitli modları, SHA3 için Keccak türevlerini destekleyen API, HMAC için streaming optimizasyonları vb.
- Yeni sürümlerin yansıtılması betikler aracılığıyla otomatikleştirildi ve bakım kolaylaştırıldı
Streaming API’yi anlamak
- Kriptografik algoritmaların çoğu blok algoritmalarıdır ve girdiyi bloklar halinde işlemeleri gerekir
- Gerçek kullanım ortamlarında girdiyi blok blok vermek zor olduğundan, streaming API gerekir
- Streaming API, girdi uzunluğundan bağımsız çalışır ve ara sonuçların alınmasına da olanak tanır
- Streaming uygulaması karmaşık durum yönetimi gerektirir; önceki SHA3 uygulamasında bununla ilgili ciddi bir güvenlik açığı vardı
- Her hash algoritmasının işleyiş biçimi farklı olduğundan karmaşıklık artar: örn. Blake2 boş bloğa izin vermez, HMAC ise anahtarı başlattıktan sonra silebilir
Genel amaçlı streaming algoritmasının doğrulanması
- 2021’de yazılan bir makalede tanıtılan yaklaşım, blok algoritmasını soyutlayıp bunun üzerinde genel amaçlı bir streaming algoritması tanımlamaya dayanıyor
- Ardından bu yapı her algoritmaya şablon gibi uygulanarak yeniden kullanılabilir hale geliyor
- Farklı özel koşulları kapsayacak şekilde genelleştirildi:
- Çıktı uzunluğunun belirtilebilir olup olmaması (SHA3 vs Shake)
- İşlemden önce gerekli girdi bulunup bulunmaması (örn. Blake2’nin anahtar bloğu)
- Son bloğun işlenme biçimindeki farklar
- İç durumda korunması gereken ek bilgiler
- Ara sonuç çıkarmak için durumun nasıl kopyalanacağı (stack vs heap)
- Algoritma başına ayrı API mi yoksa aile API’si mi kullanılacağına dair strateji
Python entegrasyonu için derleme kararlılığının sağlanması
- Python’un CI sistemi 50’den fazla toolchain ve mimaride doğrulama yapıyor; bu da küçük sorunların bile ortaya çıkmasını sağlıyor
- HMAC uygulamasında AVX2 komut desteğiyle ilgili bir sorun yaşandı:
- Bazı derleyiciler AVX2 olmadan
immintrin.h başlığını işleyemiyor
- Bunu çözmek için C’nin soyut struct kalıbı kullanıldı
- F*’tan üretilen C kodundaki soyutlama kavramı ile C struct’larının farkı nedeniyle,
krml derleyicisine hassas görünürlük analizi özelliği eklemek gerekti
Bellek ayırma hatalarına karşı yaklaşım
- Mevcut F* modeli teorik olarak bellek hatalarını modelleyebiliyordu, ancak bunun pratikte uygulanması ilk kez gerçekleşti
- Python’un ihtiyaçları doğrultusunda durum struct’ları, algoritma tanımları ve streaming yapıları, ayırma hatalarını iletebilecek şekilde geliştirildi
- F* içinde
option tipi kullanıldı; C’de bu yapı tagged union olarak derleniyor
- Gelecekte karmaşıklığı azaltmak için bunun çalışma zamanı hata bayrağı yaklaşımına dönüştürülmesi mümkün olabilir
HACL* kod güncellemelerinin otomasyonu
- İlk Python PR’ı, gereksiz başlık tanımlarını kaldırmak ve yolları düzeltmek için
sed kullanıyordu
- Daha sonra HACL* kodunun kararlılığı doğrulanınca karmaşık
sed kullanımı kaldırıldı ve yerine basit bir betik getirildi
- Bu betik sayesinde herkes Python kaynak ağacında HACL* kodunu en güncel sürüme kolayca güncelleyebiliyor
Sonuç
- Doğrulanmış kriptografi kodu, üretim ortamlarının önde gelen örneklerinden biri olan Python’a başarıyla entegre edildi
- Bu, söz konusu teknolojinin yalnızca akademik araştırma aşamasında kalmadığını, gerçek yazılımlarda da pratik ve bakımı yapılabilir olduğunu gösteren bir örnek oldu
- Python topluluğu ile HACL* geliştiricileri arasındaki iş birliğinin iyi bir örneği olarak, gelecekte başka projeleri de etkileyebilir
2 yorum
Hacker News yorumlarında da belirtildiği gibi, Python ekosisteminin “akademik araştırma aşamasını aşıp gerçek yazılımlarda da pratik ve bakımı yapılabilir” bir şeye ulaştığı derken ne kastedildiğini anlamak zor.
Eğer anlatılmak istenen, mevcut doğrulanmamış hash altyapısı üzerinde streaming algoritmalarını soyutlama çalışması yapıldığıysa, bu da sadece bir başka “Pythonic” kelime oyunu gibi duruyor.
Hacker News görüşleri
Python sürümü belirtilmemiş. Araştırınca, bu özelliğin 3.14 sürümüne dahil edilmesinin planlandığı görülüyor. Ekim ayına kadar göremeyebiliriz
Microsoft'un F* ile üretilmiş doğrulanmış C kütüphanesi CPython'a dahil edilmiş ve bir C uzantısı yazılmış
SHAKE için "streaming" çıktı desteğinin gelip gelmeyeceği merak ediliyor
Modern ve yaygın kullanılan kriptografi pratikte kırılamaz durumda; 90'lardaki kripto savaşları artık biraz eski bir tartışma gibi görünüyor. Bunun toplum üzerindeki etkisine dair düşüncesi olan var mı diye merak ediliyor
Genel amaçlı bir streaming doğrulama çerçevesinin, kriptografik hash'ler dışında ne kadar yeniden kullanılabilir olduğu merak ediliyor
Kriptografi modülünü içe aktaran her şeyin G++ ya da başka bir şeyi de içermesi gerekip gerekmediği, yoksa bunun doğrudan CPython'ın kendisi içinde mi derlendiği merak ediliyor
Kriptografi konusunda çok bilgili değilim. Bunun Python için ne anlama geldiği merak ediliyor
Geliştirmenin ne kadarının doğrulandığı ve bunun tam olarak neleri kapsadığı merak ediliyor
Kod satırı sayısı çok kötü bir ölçüt. Özellikle de kriptografi kodu bağlamında büyük sayılarla övünülüyorsa bu daha da geçerli