출처:Beosin
베이징 시간 2024년 1월 30일, Beosin의 보안 위험 모니터링, 경고 및 차단 플랫폼인 EagleEye의 모니터링에 따르면 DeFi 프로토콜 MIM_Spell이 해커의 플래시 신용 공격을 받아 6백만 달러 이상의 피해가 발생했습니다. 공격자들은 현재 탈취한 자금을 이더리움으로 전환하여 두 개의 공격자 주소로 이체하고 있으며, 뷰신 KYT는 이 취약점을 분석하는 동안 지속적으로 자금을 모니터링할 예정입니다.
취약점 분석
이 사건의 주요 원인은 공격자가 프로젝트 계약이 상향 반올림 알고리즘을 사용한다는 점을 악용하여 파라미터를 를 1로 설정하여 상향 반올림 오류를 최대화하여 원장의 불균형을 초래했기 때문입니다.
컨트랙트에는 차입과 상환이라는 두 가지 기능이 있는데, 하나는 컨트랙트에서 돈을 빌리는 기능이고 다른 하나는 컨트랙트에 돈을 상환하는 기능입니다.
차입 함수는 빌릴 금액을 지정하고 비례 환산을 통해 부채 가치를 계산하여 호출자의 총 부채 가치로 업데이트합니다. 아래 그림과 같이 컨트랙트의 추가 알고리즘은 상향 반올림을 사용합니다.
이미지 src="https://img.jinse.cn/7174634_image3.png">
이미지 src="https://img.jinse.cn/7174635_image3.png">
img src="https://img.jinse.cn/7174636_image3.png">
Borrow 함수는 상환할 부채의 가치를 지정하고 상환 금액을 스케일링하여 이 계약으로 이전하여 상환 금액을 계산합니다. 아래 그림에서 볼 수 있듯이 컨트랙트의 하위 알고리즘은 여전히 상향 반올림을 사용합니다.
차입 및 상환 프로세스에 대한 이해를 바탕으로 해커가 이 취약점을 어떻게 악용했는지 살펴봅시다.
해커는 먼저 컨트랙트의 차입 금액과 부채 가치를 0과 97로 제어합니다(이 방법은 다음 섹션에서 설명합니다).
다음 단계는 차입과 상환 값을 모두 1로 설정한 상태에서 차입과 상환 함수를 계속 호출하는 것입니다. 마지막으로 차입 금액과 부채 값을 0과 120080183810681886665215049728 로 제어하여 심각한 불균형을 초래합니다.
위 코드 규칙(탄성=0, 베이스=97)에 따르면 공격자가 borrow를 한 번 호출하고 1을 전달하면 두 원장은 탄성=1, 베이스=98로 변경되고(탄성이 0일 때 값만큼 탄성이 동시에 증가), 다시 다음을 호출하게 됩니다. 빌려서 1을 전달하면 탄성=2, 기저=196이 됩니다(탄성이 0이 아닐 때 탄성은 비례적으로 동기적으로 증가).
다음으로 공격자가 리페이 함수를 호출하고 1을 전달하면 서브 함수를 호출하게 되는데, 이때 계산된 탄성은 1*1/1/196=>0이 되어야 하지만 알고리즘이 상향 반올림하여 탄성=1로 계산되므로 결과는 다음과 같이 됩니다. elastic=1, base=195, 이때 탄성은 변하지 않지만 베이스는 두 배가 되는 것을 볼 수 있습니다.
공격자는 위와 같은 방법을 여러 번 사용하면 elastic=0, base=120080183810681886665215049728이 됩니다. 결국 500만 MIM 이상의 차입을 통해 컨트랙트를 대출받게 됩니다.
함수의 문제점을 이해했다면, 공격자가 어떻게 공격을 구현했는지(트랜잭션 중 하나를 예로 들어) 살펴보겠습니다.
1. 공격자는 먼저 300,000 MIM을 빌립니다.
p>
2. 이후 공격자는 콜백 함수에서 빌린 금액과 부채의 가치를 조회하는데, 이 시점에서 240,000 및 230k.
3. 다음으로 공격자는 콜백 함수인 repayForAll 함수를 호출하여 240,000개의 MIM 토큰을 반환하여 탄력성을 매우 작게 유지합니다.
4. 다음으로 공격자는 REPAY 함수를 통해 다른 사용자의 부채를 반환하여 결국 빌린 금액과 부채 값을 0과 97로 제어했습니다.
5. 공격자는 새로운 계약을 생성하고, 빌리고 갚으라고 호소함으로써 빌린 금액과 부채 가치를 0과 97로 제어합니다. 120080183810681886665215049728.
6. 결국 5백만 MIM을 차입을 통해 빌렸다가 라이트닝 론에 반환했습니다.
펀딩 트래커
보도 시점을 기준으로 도난당한 600만 달러 이상의 자금은 모두 공격자에 의해 이더리움으로 교환되어 분산되어 있으며, 해커의 주소는 이동되지 않았으며, Beosin KYT 자금세탁방지 플랫폼은 계속해서 자금을 모니터링할 것입니다.