2024년 5월 15일 Sonne Finance가 공격을 받아 프로젝트에서 미화 2천만 달러 이상의 손실을 입었습니다.
SharkTeam은 이 사건에 대해 즉시 기술적 분석을 수행하고 보안 예방 조치를 요약했습니다. 후속 프로젝트가 이로부터 교훈을 얻어 블록체인 산업을 위한 보안 방어선을 공동으로 구축할 수 있기를 바랍니다.
공격자: 0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
공격 계약: 0x02fa2625825917e9b1f8346a465de1bbc150c5b9
대상 계약: 0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
공격 트랜잭션: 0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0
공격 과정은 다음과 같습니다.
1. 35,569,150 VELO를 플래시 대출하고 이 VELO 토큰을 soVELO 계약으로 이전합니다.
직접 이체(기부)이기 때문에 soVELO 토큰은 발행되지 않습니다. 따라서 soVELO 계약에서 totalCash는 35,569,150 VELO만큼 증가했으며 soVELO의 totalSupply는 변경되지 않았습니다.
2. 공격자는 새 계약 0xa16388a6210545b27f669d5189648c1722300b8b를 생성하고 새 계약에서 대상 계약에 대한 공격을 시작합니다. 공격 프로세스는 다음과 같습니다.
(1) 2 soVELO를 새로운 계약으로 이전
(1) 2 soVELO를 새로운 계약으로 이전
(2) soWETH, soVELO를 담보로 선언
(3) soWETH에서 265,842,857,910,985,546,929 WETH를 빌리세요.
위의 빌림 함수 실행에서 getAccountSnapshot 함수의 반환 값을 기반으로 다음을 발견했습니다.
soWETH 계약의 경우 신규 계약잔액은 0, 대출금액은 0, 환율(exchangeRate)은 208,504,036,856,714,856,032,085,073 입니다.
soVELO 계약의 경우 신규 계약 잔액은 2, 즉 soVELO의 2wei가 담보로 잡혀 있고 대출 금액은 0이며 환율(exchangeRate)은 17,735,851,964,756,377,265,143,988,000,000,000,000,000,000입니다.
exchangeRate는 다음과 같이 계산됩니다.
1wei의 soVELO를 모기지화하면 17,735,851,964,756,377,265,143,988VELO를 초과하여 빌릴 수 없으며 265,842,857,910,985,546,929WETH를 빌릴 수 있으며 최소 265,842,857,910,985,546,9을 모기지해야 합니다. 29 soWETH,
soWETH의 가격: soWETHPrice = 2,892,868,789,980,000,000,000,
soVELO 가격: soVELO가격 = 124,601,260,000,000,000
1wei를 담보로 soVELO에서 빌릴 수 있는 WETH의 수량은 다음과 같습니다.
1 * exchangeRate * soVELOPrice / soWETHPrice = 763,916,258,364,900,996,923
약 763WETH. soVELO 모기지 1wei만으로도 이 대출을 지원할 수 있습니다.
265,842,857,910,985,546,929 WETH(약 265 WETH)를 빌려 담보 soVELO로 전환하려면 담보로 필요한 최소 soVELO 금액은 다음과 같습니다.
265,842,857,910,985,546,929 * soWETHPrice / soVELOPrice / exchangeRate = 0.348
즉, soVELO 담보 1wei면 충분합니다.
265,842,857,910,985,546,929 * soWETHPrice / soVELOPrice / exchangeRate = 0.348
즉, soVELO 담보 1wei이면 충분합니다.
실제로 차입 시 soVELO 담보는 1wei만 사용되었습니다.
(4) 기초 자산, 즉 35,471,603,929,512,754,530,287,976 VELO를 상환합니다.
exchangeRate = 17,735,851,964,756,377,265,143,988,000,000,000,000,000,000
35,471,603,929,512,754,530,287,976 VELO를 상환하는 데 필요한 soVELO 담보 금액은 다음과 같습니다.
35,471,603,929,512,754,530,287,976 * 1e18 / exchangeRate = 1.99999436
계산 시 반올림 대신 절단을 사용하므로 실제 계산된 필수 담보는 soVELO의 1wei입니다.
실제 담보는 soVELO의 2wei이며, 그 중 1wei는 위의 265WETH 대출에 사용되고 나머지 1wei는 35M VELO 상환에 사용됩니다.
(5) 빌린 265 WETH와 상환된 35M VELO를 공격 계약으로 이체
3. 3회(총 4회) 반복하여 새로운 계약을 생성하고 공격을 반복합니다.
4. 마지막으로 플래시론을 상환합니다.
위의 공격 중에 두 가지 취약점이 악용되었습니다.
(1) 기부 공격: VELO 토큰을 soVELO 계약으로 직접 전송(기부)하고 exchangeRate를 변경하여 공격자가 1wei soVELO만 담보로 약 265 WETH를 빌려줄 수 있습니다.
(2) 계산 정확도 문제: 계산 과정에서 발생하는 정확도 손실과 수정된 exchangeRate를 이용하여 1wei soVELO만 담보로 제공하는 경우 35M VELO를 상환할 수 있습니다.
이 공격에 대응하여 우리는 개발 과정에서 다음과 같은 예방 조치를 따라야 합니다.
(1) 프로젝트의 설계 및 개발 과정에서 논리의 무결성과 엄격함이 유지되어야 하며, 특히 보증금, 담보, 상태 변수 업데이트 문제, 곱셈과 나눗셈 계산 결과의 트레이드오프 문제가 중요합니다. 계산 과정에서는 가능한 한 많은 상황을 고려하여 논리가 완전하고 허점이 없도록 해야 합니다.
(2) 프로젝트가 온라인으로 진행되기 전에 제3자 전문 감사 회사를 통해 스마트 계약 감사를 수행해야 합니다.
SharkTeam의 비전은 Web3 세계를 보호하는 것입니다. 이 팀은 블록체인 및 스마트 계약의 기본 이론에 능숙한 전 세계의 숙련된 보안 전문가와 수석 연구원으로 구성되어 있습니다. 위험 식별 및 차단, 스마트 계약 감사, KYT/AML, 온체인 분석 등을 포함한 서비스를 제공하며 지능형 지속 위협(Advanced Persistant Threat, Advanced Persistant Threat)에 효과적으로 대처할 수 있는 온체인 지능형 위험 식별 및 차단 플랫폼 ChainAegis를 만들었습니다. 지속적인 위협), APT). Polkadot, Moonbeam, Polygon, Sui, OKX, imToken, Collab.Land, TinTinLand 등 Web3 생태계의 다양한 분야의 주요 플레이어와 장기적인 협력 관계를 구축했습니다.
공식 홈페이지: https://www.sharkteam.org
트위터: https://twitter.com/sharkteamorg
텔레그램: https://t.me/sharkteamorg
디스코드: https://discord.gg/jGH9xXCjDZ
모든 댓글