2022. 4. 4. 23:59, Blockchain
Time manipulation
불리는 다른 형태
- timestamp dependence
Smart Contract에서는 "현재 시각"을 사용해야하는 경우가 종종 존재한다. (ex. 게임 내부에서 특정 시간에 sale을 하려고 할 때)
Solidity에서는 block.timestamp, 혹은 now를 이용하여 현재 시각을 이용한다.
그렇다면, 현재 시각이라는 정보는 어떻게 받아와지는 것일까?
바로 miner로부터 얻어진다.
transaction이 발생할 때 time data가 들어있기 때문에 이를 이용하여 얻어진다는 점이다. 하지만, 이 또한 miner가 임의로 조작할 수 있다는 점에 유의해야 한다.
즉, 좋은 Smart Contract는 miner의 정보에 너무 의존하지 않아야 한다.
block.timestamp는 random값을 생성할 때도 사용되기 때문에, Bad Randomness와도 연관이 있다.
그럼 예시 코드를 하나 살펴보자.
function play() public {
require(now > 1521763200 && neverPlayed == true);
neverPlayed = false;
msg.sender.transfer(1500 ether);
}
위 함수의 require 문을 보면, now > 1521763200 부분이 눈에 띈다. 즉, 현재 시간이 해당 값보다 커야 함을 의미한다.
이 때, 앞에서 언급한 것과 같이 now라는 값은 최근 transaction의 timestamp를 보고 값을 가져온다.
즉, timestamp를 조작하여 transaction을 보내어서 now라는 값을 원하는 값 근처로 세팅하는 것이 가능하다.
이후 play 함수를 호출하게 되면 require문을 통과한 후, 1500ether을 받는데에 성공하게 된다.
이는 Smart Contract 내부에서 시간을 어떻게 다루는지, 그 허점을 이용한 Trick이라는 생각이 든다.
참고
'Blockchain' 카테고리의 다른 글
Smart Contract 취약점 [10] Unknown Unknowns (0) | 2022.04.05 |
---|---|
Smart Contract 취약점 [9] Short Address Attack (0) | 2022.04.05 |
Smart Contract 취약점 [7] Front-Running (0) | 2022.04.04 |
Smart Contract 취약점 [6] Bad Randomness (0) | 2022.04.04 |
Smart Contract 취약점 [5] Denial of Service (0) | 2022.04.04 |
Comments, Trackbacks