Reentrancy (Yeniden Giriş) Saldırısı Nedir?

Reentrancy (yeniden giriş), bir akıllı sözleşmenin dış çağrı yaptığı sırada kayıtlarını güncellemeden yeniden çağrılabilmesinden doğan güvenlik açığıdır. Saldırgan bu açıkla aynı fonu tek işlemde defalarca çekebilir; 2016’daki The DAO saldırısı en bilinen örnektir.

Bu sayfada 6
  1. Reentrancy saldırısı nasıl çalışır?
  2. The DAO saldırısı ve sonuçları
  3. Reentrancy türleri
  4. Reentrancy nasıl önlenir?
  5. Sık sorulan sorular
  6. Kaynak

Reentrancy, Türkçesiyle yeniden giriş, bir akıllı sözleşmenin başka bir sözleşmeye çağrı yaptığı sırada, kendi kayıtlarını güncellemeyi bitirmeden tekrar çağrılabilmesinden doğan güvenlik açığıdır. Saldırgan bu açığı kullanarak aynı fonu tek bir işlem içinde defalarca çekebilir. Ethereum tarihinin en bilinen saldırılarından biri olan 2016’daki The DAO olayı bu açık sayesinde gerçekleşti.

Reentrancy saldırısı nasıl çalışır?

Ethereum’da bir sözleşme başka bir adrese ETH gönderdiğinde, alıcı adres bir sözleşmeyse onun kodu da çalışabilir. Reentrancy açığı, gönderen sözleşmenin bu sırada kendi kayıtlarını henüz güncellememiş olmasından doğar. Basit bir para çekme senaryosunda adımlar şöyledir:

  1. Saldırgan, hedef sözleşmeye 1 ETH yatırır ve ardından çekim talep eder.
  2. Hedef sözleşme bakiyeyi kontrol eder ve 1 ETH’yi saldırganın sözleşmesine gönderir.
  3. ETH gelir gelmez saldırganın sözleşmesi otomatik olarak tekrar çekim fonksiyonunu çağırır.
  4. Hedef sözleşme saldırganın bakiyesini henüz sıfırlamadığı için ikinci çekimi de onaylar.
  5. Döngü, sözleşmedeki fon bitene veya işlem limiti dolana kadar sürer.

Sorunun kökü sıralamadadır: Sözleşme önce parayı gönderip sonra bakiyeyi güncellediği için arada bir pencere açılır. Bütün bu döngü tek bir blok zinciri işlemi içinde, saniyeler içinde tamamlanır.

The DAO saldırısı ve sonuçları

The DAO, 2016’da Ethereum üzerinde kurulan ve kitle fonlamasıyla büyük miktarda ETH toplayan merkeziyetsiz bir yatırım fonuydu. Haziran 2016’da bir saldırgan, sözleşmedeki reentrancy açığını kullanarak yaklaşık 3,6 milyon ETH’yi kendi kontrolündeki bir alt sözleşmeye aktardı. Ethereum topluluğu fonları geri almak için hard fork yapmaya karar verdi; bu kararı kabul etmeyen zincir Ethereum Classic olarak devam etti.

Reentrancy türleri

  • Tek fonksiyonlu: Saldırgan aynı fonksiyonu tekrar tekrar çağırır. The DAO örneği bu türdendir.
  • Fonksiyonlar arası: Saldırgan, aynı kaydı paylaşan farklı bir fonksiyonu çağırır.
  • Sözleşmeler arası: Birden fazla sözleşme ortak bir durumu kullanır ve açık bunlar arasındaki etkileşimde oluşur.
  • Salt okunur (read-only): Başka bir protokol, güncellenmemiş durumu okuyup yanlış fiyat hesaplar.

Açık yalnızca uygulama kodunda değil, kullanılan araçlarda da olabilir. Temmuz 2023’te Vyper programlama dilinin bazı eski derleyici sürümlerindeki bir hata, yeniden giriş kilidinin çalışmamasına yol açtı ve birkaç Curve havuzundan fon çekildi.

Reentrancy nasıl önlenir?

Geliştiricilerin kullandığı başlıca yöntemler şunlardır:

  • Checks-Effects-Interactions: Önce koşullar kontrol edilir, ardından bakiye gibi kayıtlar güncellenir, en son dış çağrı yapılır.
  • Yeniden giriş kilidi: Fonksiyon çalışırken tekrar girilmesini engelleyen bir kilit kullanılır; OpenZeppelin’in ReentrancyGuard modülü bunun yaygın örneğidir.
  • Bağımsız denetim ve test: Fonksiyonlar arası etkileşimler özel olarak incelenir.

Kullanıcı açısından “reentrancy korumalı” ifadesi tek başına güvenlik garantisi değildir. Denetim raporunun hangi sürümü kapsadığına bakmak ve büyük tutarları tek bir protokolde tutmamak daha anlamlı önlemlerdir. Genel tablo için exploit sayfasına da göz atabilirsiniz.

Sık sorulan sorular

Reentrancy yalnızca Ethereum’da mı olur?

En çok Ethereum ve EVM uyumlu ağlarda görülür, çünkü bu ağlarda sözleşmeler birbirini serbestçe çağırabilir. Benzer sorunlar sözleşmeler arası çağrıya izin veren başka platformlarda da ortaya çıkabilir.

Cüzdanımı protokolden ayırmak beni korur mu?

Hayır. Reentrancy açığı protokolün tuttuğu ortak fonları etkiler; daha önce yatırdığınız varlıklar sözleşmenin içinde kalır.

Kaynak

Bir sonraki okuma