앞으로 가능하면 블로그 글을 작성해보려고 한다.
최근에 다시 시작한 One Bug Per Day다.
One Bug Per Day 가 먼가
OneBugPerDay - One Bug per day sent to you daily
One Bug Per Day sent directly to your inbox
www.onebugperday.com
메일링 리스트 등록 해두면 매일 하나씩 web3관련 버그를 보내준다.
보통 code4rena에 컴페티션에서 발견된 버그 리포트들이 오는데 최근에는 recon audit? 이란데서 작성한 리포트도 왔었다.
보는 방법이 딱히 정해져있는건 아니지만 추천하는 방법은 다음과 같다.
1. 버그 리포트 title과 프로토콜 이름만 볼 것.
2. 프로토콜 이해를 우선적으로 한 뒤 title을 보고 어떤 버그가 있을지 가설을 세워볼 것.
3. 리포트를 보지 않고 코드를 분석해 가설과 일치 하는지 Root Cause 분석을 해볼 것.
4. 리포트를 보고 내가 세운 가설과 실제 버그를 비교해볼 것.
위 단계 처럼 정보를 최대한 제한해서 추리하듯이 하면 재밌기도하고 도움도 더 되는 것 같다.
내 생각과 동일한 내용으로 동기분이 작성한 아티클이 곧 Upside Article로 올라오니 참고 바랍니다. (링크는 업로드 되면 첨부)
오늘의 버그
revolution protocol에서 발생한 취약점이다.
Revolution Protocol은 커뮤니티가 투표로 선정한 예술 작품을 VerbsToken(ERC-721)으로 민팅해서 경매하는 프로토콜이다.
title : 입찰자 (Bidder)는 donations 를 통해서 이미 종료된 경매에서 VerbsToken을 얻을 수 있다
가설 : 경매가 종료된 이후에도 donation을 통해 컨트랙트 잔액을 채우면 이미 끝난 경매의 NFT를 낙찰 받을 수 있는 걸까?
문제 :auctionHouse.sol의 _settleAuctoininternal 함수에서 경매 settlement 시 NFT를 bidder에게 줄 지 burn 할 지 판단하는데 address(this).balance < reservePrice로 체크한다.
즉, 컨트랙트에 지금 얼마가 들어있나?를 기준으로 체크하는거다.
address(this).balance로 할 경우 donation attack으로 조작이 가능해지는데
악용은 다음과 같은 방법으로 가능하다.
- 공격자가 낮은 금액으로 입찰을 함.
- 경매 도중 Owner가 reservePrice를 올림 -> 이러면 공격자의 입찰금은 reservePrice보다 낮아질 것
- 정상적으로는 공격자의 입찰은 부족하므로 NFT가 burn 되어야 함.
- 하지만
_settleAuction은address(this).balance)를 체크하기 때문에 ETH를 강제 전송하는 donation attack으로 컨트랙트 잔액을 채워 넣으면 reservePrice를 넘긴 것 처럼 보임. - 공격자가 토큰을 가져가고 지급은
_auction.amount를 기준으로 계산되기 때문에 크리에이터와 AuctionHouse Owner는 예상보다 적은 금액을 받게 됨.