2 puan yazan GN⁺ 2026-01-01 | 1 yorum | WhatsApp'ta paylaş
  • libsodium'un düşük seviyeli crypto_core_ed25519_is_valid_point() fonksiyonunda, Edwards25519 eğrisinde uygunsuz nokta doğrulama hatası tespit edildi
  • Bu fonksiyonun bir noktanın ana kriptografik gruba ait olup olmadığını doğrulaması gerekirken, karma mertebeli (subgroup) bazı noktaları yanlışlıkla geçirdiği belirlendi
  • Sorunun nedeni, dahili koordinat doğrulamasında yalnızca X=0'ın kontrol edilmesi ve Y=Z doğrulamasının atlanması olan bir kod hatasıydı; bu da hatalı noktaların geçerli sayılmasına yol açabiliyordu
  • Düzeltilen sürümde her iki koşul da (X=0, Y=Z) kontrol edilecek şekilde değiştirildi; 1.0.20 ve altı sürümler veya 30 Aralık 2025'ten önceki sürümler etkileniyor
  • Yüksek seviyeli API (crypto_sign_*) etkilenmiyor ve güvenlik ile performans açısından Ristretto255 grubu kullanımı öneriliyor

libsodium projesine genel bakış

  • libsodium, 13 yıl önce başlamış bir proje ve amacı kriptografiyi kullanımı kolay, basit bir API ile sunmak
    • Kullanıcının dahili algoritmaları bilmesine gerek kalmadan yalnızca yüksek seviyeli işlemleri gerçekleştirebilmesi için tasarlandı
  • API'nin geriye dönük uyumluluğunu korumaya önem veriyor ve NaCl API temelinde bugüne kadar tutarlılığını sürdürdü
  • Bazı kullanıcıların belgelerde belirtilen sınırların ötesine geçip düşük seviyeli fonksiyonları doğrudan kullanmasıyla, kütüphanenin bir kriptografi araç takımı gibi kullanıldığı örnekler arttı

Bulunan hatanın nedeni

  • Sorunlu fonksiyon: crypto_core_ed25519_is_valid_point()
    • Edwards25519 eğrisinde ana gruba (L mertebesi) ait olmayan noktaları reddetmesi gerekiyor
    • Ancak karma mertebeli (2L, 4L, 8L vb.) bazı noktalar doğrulamayı geçebiliyor
  • İçeride, noktanın mertebesini kontrol etmek için L ile çarpım yapıldıktan sonra sonucun birim eleman (identity) olup olmadığına bakılıyor
    • Birim eleman X=0, Y=Z biçiminde temsil edilir, fakat mevcut kod yalnızca X=0'ı kontrol ediyordu
    • Bu nedenle Y≠Z olan hatalı noktalar geçerli kabul edilebiliyordu
  • Örnek: ana gruptaki bir Q noktasına mertebesi 2 olan (0, -1) noktası eklenerek elde edilen Q+(0, -1) hatalı bir nokta olmasına rağmen, düzeltme öncesinde doğrulamayı geçiyordu

Düzeltme içeriği

  • Yama commit'i şu şekilde değiştirildi
    • Eski kod: return fe25519_iszero(pl.X);
    • Düzeltilmiş kod: fe25519_sub(t, pl.Y, pl.Z); return fe25519_iszero(pl.X) & fe25519_iszero(t);
  • Artık doğru doğrulama için hem X=0 hem de Y=Z koşulları kontrol ediliyor

Etki alanı

  • Aşağıdaki koşullarda etkilenme ihtimali var
    • 1.0.20 ve altı sürümler veya 30 Aralık 2025'ten önceki sürümler kullanılıyorsa
    • Güvenilmeyen giriş noktaları crypto_core_ed25519_is_valid_point() ile doğrulanıyorsa
    • Edwards25519 eğrisi işlemlerini doğrudan uygulayan kullanıcılar söz konusuysa
  • Ancak çoğu kullanıcı etkilenmiyor
    • Yüksek seviyeli API (crypto_sign_*) bu fonksiyonu kullanmıyor
    • crypto_scalarmult_ed25519, hatalı açık anahtarlarda bile bilgi sızıntısına yol açmıyor
    • crypto_sign_keypair ve crypto_sign_seed_keypair ile üretilen anahtarlar doğru gruba ait oluyor

Önerilen önlemler

  • Ristretto255 grubu kullanılması öneriliyor
    • 2019'dan beri libsodium'a dahil ve cofactor ile ilgili sorunları çözüyor
    • Decode edilen noktalar otomatik olarak güvenli olduğundan ek doğrulama gerekmiyor
    • Edwards25519'dan daha hızlı işlem performansı sunuyor
  • Güncelleme mümkün değilse, önerilen uygulama seviyesi alternatif fonksiyon (is_on_main_subgroup) ile doğrulama yapılabilir

Düzeltilmiş dağıtımlar ve destek

  • Sorun fark edilir edilmez hemen düzeltildi ve 30 Aralık 2025'ten sonra dağıtılan tüm kararlı sürümlere dahil edildi
    • Resmî tarball, Visual Studio/MingW ikili dosyaları, NuGet paketi, Android yapıları, swift-sodium xcframework, Rust libsodium-sys-stable, libsodium.js dahil
  • Yeni bir point release de planlanıyor
  • Proje tek kişilik bakım ile yürütülüyor; sürekli iyileştirmelere OpenCollective desteği üzerinden katkı sağlanabiliyor

1 yorum

 
GN⁺ 2026-01-01
Hacker News yorumları
  • PHP kütüphanesi sodium_compat da bu sorundan etkilenmiş
    İlgili ayrıntılar security-advisories PR #756 içinde görülebilir
    Bu akşam ayrıca açık kaynak ekosistemindeki diğer Ed25519 implementasyonlarının tamamını kontrol edip aynı doğrulama eksikliğinin bulunup bulunmadığına bakmayı planlıyorum

    • Bazı kütüphanelerde doğrulama mantığının tamamen eksik olduğunu fark ettim
      Ancak yukarıda bahsedilen zafiyette olduğu gibi yanlış şekilde uygulanmış örnekler yoktu
      Eğer e-posta göndermediysem, muhtemelen ya ianix'in Ed25519 dağıtım listesinde yoktur, ya gözümden kaçmıştır ya da güvenli bir implementasyondur
    • Açık kaynağa katkıda bulunduğunuz için teşekkür etmek istiyorum
  • Son 4 aydır Lean4 için sodium binding'leri geliştiriyorum
    Artık Ristretto255 aşamasına geldim ve yazarın bu teknolojiye neden heyecan duyduğunu anlamaya başladım
    Ristretto, Curve25519 üzerinde rastgele polinomlar kurabilen sofistike bir API ve onunla denemeler yapmak gerçekten çok eğlenceli
    Yazar bunu görürse içten teşekkürlerimi iletmek isterim

    • Bu projenin herkese açık bir deposu olup olmadığını merak ediyorum
  • Libsodium'ın amacı düşük seviyeli fonksiyonlar değil, yüksek seviyeli bir API sunmaktı
    Kullanıcıların iç algoritmaları bilmesine gerek kalmayacak şekilde tasarlanmıştı, ancak zamanla düşük seviyeli fonksiyonların doğrudan kullanıldığı örnekler giderek arttı
    Sonuçta Libsodium bir algoritma araç takımı gibi kullanılmaya başlandı
    Önemli olan, kullanıcıların ne istediğini fark etmek ve projeyi onlara belli bir şekilde dayatmamak
    Bazı projeler bu noktada dogmatikleşip başarısız oluyor

    • İlginç bir nokta. Ama tersinden bakınca, kullanıcıların istediği sanılan şey ile gerçekte ihtiyaç duydukları şey farklı olabilir
      Uzman olmayanların kriptografik ilkel fonksiyonları doğrudan kullanması tehlikelidir
      Libsodium, kullanıcıların kendilerini tehlikeye atmaması için tasarlanmıştı
      İdeal olan, kütüphanenin yanlış kullanımın imkansız olmasını sağlamasıdır
      Bununla ilgili olarak “If You're Typing The Letters A-E-S Into Your Code, You're Doing It Wrong” yazısını öneririm
    • Tüm iç fonksiyonları API sözleşmesinin parçası sayarsanız, neredeyse her değişiklik geriye dönük uyumluluğu bozan bir kırılma olur
      Bu yüzden bazı özellikleri private veya internal ile sınırlamak çoğu zaman doğru tercihtir
      Libsodium'ın bu sınırı iyi çizip çizmediğinden emin değilim ama denge önemlidir
    • Eskiden CeeFIT adında bir C++ test çatısı yazmıştım ve fixture'ları derleme zamanında kaydetme yöntemimle gurur duyuyordum
      Ama bazı kullanıcılar bunu bir batch runner gibi kullanıyordu
      Onların ihtiyaçlarını desteklemek için birkaç hata düzelttim
      Sonuçta kullanıcıların olması bile beni mutlu etmişti
  • Bu hata ince ama önemli bir kriptografik doğrulama hatası
    “Geçerli mi diye kontrol etme” gibi basit görünen bir denetim aslında çok karmaşıktır
    Asal dereceli alt grup dışındaki noktaları kabul etmek, anında bir zafiyet yaratmıyor gibi görünse bile üst katman varsayımlarını bozabilir
    Ayrıca düşük seviyeli ilkel fonksiyonlar amaçlanandan çok daha geniş biçimde yeniden kullanılır; bu yüzden küçük bir doğrulama eksiği büyük bir etkiye yol açabilir

    • Ancak X25519 ve Ed25519 aslında baştan bu tür doğrulamaya ihtiyaç duymayacak şekilde tasarlanmıştır
      Alt grup sorunu yalnızca Curve25519 üzerinde daha karmaşık protokoller kurduğunuzda ortaya çıkar
      Bu yüzden mümkün olduğunca tüm noktaları asal dereceli alt gruba yeniden eşliyorum
      Monocypher bu tür gelişmiş fonksiyonlara sahip
      Örneğin crypto_x25519_dirty_fast() veya crypto_elligator_map() gibi fonksiyonlar var
      Bu tür “dirty” fonksiyonlar, tüm eğriyi kapsayan ve rastgelelikten ayırt edilemeyen açık anahtarlar üretir
      Sonrasında X25519 anahtar değişiminde de aynı paylaşılan sırrı elde edebilirsiniz
      Bu, DJB'nin tasarımı sayesinde mümkündür; çünkü açık anahtar anormal olsa bile paylaşılan sır asal dereceli alt gruba eşlenir
      Sonuç olarak Ristretto'ya yalnızca bu yeniden eşlemenin mümkün olmadığı durumlarda ihtiyaç vardır
      Elbette asal dereceli grup soyutlaması faydalıdır, ancak böyle protokoller tasarlayabilecek biri trivial olmayan cofactor ile başa çıkabilmelidir
  • Büyük bir şirkette çalışıyorsanız, Frank için şirket düzeyinde sponsorluk düşünmenizi öneririm

    • Ben Apple'da çalışıyorum ama Frank'in kim olduğunu bilmiyorum, sponsorluk sürecini de bilmiyorum
      Bilsem bile muhtemelen şirket hesabından değil kendi cebimden destek vermem gerekirdi
  • libnacl da etkileniyor mu merak ediyorum
    Ben her gün libnacl ile derlenmiş yazılımlar kullanıyorum ama “libsodium” ile derlenmiş olanları kullanmıyorum

  • Gerçekten harika bir kütüphane
    Frank Denis'e teşekkürler