스마트 컨트랙트는 한 번 배포되면 수정이 불가능하다.
일반 소프트웨어의 경우 코드를 배포한 다음에 오류가 발견되면 이를 수정해 다시 배포하는 것이 가능하다. 하지만, 스마트 컨트랙트는 한 번 배포된 후 블록체인에 기록되면 코드를 변경할 수 없다. 코드를 수정하려면 새로운 스마트 컨트랙트를 다시 작성하고 배포하여야 한다. 다른 유형의 소프트웨어에서는 결함이 없는 코드는 있으면 좋은 것이지만, 블록체인 애플리케이션에서는 필수이다.
위와 같은 이유로 스마트 컨트랙트를 통해 디지털 자산을 만들거나, 이를 활용한 탈중앙화 서비스를 만들 예정이라면 반드시 스마트 컨트랙트 보안감사가 필요하다.
- 명세 확인
스마트 컨트랙트가 구현하고자 하는 로직에 대한 정보를 받는다. 예를 들어 백서나 백서 발행 이후 개정된 내용들에 대해 정보를 수집하는 과정 등이 있다. 이러한 작업을 통해 명세를 구체화하고, 스마트 컨트랙트가 명세에 맞게 구현되었는지 확인하기 위한 준비를 한다.
- 테스트 코드 작성
명세가 확인되었다면, 고객사로 부터 전달된 스마트 컨트랙트에 대한 테스트 코드를 작성한다. 모든 예외 상황과 라이브러리들이 올바르게 작동하는지 검증하며, 필요로 하는 조건들을 달리하여도 예외 상황을 일으키지 않는지에 대해 검사하는 작업이다.
이는 각각의 로직들이 명세에 따라 구현되었는지 확인하는 과정이 된다. 또한 명세를 통해 유추할 수 있는 사용자들의 악의적인 패턴들을 분석하는 시나리오 테스팅까지 해당 과정에서 수행된다.
- 정적 분석
테스트 코드가 작성되었고 모든 코드의 예외 상황을 점검했을 때, 정적 분석을 수행한다. 코드에는 취약점을 가지는 구현 패턴이 존재할 수 있으며, 테스트 코드로 검출되지 않는다는 특성을 가지고 있다.
TheDAO의 해킹 사례에서 공격자가 스마트 컨트랙트인 경우에 새로운 로직이 중간에 끼어들 수 있다는 점은 테스트 코드로 검출되기 어렵다. 이러한 구현 패턴은 보안 감사 도구를 통해서 검증하는 것이 훨씬 정확하다.
대부분 알려진 스마트 컨트랙트 코드의 취약점들은 Smart Contract Weakness Classification(이하 SWC)라는 이름으로 잘 정리되어 있다. 이 중에서 분석되어야 하는 SWC 항목에 대해 검증하게 된다.
- 코드 디자인 리뷰 및 가스 최적화 분석
보안 취약점 분석이 끝나면 스마트 컨트랙트의 아키텍처에 대한 종합적인 분석이 진행된다. 예를 들어 상속 구조나 변수가 불필요하게 사용되었을 경우, 이를 해결할 수 있는 방법을 보고서 내용에 추가한다.
또한 시뮬레이션을 통해 해당 스마트 컨트랙트가 메인넷에서 실행될 때 얼마나 많은 가스를 소모하는지 분석한다. 또한 이를 최적화할 수 있는 방안에 대해서도 제안한다.
- 보고서 발행
보안감사 대상 코드에서 취약점과 버그가 발견된 경우, 문제가 되는 코드 영역을 보안 이슈 레벨에 따라 분류하고 수정 방안에 대해 제안하는 내용을 보고서에 담는다.
테스트 코드가 모든 예외 상황에 대해 검사를 마쳤다는 내용과 정적 분석을 통해 감지해야 하는 알려진 이슈들에 대한 통과 여부를 체크리스트로 표시한다. 해당 내용이 담긴 1차 보고서는 고객사에게 전달된다.
- 최종 보고서 발행
고객사는 취약점이나 버그가 발견된 코드를 수정해 다시 보안감사 서비스 제공자에게 코드를 보낸다. 보안감사 서비스 제공자는 고객사의 수정된 코드를 확인하여 수정된 코드에 대해 새로운 취약점이나 버그가 없는지 확인 후 해당 취약점이 해결되었다는 최종 보고서를 발행하여 고객사에게 전달한다.
스마트 컨트랙트 보안감사는 위와 같이 크게 6가지 과정을 통해 진행된다.