Skip to content

Latest commit

 

History

History
108 lines (56 loc) · 10.1 KB

ERC20_token_standard_vulnerability_classification.md

File metadata and controls

108 lines (56 loc) · 10.1 KB

설명

ERC20은 가장 일반적인 이더리움 토큰 스탠다드입니다 또한 최초의 토큰 스탠다드이기도 합니다.

처음의 ERC20 proposal 이 토큰 인터페이스의 정의로 자리하고 있는 점 역시 중요하다 할 수 있습니다. EIP20은 토큰스탠다드에 대한 reference의 구현을 제대로 정의하지 못하고 있습니다 . ERC20 토큰의 OpenZeppelin 구현에 대한 내용이 이 링크에 있습니다 : https://github.com/OpenZeppelin/zeppelin-solidity/tree/master/contracts/token/ERC20

ERC20 토큰 스탠다드의 구현은 토큰전송의 두 가지 방식 (1) 전송 기능과 (2) 승인 + 이체 패턴을 뜻합니다

이벤트 처리 가 프로그래밍에 있어 가장 유명하고, 표준적인 방식임을 알아야합니다. 토큰스탠다드의 경우, 토큰전송을 이벤트의 일종으로 볼 수 있습니다. ERC20의 전송 기능은 전송에 대한 조작을 허용하지 않습니다. 다시 말해, 받는 사람의 잔고가 아무도 모르는 새에 증가하는 것입니다. 받는 사람이 계약을 할 때 '전송'이 이뤄진다는 걸 알아채는 것은 불가능 합니다. 오직 '승인+이체'패턴만이 계약시 토큰을 이체할 수 있는 유일한 방법입니다.

실수를 했을 때, '전송'기능은 반드시 오류를 출력하고, 잘못된 거래를 되물립니다. 그렇지 않으면 사용자가 토큰을 잃어버리게 되기 때문입니다. 이는 프로그래밍에 있어 예외처리: https://en.wikipedia.org/wiki/Exception_handling 라는 매우 흔하고 기초적인 일입니다.

그러나 이러한 실수들은 이미 이더리움생태계에서 수백만달러의 손실을 일으켰습니다. 이에 대한 더 자세한 정보는 Lost Tokens 섹션을 읽어보시길 바랍니다.

ERC20토큰 표준은 어떻게 자금 손실을 야기하는가

예상된 트랜잭션 : 트랜잭션이 실행되면 'value'가 이동합니다. 이때 에러가 발생하면, 'value'의 이동은 일어나지 않습니다.

이더가 이동함에 있어서 이 예상된 트랜잭션은 확실하게 작동합니다. 이더를 사용하지 않는 계약에 이더를 전송할 경우 트랜잭션은 스마트컨트랙트에 의해 거절되고 value의 이동 역시 일어나지 않습니다

ERC20토큰의 경우 이 예상된 트랜잭션은 제대로 작동하지 않습니다. 토큰의 이동은 스마트컨트랙트에 의해서 거절되거나 되물려지지 않습니다. 이는 '전송'기능을 호출하는 것에 대한 조작가능성이 거의 없기 때문입니다. 이는 예측불가능한 '전송' 동작을 야기하고 예측불가능한 결과를 일으킵니다. 즉, 사용자의 자금손실을 일으킵니다.

개발자들이 (1) "이건 버그가 아니고 유저의 실수다" 혹은 (2) "버그나 안전에 취약점이 발견된 게 아니라, 표준 ERC20 디자인의 특징이다"라고 말하는 것을 종종 들었습니다.

이제 ERC20의 특징이 왜 반박불가한 버그인건지 알려드리겠습니다

REMINDER: Also, if a "specific feature of software design" has caused losses of millions of dollars for software users, then it is an awful design at least.

(소프트웨어디자인의 특정 기능이 사용자들의 수백만달러의 손실을 야기했다면 이것은 최소한 잘못된 디자인일 것입니다.)

ERC20 토큰 표준의 버그에 대한 설명

소프트웨어 버그에 대한 정의: https://en.wikipedia.org/wiki/Software_bug

이 부분을 따왔습니다:

부정확하거나 예상되지 않은 결과를 야기하거나, 의도하지 않은 방향으로 동작하는 컴퓨터 프로그램이나 시스템이 있다. 소프트웨어 버그는 이들의 오류, 결함, 실패 혹은 잘못을 말한다.

전송 기능의 의도는 토큰을 전송하기 위함입니다.

ERC20 토큰 표준에서 어떻게 전송기능이 명시됐는지 알아봅시다 :

transfer
function transfer(address _to, uint256 _value) returns (bool success)

Send _value amount of tokens to address _to

"의도하지 않은 계약이나 주소에 토큰을 보낸다면, 그 토큰은 영원히 사라진다."라는 구절은 없습니다. 우리는 이더리움의 스마트컨트랙트에 대해 이야기하고있다는 것을 기억해야 합니다. 이더 트랜젝션에서 트랜젝션이 부정확하게 호출될 때면, (수신자는 트랜잭션을 조작할 수 없거나, 이더가 작동하지 않는 계약을 하게 된다.) 에러는 송신되고 트랜젝션은 기각됩니다.

그러므로 예상된 결과는 참여자가 트랜젝션을 조작할 수 없다는 조건 하에 에러가 발생했을 시에, 트랜젝션은 기각됩니다.

보통 이더리움 유저들은 이더 트랜젝션에 익숙합니다. 결과적으로 예상된 행동은 토큰 전송이 불분명하게 호출됐을시에(수신자는 트랜잭션을 조작할 수 없거나, 이더가 작동하지 않는 계약을 하게 된다.) 반드시 에러가 호출돼야한다는 것입니다.

프로그램 에러의 특징인 "... 부정확하거나 예측되지 않은 결과가 나온다, 혹은 의도되지 않은 방식으로 동작한다."라는 구절은 이 문제에 가장 중요한 부분입니다. 이 경우 "ERC20 전송 버그"는 '전송'기능의 예측되지 않은 동작인 것입니다.

몇몇 개발자들은 이것이 제 개인적인 주장이라고 할 수 있을 것입니다. 하지만 우선 소프트웨어 취약성에 대한 정의를 깊이 살펴봅시다. :https://en.wikipedia.org/wiki/Vulnerability_(computing)#Software_vulnerabilities

이 부분을 보겠습니다:

소프트웨어가 취약해지는 잘못의 일반적인 유형은 아래를 포함한다: ... 피해자 비난하기 사용자에게 충분한 정보를 주지 않고 보안에 대한 결정을 내리게 한다.

소프트웨어 취약성의 특징인 "... 사용자에게 충분한 정보를 주지 않고 보안에 대한 결정을 내리게 한다."라는 부분은 이 문제에서 중요합니다.

'전송'기능의 에러처리에 대한 부분이 ERC20토큰 표준정의에 충분히 기술돼 있지 않다는 것입니다. "주의 : 토큰을 이 기능을 통해 계약으로 전송하면 토큰이 영구적으로 손실될 수 있습니다."라는 문구는 반드시 '전송'기능의 ERC20 토큰표준 정의에 추가되어야 합니다.

"이 토큰 표준에서는 토큰을 계약으로 전송하기 위해 '전송' 기능을 호출할 수 없습니다."라는 구절 역시 ERC #20 토큰 표준의 "추상" 섹션에 추가해야 합니다.

각 토큰 및 UI 개발자가 무엇을 다루는지에 대해 알아야 하는 것입니다. 이게 바로 ERC20표준이 놓치고 있는 부분입니다.

이것이 구현된다면, 빠른 시일내에 각 토큰 개발자는 반드시 "주의 : ERC20 토큰을 사용하려 합니다. '전송' 기능을 호출해 토큰을 계약으로 보내면 토큰이 영구적으로 손실될 수 있습니다."라는 큰 붉은 배너를 띄워야합니다. 그렇지 않다면 이는 소프트웨어 취약성:사용자 인터페이스에 대한 잘못 (https://en.wikipedia.org/wiki/User_interface). 이 될 것입니다.

2017년 12월 27일에 손실된 토큰량

  1. QTUM, $1,204,273 lost. watch on Etherscan

  2. EOS, $1,015,131 lost. watch on Etherscan

  3. GNT, $249,627 lost. watch on Etherscan

  4. STORJ, $217,477 lost. watch on Etherscan

  5. Tronix , $201,232 lost. watch on Etherscan

  6. DGD, $151,826 lost. watch on Etherscan

  7. OMG, $149,941 lost. watch on Etherscan

  8. STORJ, $102,560 lost. watch on Etherscan

8개 토큰만이 예시에 보여졌습니다. 이더리움 계약은 모든 ERC20토큰에 있어서 잠재적인 함정을 갖고 있습니다. 그 뜻은 여기 보여진 것보다 더 많은 손실이 존재한다는 것입니다.

state channels, 분산형 거래, 토큰을 받는 지불 서비스와 같이 토큰을 통해 이뤄지는 계약들은 매우 위험합니다.

결론

요약을 하자면, 토큰 사용자에게 수백만 달러의 손실을 초래한 ERC20 토큰 표준의 특정 기능은 소프트웨어 버그 이며, 이것은 소프트웨어 취약성 으로 분류될 수 있습니다.

ERC20 토큰 표준 기능의 특정 기능은 예상치 못한 결과를 야기하며 소프트웨어 버그의 특성인 예기치 않은 동작을 유발합니다.

ERC20 토큰 표준은 스마트 컨트렉트의 인터페이스 기능이므로, 피해자 비난하기와 같은 인터페이스 결함이 여기에 있다고 말할 수 있습니다. 이는 소프트웨어 취약성의 특징이기도 합니다.

"버그가 아니다"라는 발언은 완전히 잘못 되었습니다. 분명히 이것은 버그이며 소프트웨어 취약성입니다. "사용자의 실수 때문이다"라는 발언역시 피해자 비난하기 의 한 종류일 것입니다.