İçeriğe geç
edumintsBlog
AI Araçları3 dk okuma

Rust Standart Kütüphanesi: Güvenli API Altındaki Riskler

Kaynak: Hacker News

Paylaş
AI AraçlarıEdumints Blog
İçindekiler 3 başlık

Derleyicinin sunduğu zengin tip sistemi ve sahiplik (ownership) modeli sayesinde unsafe anahtar kelimesini hiç kullanmadan kod yazdığında bellek güvenliği hatalarından tamamen korunduğunu düşünebilirsin. Microsoft bünyesindeki FORGE Lab araştırmacılarının yayımladığı bulgular bu varsayımı sarsıyor. Ekip, Rust standart kütüphanesinin temelini oluşturan std ve core katmanlarında, tamamen güvenli (safe) Rust ile yazılmış kodların bile tanımsız davranış (undefined behavior) tetiklemesine yol açan bellek güvenliği hataları tespit etti. Üstelik sorun derleyicide değil. Hatalar doğrudan standart kütüphanenin içindeki unsafe blokların güvenlik sözleşmesini ihlal etmesinden kaynaklanıyor.

Güvenli Arayüzlerin Altındaki Ham İşaretçiler ve Yanlış Güven#

En alt katmana indiğinde Rust, ham işaretçilerle (raw pointers) çalışmak ve işletim sistemiyle doğrudan iletişim kurmak için unsafe bloklarına başvurur. Her gün kullandığın Vec ve String gibi temel veri yapıları bile güvenli API katmanlarıyla sarmalanmış küçük unsafe parçaların üzerine inşa edilir. Alt katmandaki bu kodlar güvenlik sözleşmesini bozduğunda, üstte tamamen güvenli kurallarla yazdığın kod bile dilin engellemek üzere tasarlandığı hatalarla karşılaşır.

2021 yılında Rust dünyasındaki bellek güvenliği hatalarını tarayan statik analiz aracı Rudra'yı geliştiren araştırmacıları da barındıran FORGE Lab, bu incelemede geleneksel analizlerle bulunması zor hataları yakalamak için insan uzmanlığını yapay zeka destekli araçlarla birleştirdi. Kod adı MDASH olan yapay zeka destekli güvenlik açığı tarama sisteminin öncü araştırma sürümü Hyenas, standart kütüphanedeki sağlamlık (soundness) hatalarının bir kısmını ortaya çıkardı. Araçlarını da Rust ile geliştiren araştırmacılar, alttaki kodu inceleyip hataları yeniden üreterek güvenlik etkilerini değerlendirdikten sonra bulguları Rust sorun takipçisine (issue tracker) bildirdi ve düzeltilmesi için bakımcılarla çalıştı.

İncelenen hatalar, unsafe kod yazarken tekrarlanan üç yanlış güven kalıbında toplanıyor:

  • Kodun paniklemeyeceğine güvenmek: İşlem sırasında beklenmeyen bir panik durumu oluştuğunda bellek durumunun tutarsız kalması.
  • Kullanıcı tanımlı uygulamalara güvenmek: Dışarıdan sağlanan kodların her zaman doğru davranacağını varsaymak.
  • Alttaki sisteme güvenmek: İşletim sistemi veya alt katman davranışlarını sorgulamadan kabul etmek.

Milyarlarca Kullanıcılı Sistemlerde Temel Kütüphanelerin Etkisi#

Milyarlarca insanın her gün farkında bile olmadan Rust tabanlı yazılımlarla veya işletim sistemleriyle etkileşime girdiği tahmin ediliyor. Microsoft, Rust'ı C++, C# ve TypeScript ile birlikte birinci sınıf (Tier-1) iç dil konumuna getirdi. GitHub Copilot ajan çalışma zamanını (agent runtime) Rust ile baştan yazarken Bun, Android, Linux çekirdeği ve Cloudflare da kodlarını bu dile taşıyor.

Böylesine yaygınlaşan yazılımların büyük bölümü doğrudan core ve std kütüphanelerine dayanıyor. Doğal olarak bu temel kütüphanelerdeki bir hata, ortaya çıktığı kod parçasının çok ötesinde sonuçlar doğurabiliyor. Araştırma, derleyicideki yanlış derleme (miscompilation) veya tip sistemi boşluklarını kapsam dışı bırakarak tamamen standart kütüphanedeki unsafe kodun sağlamlık sorunlarına odaklanıyor.

Kendi Kodunda ve Kütüphane Seçiminde Ne Yapabilirsin?#

Rust'ın güvenlik modeli kusursuz olmasa da bellek güvenliği hatalarının büyük sınıflarını tasarım aşamasında eliyor. Yine de bir geliştirici veya öğrenci olarak kendi projelerinde unsafe blokları yazarken ya da üçüncü taraf paketleri incelerken FORGE Lab'in ortaya koyduğu üç tuzaktan kaçınabilirsin.

Güvenli bir API ile sarmaladığın unsafe kod yazıyorsan şu üç kontrolü alışkanlık haline getir:

  • Çağrılan fonksiyonların panikleyebileceğini hesaba kat ve panik anında bellek durumunun bozulmadığından emin ol.
  • Dışarıdan gelen, kullanıcının sağladığı uygulamaların (implementations) sözleşmeye her zaman uyacağını varsayma.
  • İşletim sistemiyle veya ham işaretçilerle etkileşime girdiğinde alt sistemin dönüşlerini doğrulamadan işlem yapma.

Hiç unsafe yazmasan bile kullandığın temel veri yapılarının altında bu katmanın çalıştığını bilmek hata ayıklama bakış açını değiştirir. Standart kütüphanede düzeltilen bu hatalar nedeniyle projelerindeki Rust araç zincirini güncel tutarak kapatılan sağlamlık açıklarından korunabilirsin.

Kaynak ve atıf

Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • forge-blog.github.io/posts/rust-std-memory-safety