
2022년 4월 23일Chengdu Lianan Chain Bing-블록체인 보안 상황 인식 플랫폼첫 번째 레벨 제목
#1 이벤트 관련 정보
4월 23일 Solidity 개발자 foobar는 11,539 ETH(3,400만 달러 상당)가 AkuDreams 계약에 영구적으로 잠겨 있으며 개인 사용자나 개발 팀 모두 자금을 인출할 수 없다고 트윗했습니다. 환불이 처리된 후 각 입찰 상태를 1로 설정합니다. 따라서 사용자는 EmergencyWithdraw()를 호출할 수 없습니다. 또한 팀은 자금을 받을 수 없으며 이는 기본적으로 파괴에 해당합니다.
Chengdu LianAn 기술 팀은 즉시 분석을 수행했습니다.
취약한 계약:
0xf42c318dbfbaab0eee040279c6a2588fa01a961d
#2 취약점 분석
취약점 1:
취약점 1:
1. 첫 번째 계약 허점은processRefunds, 디자이너는 refundProgress 카운터에 따라 순환 환불을 수행합니다.
2. 여기서 환불 작업은 call 함수를 사용하고 환불 결과를 require 판단 조건으로 사용한다.
3. 따라서 이때 공격자가 대기열에서 환불 작업을 수행하고 있는 경우 공격자에게 환불 호출이 호출되면 공격자는 폴백에서 악의적인 되돌리기를 수행하여 환불 대기열이 대기열 뒤에 있는 모든 사람은 환불할 수 없습니다.
취약점 2:
취약점 2:
이 버그는 또한 약 3,400만 달러 상당의 ETH 자산을 계약에 묶인 원인이기도 했습니다.
1. claimProjectFunds 기능에서 이 기능은 주로 프로젝트 당사자의 인출에 사용됩니다. 사용자가 출금을 완료하기 전에 프로젝트 당사자가 과도한 권한을 갖고 계약의 모든 자산을 양도하는 것을 방지하기 위해 사용자는 환불을 받을 수 없으며 모든 환불 작업은 프로젝트가 자금을 인출하기 전에 완료되어야 합니다. 비즈니스 로직 설계 측면에서 문제가 없습니다. 그러나 특정 코드 구현에서 현재 코드는 취약점 1에 취약하여 프로젝트 당사자가 자금을 인출할 수 없지만 이는 잠재적인 위험일 뿐이며 이번 자금 잠금의 원인은 이유가 아닙니다.
2. 함수에서 코드의 620번째 줄에 주의하십시오: require (refundProgress >= totalBids) 여기서 refundProgress는 얼마나 많은 사용자의 환불이 처리되었는지 나타내고 totalBids는 모든 사용자가 입찰한 NFT의 수를 나타냅니다. 사용자는 여러 NFT에 입찰할 수 있으므로 수치 비교에서 refundProgress는 totalBids보다 작을 수 있습니다.
환불 함수 processRefunds: require(_refundProgress < _bidIndex)를 살펴보겠습니다.
이 시점에서 3669인 bidIndex의 값을 살펴보겠습니다.
totalBids의 값은 5495입니다.
3. 따라서 refundProgress>=5495 및 refundProgress첫 번째 레벨 제목
#3 요약
이 사건에 대응하여 Chengdu LianAn 기술 팀은 다음과 같이 제안했습니다.
1. 개발자는 기본적인 보안 개발 의식을 가지고 스마트 계약 개발 시 주의해야 할 보안 문제에 대해 잘 알고 있어야 합니다.
2. 계약을 설계하고 구현할 때 코드 구현의 정확성에 주의를 기울이고 프로젝트가 온라인에 들어가기 전에 전문 보안 감사 회사를 선택하여 종합적인 보안 감사를 수행하여 보안 위험을 피할 수 있습니다.