내 토큰이 탈취 당할 수 있을까? 우리가 끊임없이 들어왔던 블록체인 기술의 장점은 보안성이었다. 그러나 당신의 토큰은 해커에게 탈취 당할 수 있고, 이는 개발자들의 작은 실수에서 비롯될 수 있다.
개발자의 작은 실수는 스마트 컨트랙트 코드를 입력하는 블록체인 개발 영역에서 발생한다. 스마트 컨트랙트 기술의 특징은 개발자가 직접 계약 조건과 이행 내용을 코드화 해 계약서를 자동화한다는 점이다. 이는 사람들이 기존 계약 프로세스에서 존재했던 수작업의 불편함을 해소시킬 수 있는 하나의 해결책이 되었다.
스마트 컨트랙트가 계약 프로세스를 자동화하고 간소화할 수 있는 잠재력은 있지만, 계약서가 코드화 되어 있는 점을 이용해 해당 코드를 악용하려는 집단의 주요 표적이 되기도 한다.
이는 실제 조사 결과에서도 드러난다.
싱가포르 국립대학교(National University of Singapore)와 런던대학교(University College London)의 연구를 통해 이더리움(Ethereum) 네트워크에서 해킹에 취약한 스마트 컨트랙트가 대거 발견되었다. 이 수치는 자그마치 4만개에 달한다. (출처 : ’Finding The Greedy, Prodigal, and Suicidal Contracts at Scale’)
또한 블록체인 기술 보안 연구소 헥슬란트가 ERC20기반의 스마트 컨트랙트 취약성 검증을 진행한 결과, 1000개 중 60% 이상의 컨트랙트에서 보안에 취약한 코드가 발견된 것으로 확인되었다.
이더리움 네트워크 상에 존재했던 컨트랙트 코드의 취약성은 결국 사람들에게 큰 피해를 입히기 시작했다.
대표적인 사례로 다오(DAO) 잔고 탈취 사건과 패러티(Parity) 지갑 잠금 사고가 있다.
다오 토큰은 스플릿(Split)이라는 기능을 제공하고 있었다.
*스플릿(Split): 보유한 다오 토큰을 일정 비율의 이더리움으로 되돌려 받는 일종의 투자금 반환 기능
이 스플릿 기능에는 투자자들이 투자금 반환 요청을 이행하면 '일정 시간'이 지난 뒤 에야 해당 잔고가 감소하는 치명적인 결함이 존재했다. 이를 파악한 해커들은 반환 요청을 한 뒤 잔고가 감소하기 전, ‘일정 시간’ 동안 계속적인 반환 요청을 신청했다. (Recursive Attack이라고도 불리며, 이 결함은 현재 보완되었다.)
은행을 예로 들면, 100만 원이 잔고로 있는 통장에서 금액을 인출하는데, 통장에서 인출 금액의 차감이 5분 뒤에 이뤄지는 것으로 볼 수 있다. 즉, 5분간 통장 잔고는 100만 원이 유지되기 때문에 5분 동안은 내가 원하는 횟수만큼의 100만 원을 인출할 수 있는 것이다.
해커들은 이 방법을 통해 수백억원에 달하는 이더리움을 탈취하였고, 이더리움 네트워크는 해당 버그를 해결하기 위해 하드포크를 진행할 수밖에 없었다.
패러티(Parity) 지갑 동결 사건은 지갑 프로그램에 잘못된 컨트랙트 코드 사용으로 버그가 발생하여 다수의 패리티 지갑 사용자들의 이더리움이 강제로 동결된 사건이다.
최초 지갑 컨트랙트 생성 시 지갑의 소유권을 지정하는 코드가 애니타임(anytime), 애니원(anyone) 으로 작성된 것이 원인이었다. 누구나 언제든지 소유권을 지정할 수 있는 치명적인 오류가 들어간 것이다.
동결된 이더리움은 무려 1억5000만 달러(원화 약 1700억 원)로 엄청난 액수의 피해액이 발생했다.
제한적인 상황에서도 취약성 검증 단계는 이제 필수적인 관문이다. 오류가 발생하지 않는 컨트랙트를 구현하는 일은 프로젝트의 보안 뿐만 아니라 건강한 블록체인 생태계 구축을 위한 필수 요소이다.
잘못된 컨트랙트 코드 입력은 블록체인 상에서 상상 이상의 많은 문제들을 야기할 수 있다는 점을 모든 프로젝트 팀은 유념해야 한다.