Blockchain Güvenliği: Yeniden Giriş Saldırısı (Re-entrancy Attack)

Aziz Kartal
ODTÜ Blockchain Topluluğu
3 min readNov 5, 2022

Bu yazıda yeniden giriş saldırısının ne olduğundan, gerçekleşmiş olan saldırılardan ve kayıplardan, bu saldırıdan kaçınmak için kullanabileceğiniz yöntemlerden bahsedeceğiz. Haydi başlayalım!

Yeniden giriş saldırısı akıllı kontratlarda sıklıkla rastlanılan bir güvenlik zafiyetidir. Yeniden giriş saldırısının bilinirliği 2016 yılında Ethereum blok zincirinde gerçekleşmiş olan DAO Hack sonrasında artmıştır.

2016 yılında gerçekleşmiş olan DAO Hack’i açıklayan kaynak önerisi: Bytescan

Yeniden Giriş Saldırısı (Re-entrancy Attack) Nedir?

Bir saldırgan, yazılımın istenmeyen bir eylemi gerçekleştirmesine neden olmak için yazılımın kod tasarımındaki bir kusurdan yararlandığında meydana gelen saldırıdır.

Akıllı sözleşmelerde yeniden giriş saldırısı, saldırganların blok zincir ağına kötü niyetli sözleşme konuşlandırmaları ile gerçekleşir.

Konuşlandırılan kötü niyetli sözleşmenin amacı hedef sözleşmeyi manipüle ederek kendilerine varlık göndermelerini sağlamaktır.

Bu atak öz yinelemeli(recursive) olarak çekim(withdraw) fonksiyonunu çağırmaları ile meydana gelir.

Sözleşmedeki bakiye güncelleme işlemi tamamlanamadığından saldırgan birçok defa çekim işlemi yapabilir.

Peki yeniden giriş saldırısı akıllı kontratlarda nasıl gerçekleşir?

İki akıllı kontrat olduğunu varsayalım. Bu iki akıllı kontrat arasında ilk kontrat saldırıya uğrayan(hedef) ikincisi ise saldırgan kontrat olsun.

İlk kontrata bir işlem isteği ulaştığını varsayalım. İlk kontrat normal şartlarda aşağıdaki adımları sırayla gerçekleştirir.

  • Mevcut bakiyeyi kontrol eder.
  • Varlığı gönderir.
  • Mevcut bakiyeyi günceller.

Bir saldırganın yeniden giriş saldırısı yaptığında gerçekleşen adımları sıralayalım:

  • Hedef kontrat bakiyeyi kontrol eder.
  • Varlığı gönderir.
  • Saldırgan kontrat, hedef akıllı kontratın bakiyesini güncellemek için gerekli zamanı bulamadan tekrar tekrar geri çevirme işlevini çağırır.

Fonların gönderilmesi ile bakiyenin güncellenmesi arasındaki süre, saldırgan kontratın fonlarını çekmek için başka bir çağrıda bulunabileceği bir pencere oluşturur. Böylece bu döngü tüm fonların çalınmasına kadar devam eder.

Adım adım yeniden giriş saldırısı:

  • Bilgisayar korsanı, kötü niyetli bir akıllı sözleşme oluşturur.
  • Bu sözleşme daha sonra hedefin geri çekme işlevini çağırmak için kullanılır.
  • Hedeften para alındıktan sonra, kötü niyetli akıllı sözleşmede bir geri dönüş işlevi etkinleştirilir ve daha fazla para almak için geri çekme işlevini tekrar tekrar çağırır.
  • Program akışı yarıda kesildiği için hedefin akıllı sözleşmesi saldırganın bakiyesini güncelleyemez.
  • Bu işlem, tüm fonlar çalınana kadar birden çok kez devam edebilir.

Saldırıyı adım adım anlatan kaynak önerisi:

Veri Delisi — Re-entracny Attack

Reentrancy | Hack Solidity (0.6) — Smart Contract Programmer (Video)

Gerçekleşmiş yeniden giriş saldırıları ve karşılaşılan kayıplar

Yeniden giriş saldırısı nasıl önlenebilir?

  • Harici sözleşmeleri(external) çağırmadan önce tüm durum değişikliklerinin gerçekleştiğinden emin olun.
  • Yeniden girişi önleyen işlev değiştiricileri kullanın.
  • CEI yöntemini kullanın (Checks, Effects, Interactions)
  • Yeniden giriş saldırısı için koruyucu(Mutex)kullanın.

Örnek:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract ReEntrancyGuard {
bool internal locked;
modifier noReentrant() {
require(!locked, “No re-entrancy”);
locked = true;
_;
locked = false;
}
}

Saldırının nasıl önlenebileceğine değinen kaynak önerisi:

Insurgent — 4 Ways to Prevent Reentrancy Attacks

Preventing Re-Entrancy Attacks — Lessons from History — Amber Group

--

--