SCH 강의에서 나온 2가지의 사례를 짧게 정리해보고자 한다.
만약 Oracle이 centralized되어 있다면 문제가 될 수 있다.
이 경우에 대해서 나는 당연히 고려를 하지 않았는데, 생각보다 실제 사례가 있었다.
예를 들어 하나의 admin
account에서 api를 통해 계속 price를 올려주게 된다면,
해당 admin의 pk
가 탈취될 경우, 해당 oracle을 사용하는 모든 프로토콜들이 다 망가지게 될 수 있다.
Oracle의 가격을 조작함으로서 발생할 수 있는 일인데 이번에 나온 예제가 흥미로웠다.
UniswapV2에서 가격을 조작하는 방식이였다.
function isSafeDebt(address _token, address _user) public view returns (bool) {
uint reserve0 = IERC20(token0).balanceOf(pair);
uint reserve1 = IERC20(token1).balanceOf(pair);
uint collateral; // user's collateral
if(_token == token0) {
collateral = deposited[token1][_user] * reserve0 / reserve1;
} else {
collateral = deposited[token0][_user] * reserve1 / reserve0;
}
uint allowance = collateral * 2 / 3; // 66% LTV (Loan To Value)
return allowance >= debt[_token][_user];
}
debt에서 collateral을 계산하는 방식인데 문제점이 보이는가?
pair의 reserve
가 아닌 balance
를 가져오고 있다.
따라서, attacker가 순간에 Flash Swap으로 1 wei만 남겨놓고 하나의 자산을 모두 빌려오게 되면, 해당 자산의 가격이 천정부지로 오르게 되어 1 wei 만으로도 엄청난 양의 가치를 가지게 된다.