출처:SharkTeam
2024년 1월 30일, MIM_SPELL은 정밀 계산 취약점으로 인해 650만 달러의 피해를 입는 플래시 크레딧 공격을 받았습니다.
이 사건에 대한 기술적 분석을 처음으로 수행하여 보안 예방 조치를 요약했습니다. 후속 프로젝트들이 이를 경고로 삼아 블록체인 산업을 위한 보안 방어 체계를 구축할 수 있기를 바랍니다.
I. 공격 트랜잭션 분석
공격자 주소:
0x87F585809Ce79aE39A5fa0C7C96d0d159eb678C9
공격 컨트랙트:
0xe1091d17473b049cccd65c54f71677da85b77a45
0x13AF445F81B0DEcA5dCb2Be6A4C691F545c95912
0xe59b54a9e37ab69f6e9312a9b3f72539ee184e5a
Attacked Contract:
0x7259e152103756e1616A77Ae982353c3751A6a90
Attacked Transaction:
0x26a83db7e28838dd9fee6fb7314ae58dcc6aee9a20bf224c386ff5e80f7e4cf2
0xdb4616b89ad82062787a4e924d520639791302476484b9a6eca5126f79b6d877
공격 프로세스 :
1. 공격자(0x87F58580)는 라이트닝 크레딧을 통해 300,000개의 MIM 토큰을 차용합니다.
2. 공격받은 컨트랙트(0x7259e1520)는 240,000 개의 MIM 토큰 240,000개를 전송받았습니다.
3. 공격자(0x87F58580)는 다른 사용자의 대출금을 상환하기 위해 repayForAll 함수를 호출합니다. 를 호출하여 다른 사용자의 차입금을 상환하고, 이후 탄성 변수를 0으로 줄이는 것을 목표로 다른 사용자의 차입금을 차례로 상환하기 위해 repay 함수를 호출합니다.


4. 탄성 변수가 0으로 줄어든 후 공격자(0x87F58580)는 새로운 공격 컨트랙트(0xe59b54a9)를 생성하고 탄성 = 0, base = 120080183810681886665215049728로 끝날 때까지 계속 차용 및 상환 함수 호출을 수행합니다.


5. 공격자(0x87F58580)는 차용 기능과 DegenBox 컨트랙트의 인출 기능을 호출하여 500,047개의 MIM 토큰을 빌려주었습니다.
6. 공격자(0x87F58580)는 라이트닝 대출 함수를 반환하고 4400000개의 MIM 토큰을 1807 ETH로 변환하여 이 거래에서 약 450W의 수익을 얻습니다.

두 가지 취약점
. 분석
공격의 핵심은 대출 변수 계산의 정확성에 문제가 있어 주요 변수인 탄성치와 기준값이 비례에 맞지 않게 조작되어 담보와 대출 건수 계산에 문제가 발생하고, 결국 MIM 토큰이 과다하게 대출된다는 것입니다.
공격받은 컨트랙트(0x7259e1520)의 대출 함수와 상환 함수는 모두 탄성 및 기준 변수를 계산할 때 상향 반올림을 사용합니다.
이미지 src="https://img.jinse.cn/7174988_image3.png" alt="20240131184219617image.png">
<이미지 src="https://img.jinse.cn/ 7174989_image3.png" alt="20240131184223183image.png">



공격자(0x87F58580)는 다른 사용자가 돈을 빌린 것에 대해 탄성 변수와 기본 변수를 각각 0과 97로 설정하여 다른 사용자에게 돈을 빌리는 것으로 시작합니다.

그런 다음 공격자는 차용 함수를 계속 호출하면서 매개변수 금액은 1입니다. 차용 함수를 처음 호출할 때 탄성 = 0이므로 위의 if 로직이 실행되고 추가 함수로 돌아갑니다. 그 결과 탄성 = 1, 기본값 = 98이 됩니다.
공격자(0x87F58580)는 다시 borrow 함수를 호출하여 1을 전달합니다. 탄성 = 1이므로 else 논리를 실행하고 반환값을 98로 계산하여 add 함수로 돌아올 때 탄성 = 2, 기본값은 196이 됩니다.
그러나 이 시점에서 공격자는 무엇을 해야 할지 모릅니다. p>
그러나 이때 공격자(0x87F58580)는 리페이 함수를 호출하고 1을 전달합니다. elastic=2이므로 else 로직을 실행하고 계산된 탄성 변수는 1*2/98 = 0이 되어야 하지만, 다음의 상향 반올림 단계로 인해 계산된 반환값이 1이 되므로 하위 함수로 돌아갈 때 탄성값이 1이 됩니다.
차입-상환 루프 후 탄력 변수는 변경되지 않고 기본 변수는 거의 두 배가 되는 것을 볼 수 있으며, 해커는 이 허점을 악용하여 차입-상환 함수를 자주 반복한 다음 마지막으로 다시 한번 상환을 호출하여 궁극적으로 탄력 = 0이 되도록 합니다. base = 120080183810681886665215049728.

< p>탄성 변수와 Base 변수 사이에 심각한 불균형이 있는 경우, 약간의 담보를 추가하는 공격자(0x87F58580)는 솔벤트 수정자의 제약 조건을 통과하여 많은 수의 MIM 토큰을 빌려줄 수 있습니다.

세 가지 보안 권장 사항
이 공격에 대응하려면 다음을 수행해야 합니다.
1. 정밀도 계산과 관련된 로직을 개발할 때는 정밀도와 반올림을 신중하게 고려합니다.
2. 프로젝트를 시작하기 전에 스마트 컨트랙트에 대한 전문 외부 감사팀의 감사를 받아야 합니다.
3.