리베스트 파이낸스 (Revest Finance) - REKT
리베스트 파이낸스에서 200만 달러가 사라졌습니다.
“잠긴 자산의 즉각적인 유동성을 제공”하는 금융 NFT 플랫폼이 재진입 공격의 피해자가 되었습니다.
리베스트 팀의 재빠른 대응은 추가 피해를 막았지만, 그들은 여전히 리더보드 (#67)의 한 자리를 차지하게 되었습니다.
어쩌다 이런 일이 발생한 것일까요?
리베스트 팀은 “블록스 DAO 개발 팀으로부터 2:24 UTC에 공격당했다는 사실” 을 전달받았습니다.
블록스 DAO 뿐만 아니라, EcoFi 와 레나 파이낸스도 많은 자금을 도난당했습니다.
RVST 토큰의 전송을 정지시킴으로써, 팀은 (70 초 후에 발생한) 유니스왑의 RVST-ETH 풀에서 RVST 토큰을 빼가려는 공격자의 시도를 무력화하여, 추가로 잃을 수 있었던 115만 달러를 지킬 수 있었습니다.
공격자가 훔친 토큰을 매도하여 BLOCKS (처음에 >95% 하락, 현재 ~80% 하락)와 ECO (~98% 하락)의 가격이 폭락하였으나, RENA는 공격자의 주소에서 건드려지지 않았습니다.
Credit: @BlockSecTeam
공격의 원인은 ERC1155 생성 컨트랙트의 재진입 취약점 때문이었습니다 (예시 tx: RENA)
mintAddressLock 기능은, 새로운 스마트 볼트를 생성하기 위해 사용되는데, 두 개의 중요한 파라미터를 가집니다: quantities 그리고 depositAmount.
리베스트 볼트는 FNFTHandler의 mint 기능을 적용하여, 수령자가 나중에 소각하여 잠긴 토큰의 포지션 비율 만큼을 클레임할 때 사용되는, quantities 만큼의 ERC1155(들)을 fnftId 를 포함하여 생성합니다. 그리고 fnftId 는 기능이 시행될 때마다 1 씩 증가됩니다.
나머지 자금은 depositAdditionalToFNFT 기능을 활용하여 FNFT에 입금될 수 있었는데, 입금 액수는 quantities 에서 정의된 양과 같아야 했습니다, 더 자세하게는: quantity==FNFTHandler.getSupply(fnftId).
만약 위의 조건이 만족하지 않을 때는, 유저의 지분은 포지션에서 추출되어 기존 포지션의 depositAmount 에 의해 정의된 양과 합쳐져 새로운 FNFT로 전송되어 새롭게 입금되었습니다.
기존 포지션의 depositAmount 이 사용되지만, fnftId (fnftsCreated 를 통해 전달된)은 생성 과정이 끝날 때까지 업데이트가 되지 않아, 이 지점에서 기존의 포지션에 추가 자금을 넣는 재진입이 가능했습니다.
단계별 과정:
1: 공격자는 mintAddressLock 기능을 사용하여 fnftId=1027, depositAmount=0, quantities=[2], asset=Rena, 그리고 recipients=[malicious contract] 파라미터로 새로운 포지션을 생성합니다. depositAmount X quantities[0] = 0 X 2 = 0 이기 때문에, 공격자는 0개의 Rena를 전송합니다.
2: 공격자는 다시 mintAddressLock 기능을 사용하여 fnftId=1028, depositAmount=0, quantities=360,000, asset=Rena, 그리고 recipients=[malicious contract] 를 파라미터로 가지는 포지션을 생성합니다. 또다시, 공격자는 0 Rena를 전송하고, 360,000 토큰 (fnftId=1028으로)을 받습니다. 이 1028-토큰들은 현재 가치가 없다는 것을 유념하세요.
3: 2번 단계의 끝에서, FNFTHandler 의 mint 단계 중에, 공격자는 onERC1155Received 인터페이스를 통해 Revest 컨트랙트로 재진입합니다. depositAdditionalToFNFT 기능은 amount = 1e18, quantities=1, fnftId=1027 파라미터로 사용되어, 원래는 fnftId=1029 (신규) 포지션이 생성되었어야 했습니다. 하지만, fnftId 업데이트의 딜레이가 생기면서, 포지션 1028은 위의 데이터로 덮어씌워 져, 공격자가 소유하는 1028의 토큰에 가치가 부여되었습니다.
4: 공격자는 withdrawFNFT 기능을 사용하여 3번 단계의 1 quantity X 1e18 Rena 만을 입금하고 360,000 X 1e18 Rena를 출금했습니다.
공식 사후 분석 보고서에 따르면 도난된 토큰(약 200만 달러어치)은 다음과 같습니다:
35만 RENA (약 1억 2500만 달러어치, 여전히 공격자의 주소에 위치)
7억 1500만 BLOCKS (약 170만 달러어치)
770만 ECO (약 10만 달러어치)
적은 양의 ($10-$12,000) ConstitutionDAO와 LUKSO도 도난당했습니다.
훔친 토큰 대부분을 ETH로 스왑한 후에, 공격자는 토네이도 캐시로 자금을 입금했습니다.
보안에 구멍이 뚫리는 것은 DeFi 프로토콜로써 절대 좋아 보이지 않지만, 특히 서비스가 다른 프로젝트의 토큰을 보호하는 역할로서 신뢰를 주어야 한다면 더욱 그렇습니다.
“하나의 오딧은 언제나 충분하지 않습니다” 라고 말하는 리베스트는, 프로젝트의 오딧 (solidity.finance)에서 취약점을 발견하지 못했습니다.
팀의 빠른 대응과 상세한 사후 분석 보고서는 좋은 징조이고, 리베스트가 "우리는 의미 있는 금전적 보상에 필요한 자금을 가지고 있지 않습니다" 라고 발표했지만, 사후 분석 보고서는 미래에 상황을 바로잡고자 하는 열망을 보여줬습니다.
지금 시점에서, 어떻게 바로잡고자 하는지는 명확하지 않습니다.
REKT는 익명 작성자들에 의한 공공 플랫폼이며, REKT에 작성된 관점이나 내용에 대해서 그 어떤 책임도 지지 않습니다.
기부 (ETH / ERC20): 0x3C5c2F4bCeC51a36494682f91Dbc6cA7c63B514C
disclaimer:
REKT는 당사 웹 사이트의 익명의 작성자 또는 REKT에 의해 게시되거나 관련된 서비스에서 게시되는 콘텐츠에 대해 어떠한 책임도 지지 않습니다. 당사는 익명 작성자들의 행동 및 게시물에 대한 규칙을 제공하지만, 익명의 작성자가 웹 사이트 또는 서비스에 게시, 전송 혹은 공유한 내용을 통제하거나 책임지지 않으며, 귀하가 웹 사이트 또는 서비스에서 직면할 수 있는 불쾌함, 부적절함, 음란함, 불법 또는 기타 해로운 콘텐츠에 대해서도 책임을 지지 않습니다. REKT는 당사 웹 사이트 또는 서비스 사용자의 온라인 또는 오프라인 행위에 대한 책임을 지지 않습니다.
추천 기사들......
포트리스 프로토콜(Fortress Protocol) - REKT
포트리스(요새)가 오라클 조작과 악의적인 거버넌스 법안으로 300만 달러를 도난당한 이후 폐허가 되었습니다. UI는 멈췄으나, 컨트랙트는 여전히 살아있습니다. 포트리스 생태계가 자금을 잃어버린 사용자들을 구제할까요?
MM 파이낸스(MM Finance) - REKT
매드 미어캣 파이낸스(미어캣 파이낸스와 다릅니다)가 DNS공격으로 200만 달러를 잃어버렸습니다. 백엔드 공격, 프론트엔드 공격, 대체 공격의 끝은 언제일까요?
새들 파이낸스 (Saddle Finance) - REKT 2
어제 새들 파이낸스에서 1100만 달러가 도난 당했으며, BlockSec의 도움으로 380만 달러를 되찾았습니다. "사용자들의 자산은 안전합니다"라고 주장했던 새들은, 나중에 안전하다고 말했던 것은 도난 당하지 않은 금액에 한한 것이었다고 정정했습니다. rekt.news는 도난 당한 1100만 달러가 안전하지 않다는 것을 확인했습니다.