Son zamanlarda, güvenlik açığı tespit sistemimiz Solana'nın rBPF'sinde (yani tüm Solana dApp'lerinin üzerinde çalıştığı sanal makine: https://github.com/solana-labs/rbpf) kritik bir sorun keşfetti. Dikkatli bir araştırmanın ardından, bunun tüm Solana ağını çökertmek için istismar edilebilecek bir tam sayı taşması hatası olduğunu tespit ettik. Hatayı Solana güvenlik ekibine bildirdik ve ekip, hatayı doğrulamak ve düzeltmek için hemen harekete geçti. Bu yazının kaleme alındığı tarih itibarıyla, neredeyse tüm doğrulayıcı düğümler yamayı alarak en son sürüme yükseltti; bu da kamuoyuna açıklama yapmanın güvenli olduğu anlamına geliyor.
eBPF ve rBPF
Genişletilmiş Berkeley Paket Filtresi (eBPF[1]), başlangıçta çekirdekteki paketleri filtrelemek için geliştirilmiştir. eBPF'nin güvenliği, verimliliği ve ölçeklenebilirliği sayesinde artık ağ iletişimi, izleme, profil oluşturma vb[2] gibi çeşitli alanlarda kullanılmaktadır. eBPF'nin zengin yetenekleri göz önünde bulundurularak Solana, onu akıllı sözleşmeler için yürütme motoru olarak da seçmiştir. Solana üzerinde dApp geliştirmek için geliştiricilerin, eBPF bayt koduna derlenen Rust dilinde akıllı sözleşmeler geliştirmeleri gerekmektedir.
Solana'nın dApp'lerini barındırmak için eBPF'ye yönelik hassas bir sanal makineye ihtiyaç duyulmaktadır. Bu durumda Solana, Rust ile yazılmış bir eBPF sanal makinesi olan rBPF'yi kullanmaktadır. Ancak önerilen sanal makinenin (yani rBPF'nin) sağlam, güvenli ve hassas olup olmadığı bilinmemektedir. rBPF içinde güvenlik sorunlarının bulunması durumunda, rBPF içeren tüm doğrulayıcılar etkilenebilir ve bu durum tüm Solana ağı için büyük kayıplara (örn. DDoS saldırısı) yol açabilir.
Hatanın Temel Nedeni
rBPF için hataları tespit eden bir araç geliştirdik. Bu araç hâlâ aktif geliştirme aşamasındadır. Bu süreçte rBPF'de (sürüm 0.2.16) tüm ağı çökertebilecek ciddi bir sorun tespit edildi.
Özellikle, "elf.rs" dosyasındaki "load" işlevi, ELF dosyasını (akıllı sözleşmeyi) ayrıştırmak ve doğrulamak için kullanılmaktadır. İlk olarak "load" işlevi, ELF yapısını okuyarak çağrılan fonksiyon ofsetini ayarlamak için "relocate" işlevini çağırır. Ancak "relocate" işlevinde, "sym.st_value" özelliği doğrudan ELF dosyasından alınmaktadır. "st_value" yeterince büyükse, "sym.st_value" ile "refd_pa"nın toplamı olan "addr" hesaplanırken tam sayı taşması tetiklenebilir.

Bu durumda, bir saldırgan tam sayı taşmasını tetikleyebilecek kötü amaçlı bir ELF dosyasını akıllı sözleşme olarak oluşturabilir. Bunun ardından her doğrulayıcı hedef ELF dosyasını çalıştıracak ve rBPF "add with overflow" hatasıyla panik yapacaktır.

Bu noktada rBPF kilitlenecek ve gelen işlemler yürütülemeyecek, bu da bir DoS saldırısına yol açacaktır. ELF dosyasını yüklerken oluşan tam sayı taşması nedeniyle düğümün aşağıda gösterildiği gibi "Finalizing transaction" aşamasında takılı kaldığı gözlemlenebilir.

Bu sorun https://github.com/solana-labs/rbpf/pull/200 adresinde tanıtıldı; bu da rBPF'nin 0.2.14 sürümünden itibaren açığa sahip olduğu anlamına gelmektedir. Sorunu tespit ederek 6 Aralık 2021'de Solana güvenlik ekibine bildirdik. Solana, raporumuzun ardından birkaç saat içinde güvenli matematik mekanizmasını kullanarak sorunu düzeltti. Düzeltme https://github.com/solana-labs/rbpf/pull/236 adresinde yer almaktadır. Bu yazının kaleme alındığı tarihte (2021/12/30), doğrulayıcıların %86'sından fazlası en yeni sürüme yükseltme yapmıştır.
[1] https://en.wikipedia.org/wiki/Berkeley_Packet_Filter
[2] https://ebpf.io/
Zaman Çizelgesi
- 2021/12/06: sorun Solana güvenlik ekibine bildirildi
- 2021/12/06: güvenlik açığı giderildi.
- 2021/12/30: bu güvenlik açığına ilişkin bilgiler yayımlandı
- 2022/01/28: CVE-2021–46102 atandı



