Akıllı Sözleşmelerde Reentrancy (Yeniden Giriş) Açığı
Blokzincir ve akıllı sözleşme dünyasının en kötü şöhretli, en maliyetli ve en sık karşılaşılan siber güvenlik zafiyetlerinin başında Reentrancy (Yeniden Giriş) açığı gelir. Kripto varlıkların milyarlarca dolarlık kayıplar yaşamasına neden olan bu açık, Ethereum tarihindeki meşhur "The DAO" hack vakasının da ana sebebidir. Akıllı sözleşmelerin çalışma mantığındaki mantıksal bir sıra hatasından beslenen bu zafiyet; kötü niyetli bir sözleşmenin, hedef sözleşmedeki bir fonksiyonu henüz ilk işlem çağrısı tamamlanmadan "yeniden ve üst üste" çağırmasıyla (recursive call) ortaya çıkar. Saldırgan, sistemin bakiye güncelleme döngüsünü manipüle ederek sözleşme içerisindeki tüm fonları tek bir saniyede kendi cüzdanına boşaltabilir.
Saldırının Teknik İşleyişi ve Mantık Hatası
Reentrancy açığı, geliştiricinin akıllı sözleşme içerisindeki durum değişkenlerini (state variables) güncelleme sırasını yanlış kurgulamasından kaynaklanır. Tipik bir para çekme (withdraw) fonksiyonunda sistemin üç temel adımı sırasıyla izlemesi beklenir: kullanıcının çekebileceği bakiyeyi kontrol etmek, fonu kullanıcının adresine transfer etmek ve son olarak kullanıcının sözleşmedeki bakiye verisini sıfırlamak (girişleri güncellemek).
Saldırgan, bu adımları sabote etmek için sıradan bir cüzdan adresi yerine, içinde özel kodlar barındıran kötü niyetli bir akıllı sözleşme hazırlar. Saldırganın sözleşmesi, hedef sözleşmedeki para çekme fonksiyonunu tetikler. Hedef sözleşme kullanıcının bakiyesini kontrol eder ve fonu transfer etmek için saldırganın sözleşmesine gönderir. Fon saldırganın sözleşmesine ulaştığı an, akıllı sözleşmelerin yapısı gereği saldırganın tarafındaki "fallback" veya "receive" adı verilen otomatik fonksiyonlar tetiklenir. Saldırgan, bu fonksiyonun içine hedef sözleşmedeki para çekme butonuna "tekrar basacak" bir kod yerleştirmiştir. Hedef sözleşme henüz ilk işlemdeki bakiye güncelleme adımına (üçüncü adım) geçemediği için, sistem saldırganın bakiyesini hala ilk günkü gibi dolu görür ve fonu tekrar transfer eder. Bu kısır döngü, hedef sözleşmedeki tüm likidite tükenene kadar saniyeler içinde binlerce kez tekrarlanır.
Güvenlik Önlemleri ve Çek-Etki Et-Etkileşime Geç Deseni
Reentrancy saldırılarını tamamen engellemek ve akıllı sözleşmeleri bu sinsi döngüden korumak için yazılım dünyasında kabul görmüş çok kesin tasarım kalıpları ve teknik bariyerler mevcuttur. Bu önlemlerin başında, akıllı sözleşme mühendisliğinin altın kuralı kabul edilen Checks-Effects-Interactions (Kontroller - Etkiler - Etkileşimler) deseni gelir.
Bu güvenlik desenine göre, bir fonksiyon yazılırken dış dünya ile iletişime geçmeden (yani para transferi yapmadan) önce, sözleşmenin kendi içindeki tüm durum değişiklikleri ve bakiye güncellemeleri tamamlanmalıdır. Sistem önce kullanıcının hakkını kontrol etmeli (Checks), ardından kullanıcının bakiyesini hemen sıfıra düşürmeli (Effects) ve en son aşamada parayı adrese göndermelidir (Interactions). Bu senaryoda saldırgan fonu teslim alıp sözleşmeye yeniden girmeye (re-enter) çalışsa bile, sistem bakiyeyi çoktan sıfırladığı için sonraki tüm çekme taleplerini anında reddedecektir. Ek olarak geliştiriciler, OpenZeppelin gibi güvenilir kütüphanelerde yer alan ve fonksiyonların üst üste çağrılmasını donanımsal olarak engelleyen "ReentrancyGuard" (nonReentrant belirteci) gibi şifreli kilit mekanizmalarını kodlarına entegre ederek bu ölümcül açığa karşı mutlak bir savunma kalkanı oluştururlar.
