블록체인에서는 스마트 컨트랙트라는 자동화된 계약서를 이용하여 프로그램 실행을 자동으로 처리합니다. 하지만 이러한 스마트 컨트랙트에서 버그나 취약점이 발견되어 이를 악용하여 계약 내용을 위변조할 수 있는 사례들이 있었습니다.
아래는 스마트 컨트랙트 취약점 중 하나인 잔액 오염(Balance Attack)을 PHP로 구현한 예시입니다.

class BankAccount {
    private $balance = 0;

    function __construct($initialBalance) {
        $this->balance = $initialBalance;
    }

    function deposit($amount) {
        $this->balance += $amount;
    }

    function withdraw($amount) {
        if ($amount > $this->balance) {
            throw new Exception("Insufficient funds");
        }
        $this->balance -= $amount;
    }

    function getBalance() {
        return $this->balance;
    }
}

class Hack {
    private $bankAccount;

    function __construct($bankAccount) {
        $this->bankAccount = $bankAccount;
    }

    function steal($amount) {
        $this->bankAccount->withdraw($amount);
        $this->bankAccount->deposit($amount*2);
    }
}

$bankAccount = new BankAccount(100);
$hack = new Hack($bankAccount);
$hack->steal(50);
echo "Current balance: " . $bankAccount->getBalance();

위 코드에서는 BankAccount 클래스를 이용해 계좌를 만들고, Hack 클래스를 이용해 계좌를 해킹하는 코드가 작성되어 있습니다. Hack 클래스에서 steal 함수는 계좌에서 돈을 빼내고, 2배로 늘려 다시 입금합니다. 이렇게 하면 계좌의 잔액이 증가하게 됩니다.

위 코드에서는 Hack 클래스에서 BankAccount 클래스의 withdraw 함수를 호출할 수 있습니다. 그리고 Hack 클래스에서 계좌에서 출금한 금액의 2배를 다시 계좌에 입금하면 계좌 잔액이 증가합니다. 따라서 BankAccount 클래스의 getBalance 함수에서는 계좌 잔액이 증가한 것을 확인할 수 있습니다.  

스마트 컨트랙트 취약점에 대한 실제 사례들과 그 발생 원인은 다양합니다. 일부 예시를 살펴보면 다음과 같습니다.

  1. DAO 해킹 사건 (2016년)
    • 발생 원인: DAO는 이더리움 기반의 탈중앙화 자율 조직으로, 이 조직에서 사용하는 스마트 컨트랙트에 취약점이 있었습니다. 이를 악용하여 해커는 약 3.6백만 이더리움을 탈취했습니다.
  2. Parity 마치 문제 (2017년)
    • 발생 원인: Parity는 이더리움 지갑 및 기타 도구를 제공하는 이더리움 개발 팀으로, 스마트 컨트랙트에서 발생한 버그로 인해 약 15만 이더리움이 잃어버렸습니다.
  3. King of the Ether Throne 문제 (2016년)
    • 발생 원인: 이더리움을 기반으로 한 게임인 King of the Ether Throne에서는 참가자들이 스마트 컨트랙트를 사용하여 게임을 진행합니다. 이 게임에서 발생한 취약점으로 인해 참가자들은 이 게임에서 얻은 이더리움을 탈취할 수 있었습니다.
  4. Rubixi 스마트 컨트랙트 버그 (2018년)
    • 발생 원인: Rubixi는 분산 웹 기반의 게임이었습니다. 스마트 컨트랙트에 존재하는 버그를 이용하여 해커는 이 게임에서 토큰을 생성하고 이를 이더리움으로 전환하는 것을 가능하게 했습니다.

이러한 스마트 컨트랙트 취약점의 발생 원인은 다양합니다. 대표적으로는 코드 작성자의 실수, 새로운 기술의 미성숙함, 외부 입력 데이터에 대한 무차별적인 신뢰 등이 있습니다. 따라서 스마트 컨트랙트를 작성하고 실행할 때는 보안을 고려하여 코드를 작성하고, 보안 전문가들이 리뷰하는 것이 좋습니다. 또한 스마트 컨트랙트의 취약점을 검증하기 위한 다양한 도구들도 개발되고 있습니다.