2021년 1월 2일 (베이징 시간 오전 07:25), 저희의 모니터링 시스템 ThunderForecast가 yCREDIT 스마트 컨트랙트를 향한 일련의 의심스러운 트랜잭션을 보고했습니다. 이후 저희는 연구팀이 개발한 EthScope 시스템을 사용하여 해당 트랜잭션들을 분석하고, 보고된 모든 트랜잭션이 악의적임을 확인했습니다. 이 블로그에서는 공격의 세부 사항을 설명합니다.
세부 사항
이번 공격은 실제로 발행된 토큰 수량이 의도된 수량과 일치하지 않는 문제로 인해 발생했습니다. 이로 인해 공격자는 더 낮은 가격으로 훨씬 더 많은 yCREDIT 토큰을 획득할 수 있었습니다. 이렇게 획득한 토큰은 이익을 얻기 위해 판매될 수 있습니다.
취약한 함수는 StableYieldCredit 컨트랙트의 _deposit 함수에 있습니다.
아래에서는 공격 트랜잭션을 사용하여 전체 과정을 설명합니다.

공격자는 먼저 1e-8 WBTC와 331.335 yCredit 토큰을 WBTC-yCREDIT 페어 풀로 전송했습니다. 그런 다음 공격자는 StableYieldCredit 컨트랙트에 0.5 WBTC를 예치하여 공격을 시작했습니다.
구체적으로, _value는 가격 오라클 제공자 ChainLink를 기반으로 token (0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 - WBTC)의 amount (0.5)를 사용하여 계산됩니다 (480번째 줄, _value는 1466786010075). 이는 예치된 WBTC의 USD 가치를 계산하기 위한 것입니다. 그런 다음 컨트랙트는 WBTC를 예치한 사람(공격자)에게 yCREDIT 토큰 수량(_value - fee)을 전송합니다. 이는 시스템 설계상 yCREDIT의 가치가 1 USD이기 때문입니다. 공격자가 소량의 fee를 잃는 것을 제외하면 모든 것이 정상적으로 작동합니다.
또한, 컨트랙트는 예치된 WBTC를 WBTC-yCREDIT 페어 풀에 추가합니다. 이는 예치된 WBTC가 컨트랙트에 잠기면 유동성을 잃게 되기 때문입니다. 따라서 풀에 투입될 토큰 페어(WBTC 대 yCREDIT)의 가치를 먼저 계산합니다. 이 값은 _addLiquidity 함수를 사용하여 계산됩니다. 기본적으로 풀 내의 기존 준비금을 기반으로 계산됩니다. 풀에는 1e-8 WBTC와 331.335 yCREDIT 토큰만 있으므로, 계산된 amountA는 44입니다 (amountB는 1466786010075). 즉, 공격자는 44e-8 WBTC만 소비하고 (485번째 줄) 14667.86010075 - fee = 14594.52080025 yCREDIT 토큰을 얻습니다 (493번째 줄). 동시에, 소량의 WBTC (1e-8 + 44e-8)와 (331.335 + 14667.86010075) yCREDIT 토큰이 풀에 남게 됩니다.
이익을 얻기 위해 공격자는 획득한 14594.52080025 yCREDIT 토큰을 거래소에서 간단히 거래할 수 있습니다. 흥미롭게도, 이 트랜잭션에서 이익을 얻는 과정은 필요 이상으로 훨씬 복잡합니다. 다른 트랜잭션에서도 영리한 공격 전략이 관찰되었습니다.
공격에는 다음을 포함한 (이에 국한되지 않는) 일련의 트랜잭션이 관련되어 있습니다.
업데이트
2020/01/03: 취약점을 수정한 새로운 스마트 컨트랙트가 배포되었습니다.
타임라인
- 2021/01/01 23:25 UTC, 저희 시스템에 의해 공격이 감지됨
- 2021/01/02 16:20 UTC, 본 블로그 게시



