"스마트 컨트랙트, 보안오류 피하려면 반복검증 필수"

이진호 헥슬란트 블록체인 개발자, 이드콘 2019 발표서 강조

컴퓨팅입력 :2019/05/27 15:28    수정: 2019/05/28 14:09

"스마트컨트랙트의 보안 취약점은 코드 조건문을 잘못 쓰거나, 블록체인의 특징을 간과하고 기존 소프트웨어 개발 방식으로 만들 때 발생합니다. 따라서 반드시 검증 과정을 거치고, 자신이 짠 코드를 100% 믿지는 말아야 합니다."

이진호 헥슬란트 블록체인 개발자는 27일 서울 삼성동 코엑스에서 열린 '이드콘 한국 2019' 행사에서 스마컨트랙트 보안 취약점에 대해 이같이 말했다.

오는 28일까지 코엑스에 열리는 '이드콘 한국 2019'는 비영리 이더리움 개발자 컨퍼런스다. 이날 첫 강연자로 나선 이진호 개발자는 '스마트 컨트랙트 보안 취약점'을 주제로 발표했다.

이진호 헥슬란트 블록체인 개발자 (사진=지디넷코리아)

그는 스마트컨트랙트 보안 취약점이 생기는 이유를 크게 세 가지로 요약했다. ▲예외 케이스 처리 미흡 ▲논리적인 오류 ▲블록체인에 대한 이해 부족 등이 그가 꼽은 3대 이유다.

이 개발자는 예외 케이스 처리 미흡의 대표적인 사례로 얼마전 암호화폐 거래소에서 발생했던 문제를 소개했다.

2017년 10월 비잔티움 하드포크가 진행되면서 이더리움 기반 암호화폐 거래내역을 볼 수 있는 이더스캔 사이트에는 트랜잭션 성공 여부를 표시하는 'Status'라는 항목이 새로 생겼다. 비잔티움 하드포크 이후에 설립된 거래소는 해당 항목을 적용했다.

그런데 트랜잭션 상태(Tx Status) 표시 방법이 미흡한 데서 문제가 생겼다.

잔액보다 더 큰 금액을 전송할 경우엔 '되돌아가기(revert)'를 하는 게 일반적이다. 그런데 'return false'란 값으로 종료되도록 설계됐다. 그 때문에 리턴 결과값은 토큰 전송실패지만, 'Status' 항목엔 '성공'으로 표시됐다.

그러다보니 거래소에선 실제 입금 여부를 확인하지 못하고 처리하는 사례가 발생했다. 리턴값을 보지 않은 채 트랜잭션 상태만 확인하면서 생긴 문제였다.

이진호 씨는 "해커들이 이러한 취약점을 발견하고 거래소를 공격해 특정 토큰의 가격이 떨어지는 덤핑이 발생한 적이 있다"며 "이건 거래소의 문제지만 개발자의 문제가 아니라고도 할 수 없다"고 설명했다. 트랜잭션 상태가 '실패'로 처리되도록 설계했으면 생기지 않을 문제였기 때문이다.

그는 이어 "이제는 대부분의 거래소가 해당 문제를 해결한 솔루션을 쓰기 때문에 이와 같은 문제는 잘 일어나지 않는다"고 덧붙였다.

논리적인 오류 결함 사례도 소개했다. 이진호씨는 "스마트컨트랙트의 문제는 한 번 배포된 코드는 수정하기 어렵다는 것"이라며 "그래서 문제가 없는지 배포하기 전에 확인하는 게 반드시 필요하다"고 강조했다.

그는 "'나만 할 수 있고, 넌 할 수 없다'라는 조건문을 '나만 할 수 없고, 넌 할 수 있다'라고 잘못 써버리게 되면 매니저는 접근하지 못하게 되고 일반 이용자들이 접근하게 되는 경우가 발생한다"고 설명했다.

이어 "조건문 중 한 글자만 바꿔도 해결되는 문제였는데, 이런 걸 놓치고 가는 문제가 생각보다 많다"고 덧붙였다. 그는 "정신없는 상태에서 개발하다 보면 이런 실수를 한다"고 강조했다.

마지막으로 보안 취약점이 발생하는 경우는 블록체인의 특징인 네트워크 사용 수수료(가스비) 문제를 간과한 경우다. 그는 "감사(audit)를 진행할 땐 코드상 문제가 없었는데, 나중에 보니 가스비 문제가 생기는 경우가 있다"며 "블록체인이 갖고 있는 특징을 이해해야 한다"고 말했다.

블록체인상에서 어떤 트랜잭션을 처리할 때는 네트워크 사용 수수료인 가스비를 지불하게 된다. 여기서 가스비가 정해진 한계를 초과하게 되면 문제가 발생하는데, 해커는 이런 취약점을 이용해 가스비를 올려놓고 루프를 돌려 거래소의 트랜잭션을 막을 수도 있다.

이진호 씨는 예를 들어 설명했다.

"A가 B한테 토큰을 보낼 때 일정기간 매매하지 못하도록 락(lock)을 걸어 보낸다고 가정해보자. 이 때는 언제 해당 토큰의 락이 풀리는지 리스트에 저장된다. B는 토큰을 사용할 때마다 락에 걸렸는지를 확인해야 한다. 그런데 다량의 토큰을 계속해서 조회하게 되면 가스 리밋(gas limit)을 초과하게 되고 그러면 문제가 발생한다."

그는 "이를 해결하려면 생성되는 리스트에 제한을 두거나, 아무나 락이 걸린 토큰을 전송할 수 없도록 락업을 거는 권한에 제한을 두는 방법 등이 있다"고 덧붙였다.

그렇다면 이런 코드를 짜는 과정에서 발생하는 보안 취약점을 없앨 수 있을까.

이진호 씨는 "테스트는 선택이 아닌 기본"으로 "빨리 출시하기 위해서 테스트를 놓치고 가는 경우가 있는데, 반드시 검증과정을 걸쳐야 한다"고 말했다.

관련기사

이어 "자신이 설계한 기능만 테스트하는 건 의미가 없다"며 "정상적인 값을 넣었을 때 정상적인 결과값이 나오는지 확인하는 파지티브 테스트뿐 아니라, 비정상적인 값을 넣을 때 예외처리가 되거나, 문제가 없는지 확인하는 네거티브 테스트도 필요하다"고 강조했다.

또 항상 업데이트되는 기술에 관심을 갖고 개발할 때 어떤 점을 주의해야 하는지 알아야 하며, 자신이 짠 코드라도 다르게 동작할 수 있기 때문에 완전히 믿지 말 것을 당부했다.