당신이 실행시키는 트랜잭션 과연 안전할까요?
내가 안읽어본 계약서에 도장을 찍고 있었다고?
기본적으로 트랜잭션에 서명을 한다는 것은 계약서에 도장을 찍는 행위와 같다. 내가 모르는 트랜잭션에 서명을 한다는 것은 내가 모르는 계약서에 도장을 찍는다고 볼 수 있다. 그래서 우리는 아래 그림처럼 이쁘게 verified된 컨트렉트를 통하여 안전하게 거래를 할 수 있다.
출저 : 오르빗체인 컨트렉트https://etherscan.io/address/0x1bf68a9d1eaee7826b3593c20a0ca93293cb489a#code
하지만 스마트컨트렉트가 바이트코드 형태로 배포되고 verify가 의무화 되어 있지 않기 때문에 아래 그림과 같이 컨트렉트 코드가 공개되어 있지 않은 경우도 많다. 그런 컨트렉트의 경우 코드가 나와 있지 않고 바이트코드 형태로만 보인다. 한마디로 읽을 수 없는 계약서에 사인을 해야하는 경우가 생긴다는 점이다. 이러한 과정에서 리버스엔지니어링이 필요하거나 보안 검사가 필요한 경우 바이트코드만 알고 소스코드를 알기 어려운 문제점이 존재한다.
예시를 보겠다. 다음은 트랜잭션에 있는 data 공간이다. 이더스캔을 열어보면 이런식으로 bytecode가 들어있다. 이러한 bytecode가 EVM에 들어가면 스마트 컨트렉트가 실행되게 된다.
이러한 함수를 조금 더 보기 쉽게 바꿔보겠다. 먼저 각 함수마다 Method ID가 있다. 이러한 MethodID 는 맨처음 해시를 하여 암호화한 function signature를 4byte로 바꾼 암호문이 나타낸다. 그 뒤의 데이터들은 input 값이 들어오게 된다. 따라서 아래와 같이 분석을 할 수 있다.
이런식으로 공개된 소스코드의 경우 바이트 코드를 분석 할 수 있지만, 소스코드 없이는 이 또한 알 수 없다. 이번에 분석할 논문에서는 이러한 바이트 코드를 통하여 소스코드 없이도 원래의 funtion signature를 도출해내는 법을 설명하고 있다.
바이트코드 만으로 원래 함수를 도출해내는 방법
SigRec라는 기술은 이번 논문에서 새로 제안하는 솔루션이다. 이 솔루션은 함수의 사인을 자동으로 복구해준다. Solidity와 Vyper 두 컨트렉트에서 모두 사용이 가능하며, 소스코드나 다른 데이터베이스를 사용하지 않는다.
앞서 설명한것처럼 앞의 8자리는 함수의 id 값이다. EVM의 명령어는 크게 Call Data LOAD와 CALL DATACOPY로 나뉘며, 그 이후에 Function ID와 파라미터의 타입 몇가지가 나오는 패턴을 가진다.
uint, int, address, bool types 와 같은 Solidity 의 기본타입과 static, dynamic, nested 형태의 배열들, bytes, string, struct 이 있다. 또한 Vyper에서는 decimal, fixed-size byte array, fixed-size stsring, struct 등이 있다.
이런식으로 나올 수 있는 자료형들의 패턴을 바이트코드를 파싱하여 분석하게 되면 원래 함수에 대한 소스코드 없이도 어느정도의 도출이 가능하게 된다.
또한 바이트코드에는 type에 대한 내용이 없다. 타입의 경우 소스코드가 있거나 타입과 함수명, 변수명을 제공하는 ABI 없이는 바이트코드만으로는 원래 알 수 없다. 따라서 원래 소스코드의 내용을 알기 위하여서는 타입 추론을 해야만 한다.
이 부분에 대해서는 다음 순서를 통해 처리를 할 수 있다고 한다.
첫번째, 스마트컨트렉트랑 바이트 코드를 준비한다.
두번째, 파라미터에 타입 패턴을 수집한다.
세번째, common accessing pattern을 추출한다.
(uint 와 uint16과 같이 비슷한 패턴을 찾는것이 여기에 해당된다.)
네번째, Symbolic expression을 생성한다.
(데이터들을 symbolic expression형태로 바꿔서 분석하기 위함)
다섯째, 규칙에 대한 정리
위와 같은 5가지 과정을 통하여서 타입 추론에 대한 규칙을 자동으로 생성하게 된다.
바이트코드 만으로 원래 함수를 도출해내는 방법
위와 같이 바이트코드를 해석해서 TASE (Type-aware Symbolic Execution) 형태로 분석을 한다.
step 1) coarsed grained (러프하게 정의된) 타입을 먼저 정제된 타입으로 바꿔준다.
step 2) 입력값들의 순서와 숫자를 결정하기
step 3) 입력값과 연관된 symbol들을 소개하기
step 4) 타입 추론을 하기
이런식으로 반복되는 패턴을 분석하고, symbol 형태로 바꾸어서 원래 어떤 형태의 코드였는지를 알아낼 수 있게 된다.
어디에 쓰일 수 있을까?
- Short address attack과 같은 악의적인 공격을 탐지하는데 쓰인다.
위의 사진과 같이 주소체계를 악용하여 short address attack 같은 공격을 할 수 있다. 이러한 공격은 원래 signature를 추론하는 솔루션을 통해 방지 될 수 있다.
실제로 이 팀은 이러한 기술을 사용하여 의도적으로 악의적인 코드를 보내는 행위를 미리 포착하여 대처를 할 수 있는 parChecker 라는 기능을 vyper에 넣었다.
2. 현존하는 스마트컨트렉트 Fuzzers의 기능을 최적화 시킬 수 있다.
스마트컨트렉트의 취약성을 점검해주는 Fuzzer들은 이 기술을 통해 fuzzing strategy에 대한 패턴을 잘 파악하여 더 우수한 성능을 낼 수 있다.
3. 스마트컨트렉트 바이트코드의 리버스 엔지니어링 등을 발전시킬 수 있다.
글을 마무리 하며
블록체인 개발자로서 일을 하면서 가장 많이 듣는 요청은 “A 서비스랑 똑같이 만들어 주시면 됩니다. “ 라는 요청이다. 물론 초창기에는 크게 어려운 일이 아니였다. 그냥 ERC 20 토큰이 전부였으며, 함수이름만 봐도 open-zepplin에 있는 그 코드였기 때문이다. 하지만 이제 시간이 지나면서 프록시 배포, 거버넌스 기능, 오라클, 영지식증명 등등 다양한 개념이 컨트렉트에 들어오게 되면서 스마트컨트렉트 서비스를 파악하는 일은 점점 어려워지고 있다. 문서가 잘 나와있다면 좋겠지만 문서가 잘 나와있지 않고 심지어 이더스캔에서도 소스코드 검증이 안되어 바이트코드만 보이는 경우도 많다. 그래서 이런 기술을 분석하면서 들었던 의문은 스마트컨트렉트가 공개되어 있지 않은데, 실제로 이걸 작동이 제대로 하는지 어떻게 확신을 가지고 사인을 할 수 있을지였다.
혹시 주위에 스마트컨트렉트의 함수를 체크하고 실행하는 사람을 본적이 있는가? 사실 나도 회사를 믿고 코드를 보지 않은채 사용을 하고 있다. 블록체인의 구조를 믿어야 하지만, 사실 우리는 블록체인에 올라간 스마트 컨트렉트의 코드를 살펴보지 않으니 보지도 않고 계약서에 도장을 찍는 셈이다. 특히 NFT 민팅 등을 할때는 무슨 함수를 부르는 지도 모른채 민팅을 하게 되는 경우가 많다. 이런 초기 프로젝트들은 심지어 컨트렉트를 스캔이나 익스플로러에 공개도 하지 않는 경우도 많기 때문에 혹시라도 approve 같은 함수가 뒤에 숨어있다면? 모든 자산을 한순간에 잃을 수도 있다.
따라서 이러한 sigRec 기술은 스마트컨트렉트의 취약점 그리고, 부정거래 방지에도 쓰일 수 있으며, 기존의 코드를 공개하거나 파악하기 어려운 서비스도 어떤 코드를 써서 만들었는지 사람의 힘으로 분석하지 않아도 자동으로 유추 할 수 있게 된다. 블록체인의 본질은 투명성이기 때문에 bytecode를 해석하려는 노력은 매우 정당하며, 기술의 신뢰를 더욱 가져올 매우 중요한 키라고 생각한다. 이러한 기술이 발달하여 진정한 의미의 블록체인, 탈중앙화가 이루어지길 바라며 이번 글을 마친다.
- CURG(Crypto United Research Group)는 2018년 5월 대학(원), 기업, 스타트업 등 다양한 분야의 열정적인 블록체인-er들이 모인 연합 연구 그룹입니다. CURG는 2018년 5월 출범된 이후, ‘Trendy, Thoughtful, and Transdisciplinary’ 한 자세로 한 주도 빠짐없이 블록체인 연구를 지속해오고 있습니다.
- 디사이퍼(DECIPHER)는 “건강한 블록체인 생태계 조성에 기여한다” 라는 미션 아래 블록체인에 대해 연구하고 이를 실용적으로 응용하는 서울대 블록체인 연구 학회입니다. 2018년 3월에 처음 조직 되어 현재까지 블록체인 기술을 다방면에서 연구하고 산업계에 응용하고 있는 100명 이상의 회원들을 배출해왔습니다. 다양한 팀별 연구활동과 프로젝트, 컨퍼런스 개최, 서울대학교 블록체인 강의 개설, 유수 기업들과의 산학협력과 파트너십 체결을 해오며 국내 최고의 블록체인 학회로 자리 잡았습니다.
커그와 디사이퍼는 향후 적극적인 협력을 통해 블록체인 필드에서의 강력한 시너지를 구축하고자 합니다.
참고문헌 : Chen, Ting, et al. “SigRec: Automatic Recovery of Function Signatures in Smart Contracts.” IEEE Transactions on Software Engineering (2021).