취약점
취약점(脆弱點, vulnerability) 또는 보안 취약점이란 시스템의 버그나 프로그래밍 오류로 인해 해킹 등의 공격을 받아 시스템의 정보 신뢰도가 저하될 수 있는 약점을 말한다. 웹취약점이라고도 한다. 블록체인 시스템에서 사용하는 스마트 계약(smart contract)의 경우에도 다수의 보안 취약점이 존재한다.
목차
개요
스마트 계약 또는 스마트 컨트랙트는 블록체인 기술을 기반으로 계약 조건을 코딩하고, 조건이 충족되면 계약 내용이 자동으로 실행되는 프로토콜이다. 이더리움 스마트 컨트랙트는 솔리디티(Solidity)라는 프로그래밍 언어로 작성된 소스 코드로서, 소스 코드 상의 작은 실수나 버그로 인해 오류가 발생할 수 있다. 이더리움 기반 토큰들은 스마트 컨트랙트를 이용하여 만들어지기 때문에, 스마트 컨트랙트를 안전하게 관리하지 못하면 해킹 등 큰 경제적 피해가 초래될 수 있다. 그렇기 때문에 사용자 및 투자자들을 위험에 빠뜨리지 않기 위해서라도 스마트 컨트랙트에 대한 검증은 매우 중요하다.
6대 보안 취약점
스마트 컨트랙트 보안 취약점은 다양한 형태로 존재한다. 대표적으로 이더리움 솔리디티 언어의 6대 보안 취약점은 다음과 같다.[1]
오버플로 및 언더플로 문제
다른 컴퓨터 연산에서와 마찬가지로 이더리움 스마트 컨트랙트는 정수(integer)에 대해 오버플로 및 언더플로가 발생하는 보안 취약점이 존재한다. 오버플로(overflow)란 숫자가 최댓값 이상으로 증가하는 경우를 말한다. 이더리움에 사용된 솔리디티 프로그래밍 언어는 최대 256 비트의 숫자(0 ~ 2256-1)까지 처리할 수 있는데, 만약 최댓값인 2256-1 에서 다시 +1을 증가시키면, 오버플로가 발생하여, 0이 되어버리는 문제가 있다. 반대로 언더플로(underflow)는 숫자가 최솟값 이하로 감소하는 경우를 말한다. 가장 작은 양의 정수인 0에서 -1을 연산하면, 최댓값인 2256-1이 되어버린다. 이는 마치 24시간을 표시하는 시계에서 24시 다음에 1시간을 더하면 25시가 아니라 1시가 되고, 반대로 0시 30분에서 1시간을 빼면 마이너스 30분이 아니라 23시 30분이 되어버리는 것과 같다.
스마트 컨트랙트의 오버플로 및 언더플로 문제를 해결하기 위해 오픈제플린(OpenZeppelin)의 세이프매쓰(SafeMath) 라이브러리를 사용한다. 이 라이브러리를 사용하면 오버플로 및 언더플로 문제를 해결할 수 있다.
메시지 호출과 접근권한 제어 문제
솔리디티의 메시지 호출 함수인 델리게이트콜(Delegatecall)이 퍼블릭(public) 제어자를 호출하는 경우 심각한 보안 위험이 발생할 수 있다. 델리게이트콜은 일종의 메시지 호출 함수로서 타깃(target) 주소의 코드가 호출하는 컨트랙트 상황에서 실행되는데, 이 때 호출을 당하는 함수의 제어자가 퍼블릭(public)으로 설정되어 있으면, 누구든지 접근권한을 가질 수 있어서 심각한 보안 문제가 발생할 수 있다.
실제로 위 보안 취약점을 악용하여 2017년 7월 20일 이더리움의 공동 창시자인 개빈 우드(Gavin Wood)가 만든 이더리움 지갑인 패리티(Parity)가 해킹을 당해, 3,200만 달러(약 350억원)에 달하는 이더리움을 해커에게 도난당하는 사건이 발생했다.[2]
리엔트런시 문제
리엔트런시(reentrancy) 또는 재진입(再進入)이란 하나의 거래를 요청한 후 아직 그 거래가 처리되기 전에 다시 새로운 거래를 요청함으로써 이중 처리를 유도하는 공격 방법을 말한다. 예를 들어, 송금자의 잔액이 500만원인 경우 일단 콜(call) 함수를 사용하여 500만원을 인출하는 거래를 요청한 후 아직 그 거래가 처리되기도 전에 다시 500만원 인출을 요청하는 콜을 또 보내는 공격을 시도할 수 있다. 이때 스마트 컨트랙트 시스템은 첫번째 콜에 대해 잔액이 500만원이 있으므로 해당 콜을 처리하려고 시도하는데, 이 시도가 실제 수행되기도 전에 다시 500만원 인출을 요구하는 콜이 들어오면 이 때도 잔액이 500만원이 있으므로 충분하다고 판단하여 결국 두 개의 인출 요청을 모두 처리해 버리는 오류이다. 리엔트런시 문제를 막지 못하면 결국 이중지불 문제가 발생하게 된다.
이 리엔트런시 취약점을 악용해 2016년 6월 더 다오(The DAO) 해킹 사건이 발생했다.[3] 이 해킹 수법은 이후 적절한 코드 수정을 통해 방지할 수 있었으나, 이미 발생해 버린 더 다오 해킹 사건으로 인해, 이더리움 진영은 이더리움과 이더리움 클래식이라는 두 가지 종류의 암호화폐로 하드포크를 해야 했다.
짧은 주소 공격
짧은 주소 공격(short address attacks)은 트랜잭션 내의 타깃 주소가 짧을 때 발생할 수 있다. 이더리움 플랫폼은 짧은 주소에 대해 트랜잭션을 무효화하는 대신에 해당 주소의 끝에 0을 추가한다. 이 지식을 이용해 해커는 실제 잔액보다 훨씬 큰 금액에 대해 송금을 실행할 수 있다.
예를 들어, 송금자의 서명이 16진수로 "a0308bf7"이고, 수신자의 지갑 주소가 16진수로 "12345600"(뒤에 0이 두 개)이고, 송금자의 잔액이 16진수로 "00000020"(즉, 10진수로 32)라고 가정해 보자. 원래는 이 세 개 값을 연결하면 앞에 0x를 붙여서, "0xa0308bf71234560000000020"이 되어야 한다. 하지만 공격자가 고의로 수신자의 지갑 주소에서 마지막 영(0) 두 개를 제외하고 123456의 여섯 자리만 입력하게 되면, 이 세 개 값을 연결한 트랜잭션 데이터는 "0xa0308bf712345600000020"가 된다. 이 트랜잭션 데이터는 전체 자리수에서 2개가 부족한 짧은 값이기 때문에, 이더리움 가상머신(EVM)은 해당 트랜잭션을 무효화하는 대신 맨 뒤에 0을 두 개 추가하여, "0xa0308bf71234560000002000"로 값을 변환하게 된다. 그 결과 송금자의 잔액이 16진수로 "00002000"(즉, 10진수로 8,192)가 되어 원래 있었던 잔액 32보다 훨씬 더 큰 금액을 수신자의 지갑으로 송금할 수 있게 된다.
이 짧은 주소 공격 문제는 골렘(Golem) 개발팀에 의해 발견되었다. 짧은 주소 공격을 방어하려면, 데이터의 크기가 짧은 경우 예외 처리를 하도록 해야 하고, 송금 전에 반드시 유효성 검사를 해야 한다.
잔액 조건 무효화 공격
스마트 컨트랙트를 작성할 때, 일정한 금액 이상의 잔액(balance)이 있는 경우에만 특정 코드가 실행되도록 할 수 있다. 예를 들어, 온리난제로밸런스(onlyNonZeroBalance) 함수의 경우 잔액이 0이 아닌 경우에만 해당 코드를 실행한다. 이 때 해커는 해당 계정에 강제로 일정한 금액을 송금하여 잔액을 증가시킨 후, 원래 실행할 수 없었던 코드를 강제로 실행시킬 수 있다. 이러한 공격을 방지하기 위해 폴백(fallback) 함수를 사용하여 컨트랙트가 이더 코인을 받을 수 없도록 하였으나, 해커는 셀프디스트럭트(selfdestruct)를 이용하여 해당 컨트랙트의 폴백 함수가 실행되지 않도록 무효화함으로써, 이더를 송금할 수 있게 되었고, 그 결과 잔액을 증가시켜서, 특정 코드를 실행할 수 있게 된다.
이러한 잔액 조건 무효화 공격을 피하기 위해서는 코드를 작성할 때, 특정한 잔액 조건을 보호장치로 사용하지 않아야 한다.
도스 공격
도스(DoS; Denial of Service) 공격이란 불필요한 트래픽을 유발하여 원래 정해진 서비스 제공을 거부하도록 만드는 공격이다. 도스 공격을 통해 스마트 컨트랙트를 무력화시킬 수 있는 방법은 다양하다. 예를 들어, 트랜잭션 비용 부풀리기, 트랜잭션 승인을 위해 특정 권한 요구하기, 컨트랙트를 무한루프(loop)에 가두기 등의 방법이 있다. 이러한 문제를 해결하기 위해서는 지속적 보안이 필요하다.
다양한 보안 취약점
코드 재사용
취약점 전파의 주요 이유 중 하나가 '코드 재사용' 때문이다. 흔히 2가지 형태로 코드를 재사용하는데, 첫째는 개발 단계와 컨트랙트 실행 단계에서의 완전 재사용, 둘째는 포크와 특정한 압축된 코드 파일로부터 시작하거나 '복사 및 붙여넣기' 등의 부분적 재사용도 취약점의 원인이 될 수 있다. 보통 완전 재사용을 위해서는 솔리디티 프로젝트를 MPM 모듈을 통해 개발하는 게 보편화되어 있다. 혹은 컨트랙트 초기 배포 단계에서 외부 컨트랙트의 주소를 가지고 와서 객체(object)에서 활용하기도 한다. 중요한 것은, 하나의 컨트랙트 코드가 취약하다는 전제에서, 하나라도 잘못된다면 그것을 가져다가 사용하는 모든 사람들은 익스플로잇에 노출된다는 점이다.
취약점(vulnerability)과 익스플로잇(exploit)은 다르다. 취약점은 임의의 공격자가 허락받지 않은 기능을 수행할 수 있게 하는 프로그램 상의 약점이다. 반면 익스플로잇은 임의의 공격자가 취약점을 통해 허락박지 않은 기능을 수행하는(발현되는) 것이다. 부분 재사용도 마찬가지이다. 부분적 코드가 취약하다면, 사용자 모두가 그 위협으로부터 벗어날 수 없다고 한다. 포크의 경우, 새로운 프로젝트를 특정 시점의 소스 코드로 개발을 시작하고, 이러한 자식 프로젝트는 부모 프로젝트의 상당 수 코드를 포함하고 있기 때문에 취약점이 남아있을 확률이 높다는 것이다. 코드 재사용이 나쁜 것만은 아니다. 전략적인 블록체인 개발을 위해 가져다 쓸 수밖에 없으며 또 유지보수 전략 차원에서도 많이 사용하는 패턴을 사용하면 수월해지기 때문에 코드를 재사용하는 것이 유리하다. 하지만 문제는 원본 소스에 보안 취약점이 발현하여 패치가 되더라도 안드로이드, 타이젠 등에 취약점이 전파되고, 최종적으로 여러 기기에까지 취약점이 전파된다는 것이다. 취약점이 제품에 반영되기까지 평균 8개월 정도로 오랜 시간이 걸린다. 취약점 전파는 주의하면 어느 정도 해결이 되지만 구조적 해결은 쉽지 않다.
뒤늦은 보안 검수
일반적으로 소프트웨어를 개발하는 형식은, 설계를 하고 코드를 짜고 동료들과 커밋과 코드 리뷰를 주고받으면서 지속적인 업데이트를 하고, 품질관리와 Intergration과 같은 테스트를 하다가 배포 직전에 보안 검수를 받게 되는데, 이러한 형식의 개발은 유지보수 비용이 많이 든다. 취약점을 빨리 발견할수록 더 적은 비용이 소모되기 때문에 설계 단계에서부터 어떤 새로운 취약점이 있는지를 살펴보아야 한다. 안전하지 못한 컨트랙트의 보안은 어렵기 때문에 배치 전 가능한 보안을 확보하기 위해 포괄적인 단위 테스트 선택이 필요하다. 그리고 개발자는 코드를 작성하기 전에 언어, 컴파일러, 알려진 보안 위험을 심도 있게 검토해야 한다. 또, 컨트랙트 내용이 복잡할수록 오류가 포함될 가능성이 높아진다. 따라서 스마트 컨트랙트에 포함된 로직은 항상 최소화하고 스마트 컨트랙트의 거동에 대한 명확한 사양이 있어야 한다.
스마트 컨트랙트 환경 자체
스마트 컨트랙트는 일반적으로 패치가 불가능하고, 모두가 같은 실행 환경을 가지고 있으며 모든 거래를 추적할 수 있다. 게다가 스마트 컨트랙트는 현금화 가능한 이더리움라는 재화를 가지고 있다. 문제는 이 모든 특징이 해커에게 유리한 환경을 제공한다는 것이다. 패치가 불가능하기 때문에 취약점이 남아있다면 계속해서 해킹할 수 있는 단서를 제공하는 것이고, 모두가 같은 실행 환경을 가지고 있다는 것은 해커의 접근성이 올라간다는 것이다. 무엇보다 컨트랙트가 현금화 가능한 이더(Ether)라는 재화를 가지고 있다는 것은 해커의 강력한 동기 부여가 된다. 실제 이더스캔에 등록되어 있는 검증된 컨트랙트를 다운받아 컨트랙트 수준의 재사용 현황을 살펴보면, 완전히 동일한 컨트랙트가 많이 존재한다. 토큰위자드 등의 편리한 서비스를 활용해서 각자만의 토큰을 만들고 있는 상황인 것이다. 함수 수준의 재사용을 살펴본 결과, 세이프매쓰(safemath)라는 함수를 가장 많이 사용하고 있고, 취약한 함수에서 일부 수정을 했던 코드상에서도 취약점이 발견되고, 이로 인해 익스플로잇 가능한 코드들이 다수 존재한다.
보안 취약점 사례
이더리움의 스마트 계약이 보안 취약점을 가지고 있다는 문제가 계속 제기되고 있다. 2018년 싱가포르 국립대학교(National University of Singapore)와 런던대학교(University College London)의 연구를 통해 이더리움 네트워크에서 3만 4,000개 이상의 취약한 스마트 컨트랙트가 발견됐다. 버그 바운티에는 발견된 여러 취약점들이 올라오는데, IBM 리서치 연구원들이 제우스(ZEUS)라는 이름으로 발표한 논문에 따르면, 현재 배포된 스마트 컨트랙트 중에서 그들의 분석기로 분석한 결과, 약 95%에 달하는 스마트 계약이 하나 이상의 취약점을 가지고 있다고 한다. 문제는 이러한 취약점이 취약점으로 끝나는 게 아니라 실제 해킹 사건으로 이어지고 있다는 데 있다.
보안 업체
각 회사가 개발한 스마트 컨트랙트를 검증받고자 하는 수요가 늘어나면서, 이더리움 스마트 컨트랙트에 대한 보안 검증 업체들이 하나씩 생겨나기 시작했다.
- 수호(Sooho) : 스마트 컨트랙트 전문 보안 회사로서, 자동화된 코드 보안 검수 서비스, 매뉴얼 서비스를 제공하고 있다.
- 퀀트스탬프 : 이더리움 스마트 컨트랙트를 검증하는 자동화된 프로토콜이다. 퀀트스탬프는 크게 두 부분으로 구성돼 있는데, 하나는 스마트 컨트랙트를 감사하는 웹 기반 자동 검증 시스템이고, 다른 하나는 스마트 컨트랙트에 있는 오류를 찾는 사람들에게 보상을 주는 자동 보상 시스템이다. 퀀트스탬프는 현재 베타 버전을 출시한 상태다. 퀀트스탬프 홈페이지에서 회원가입 후, 검토 받고자 하는 이더리움 기반 토큰의 컨트랙트 주소를 입력하면 5분 이내로 결과를 확인할 수 있다. 퀀트스탬프 메인넷은 2019년 8월경에 출시될 예정이다.
- 해치랩스(Haechi Labs) : 스마트 컨트랙트를 검증해 보안성을 높이는 전문 업체다. 스마트 컨트랙트에 보안 취약성이 존재하는지 점검하고, 백서에서 서술한 내용대로 구현되었는지 살피는 서비스를 제공한다. 특히 해치랩스는 스마트 컨트랙트를 적용한 디앱들이 서비스 발표 이후에도 꾸준히 업데이트할 수 있도록 비습(VVISP)이라는 스마트 컨트랙트 개발 툴을 제공한다.
- 카스퍼스키랩(Kaspersky Lab) : 러시아 모스크바에 있는 IT 보안 솔루션 전문업체이다.
각주
- ↑ Loom Network Korean, 〈스마트 컨트랙트를 어떻게 보호할 것인가: 솔리디티의 6가지 취약점 및 대비책 (1부)〉, 《미디엄》, 2018-09-22
- ↑ 정세윤 기자, 〈이더리움 Parity 지갑 해킹...이더리움 창업자들 무능.도덕성 논란〉, 《국제신문》, 2017-07-20
- ↑ Dan Swinhoe, 〈블록체인의 스마트 컨트랙트란 무엇인가, 그리고 보안〉, 《IT월드》, 2018-10-17
참고자료
- Loom Network Korean, 〈스마트 컨트랙트를 어떻게 보호할 것인가: 솔리디티의 6가지 취약점 및 대비책 (1부)〉, 《미디엄》, 2018-09-22
- 정세윤 기자, 〈이더리움 Parity 지갑 해킹...이더리움 창업자들 무능.도덕성 논란〉, 《국제신문》, 2017-07-20
- Dan Swinhoe, 〈블록체인의 스마트 컨트랙트란 무엇인가, 그리고 보안〉, 《IT월드》, 2018-10-17
- 김수찬 기자, 신용수 기자, 〈아이콘루프 ‘루프체인’ 보안 취약점 발견…코인, 휴짓조각 가능성〉, 《한국블록체인뉴스》, 2019-01-22
같이 보기