kupl / VeriSmart-benchmarks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

VeriSmart에서 N/A로 판정된 CVE에 대해 질문이 있습니다.

kimdora opened this issue · comments

안녕하세요, VeriSmart에서 N/A로 판정된 CVE에 대해 질문이 있습니다.

VeriSmart 페이퍼에서 CVE 2018-13113과 CVE 2018-13326은 실제로 safe하다고 되어 있습니다. 제가 생각했을 때 그 이유는 totalSupply 크기만큼만 토큰이 유통되기 때문에 balance[to]+=amount 부분에서 integer overflow가 날 수 없다고 생각했는데요.

그렇다면 CVE 2018-13144 및 CVE 2018-13327 또한 이와 같은 이유로 N/A로 판정이 되어야한다고 생각하는데, CVE 2018-13113과 CVE 2018-13326만 N/A로 판정된 이유가 궁금합니다.

안녕하세요, 저희 연구에 관심가져주셔서 감사합니다.

우선 안전한 경우부터 살펴보겠습니다. 예를 들어, CVE-2018-13326 의 경우, 생성자에서 토큰 발행량을 10000000000000000000000000000 이라는 구체적인 숫자로 한정하고 있습니다. 이로 인해, line 50 과 line 60에서, 아무리 커야 10000000000000000000000000000 보다 작은 숫자들끼리의 덧셈 연산이 행해지게 됩니다. 이 연산들은 unsigned 256-bit에서 행해지고 있으므로 오버플로우가 발생하지 않습니다.

반면, CVE-2018-13144, CVE-2018-13327 의 경우, 생성자 함수에서 토큰 발행량이 배포자의 설정에 따라 (_initialAmount 에 전달되는 값) 달라질 수 있습니다. 극단적으로는 0xfff...ff로 설정될 수도 있겠습니다. 이 경우, CVE-2018-13327 컨트랙트의 line 35에서 _value=1일 때 오버플로우가 발생할 수 있습니다.
(참고로 line 27은 오버플로우가 발생하지 않습니다; 따라서 논문에서 "partly incorrect" 하다고 표현)

생성자 함수에서 _initiaIAmount이 극단적으로 0xfff...ff로 설정되었다고 가정하겠습니다. 이 경우 컨트랙트에서 유통되는 토큰의 총량이 0xfff..ff이기 때문에 line 35에서도 오버플로우가 날 수 없다고 생각했는데요. line 27과 line 35의 차이가 무엇인가요?

덧셈과 뺄셈의 연산 순서에 차이가 있습니다 (transfer: 뺄셈->덧셈, transferFrom: 덧셈->뺄셈).

line 35 에서 _from=_to=컨트랙트 배포자(생성자 내의 msg.sender)이고 _value=1 로 주어졌을 때, 0xfff..ff + 1 이므로 오버플로우가 발생합니다.

아하, 제가 순서를 놓쳤군요. 이해되었습니다.

친절한 설명 정말 감사합니다. !!