Sonne 금융 공격 분석: 100달러가 어떻게 650만 달러를 활용할 수 있습니까? 이 공격의 핵심은 시장(soToken)이 생성되었을 때 공격자가 첫 번째 모기지 캐스팅 작업을 수행하고 소량의 기본 토큰으로 매우 적은 수의 soToken을 발행하여 soToken의 "totalSupply" 값이 너무 작다는 것입니다. 그런 다음 공격자는 Solidity 계약 정밀도 손실의 취약점을 악용하여 스테이킹 + 캐스팅 방법 대신 기본 토큰을 soToken 계약으로 직접 보냈습니다(soToken은 발행되지 않습니다. 즉, "totalSupply"는 변경되지 않고 "totalCash"는 더 커짐을 의미합니다). 기본 토큰을 입금합니다. 이러한 작업으로 인해 계약의 "totalCash" 변수가 커지지만 "totalSupply"는 변경되지 않고 그대로 유지되어 exchangeRate가 더 커지게 됩니다. 결국, 공격자가 기본 토큰을 상환할 때 파괴되어야 하는 soToken은 모기지 기간 동안 발행된 soToken보다 적습니다. 공격자는 획득한 soToken을 사용하여 기본 토큰 WETH 및 USDC를 다른 soToken(예: soWETH)에 빌려줍니다. , soUSDC), 최종적으로 이익은 2천만 달러에 달했습니다.
2024년 5월 15일 Sonne Finance는 Optimism 체인에서 공격을 받아 최대 2천만 달러의 손실을 입었습니다. 공격 후 사용자 @tonyke_bot
(https://twitter.com/tonyke_bot/status/1790547461611860182)
Sonne Finance 프로젝트는 공격을 발견한 후 Optimism의 모든 시장을 신속하게 중단하고 Base의 시장은 안전하다고 밝혔습니다.
(https://twitter.com/SonneFinance/status/1790535383005966554)
Sonne Finance는 개인, 기관 및 금융 서비스 액세스에 대한 동의를 위해 낙관론에 기반한 화합물 V2를 포크한 분산형 대출 프로토콜입니다. Sonne Finance 프로토콜은 사용자의 토큰 자산을 모아 대출 유동성 풀을 형성하여 사용자에게 은행과 같은 대출 사업을 제공합니다. 컴파운드와 마찬가지로 프로토콜 참가자는 자신의 토큰을 Sonne Finance의 대출 유동성 풀에 담보로 제공하고 인증서 soToken(cToken과 동일)을 얻을 수 있습니다. SoToken은 이자부 자산 증서로, 블록이 진행됨에 따라 일정 금액의 수입을 창출하고 SONE 토큰 인센티브도 받습니다. 참가자는 soToken을 손에 들고 Sonne 대출 자산 풀에서 다른 토큰을 빌릴 수도 있습니다. 예를 들어, 참가자는 일정 금액의 USDC를 담보로 제공하여 soUSDC 인증서를 얻은 다음 추가 유통을 위해 WETH를 빌려줄 수 있습니다. Sonne Finance 프로토콜의 모기지 대출은 다대다 자산 관계일 수 있습니다. 모기지 대출 프로세스 중에 프로토콜은 참가자 주소의 건강 요소(건강 요소)를 자동으로 계산합니다. 주소 모기지 제품은 청산을 지원하며 청산인도 특정 청산 보상을 받을 수 있습니다.
사용자가 예치한 기본 토큰과 발행된 soToken 간의 관계는 주로 exchangeRate라는 변수와 관련이 있습니다. 이 변수는 대략적으로 각 soToken의 기본 토큰 가치를 나타내는 데 사용될 수 있습니다. exchangeRate의 계산식은 다음과 같습니다.
위 수식에서 totalCash는 soToken이 보유하고 있는 기초 토큰의 수, totalBorrows는 특정 시장에서 빌려준 기초 토큰의 수, totalReserves는 총 준비금 수(차용자가 지불한 이자가 포함됨), totalSupply는 발행된 soToken의 수를 나타냅니다.
교환할 때 사용자는 교환하려는 기본 토큰의 수인 RedeAmount를 지정하여 폐기해야 하는 soToken의 수인 RedeemTokens를 계산할 수 있습니다. 계산 방법은 대략 "redeemTokens = RedeemAmount / exchangeRat"입니다. 여기에는 정확성이 없습니다.
이 공격의 핵심은 시장(soToken)이 생성되었을 때 공격자가 첫 번째 모기지 캐스팅 작업을 수행하고 소량의 기본 토큰으로 매우 적은 수의 soToken을 발행하여 soToken의 "totalSupply" 값이 너무 작다는 것입니다. . 그런 다음 공격자는 Solidity 계약 정밀도 손실의 취약점을 악용하여 스테이킹 + 캐스팅 방법 대신 기본 토큰을 soToken 계약으로 직접 보냈습니다(soToken은 발행되지 않습니다. 즉, "totalSupply"는 변경되지 않고 "totalCash"는 더 커짐을 의미합니다). 기본 토큰을 입금합니다. 이러한 작업으로 인해 계약의 "totalCash" 변수가 커지지만 "totalSupply"는 변경되지 않고 그대로 유지되어 exchangeRate가 더 커지게 됩니다. 결국, 공격자가 기본 토큰을 상환할 때 파괴되어야 하는 soToken은 모기지 기간 동안 발행된 soToken보다 적습니다. 공격자는 획득한 soToken을 사용하여 기본 토큰 WETH 및 USDC를 다른 soToken(예: soWETH)에 빌려줍니다. , soUSDC), 최종적으로 이익은 2천만 달러에 달했습니다.
공격 준비 거래:
https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96
공격 이익 거래 :
https://optimistic.etherscan.io/tx/ 0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0
공격 EOA 관련 주소:
0x5d0d99e9886581ff8fcb01f35804317f5ed80 bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
공격자(계약 ) 관련 주소:
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa 2625825917e9b1f8346a465de1bbc150c5b9
기본 토큰(VELO 토큰 V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db취약점 계약(soVELO, 컴파운드의 cToken과 유사함): 0xe3b81318b1b6776f0877c3770afddff97b9f5fe5X @tonyke_bot 사용자 구조 트랜잭션: https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a9408 6 c200c0470c6456603c967f82ab559a5931fd181c2공격 과정 분석사전 요약Sonne Finance 프로젝트 Fang은 최근 Sonne Finance(https://twitter.com/SonneFinance/status/1786871066075206044)에 VELO 시장을 추가하는 제안을 승인했으며 이틀 후 다중 서명 지갑을 통해 5건의 거래가 실행되도록 준비했습니다(https:/ /optimistic) .etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), 이 5개의 거래는 VELO 시장(soVELO 계약)을 생성하고 이자율 모델 설정, 가격 오라클 설정, 모기지 계수 설정과 같은 시장의 일부 주요 구성을 설정하는 데 사용됩니다. , 등. VELO 시장이 생성된 후 사용자는 VELO 토큰을 예치하여 soVELO 토큰을 발행할 수 있으며, 이는 다시 다른 soToken을 빌리는 데 사용될 수 있습니다. 공격 준비공격 준비 단계에서는 주로 공격자가 제안의 2일 잠금 기간 이후 Sonne Finance 프로젝트 제안의 정보를 기반으로 VELO 시장(soVELO 계약)을 생성하고 주요 구성을 설정하며, VELO 토큰 스테이킹 통화는 soVELO 토큰을 발행하기 위해 soVELO 계약을 체결함과 동시에 보유하고 있는 VELO 토큰을 soVELO 계약으로 직접 전송하여 exchangeRate를 높이고 후속 공격에 대비합니다. 구체적인 단계는 다음과 같습니다.공격 이익 단계에서는 주로 공격자가 제안의 다섯 번째 거래를 실행하고 플래시 대출을 통해 VELO 토큰을 soVELO 계약에 직접 빌려 주어 교환율을 더욱 높이는 단계가 포함됩니다. 그런 다음 공격자는 값이 2인 soVELO 토큰을 사용하여 다른 soToken(예: soWETH, soUSDC 등) 계약에서 WETH, USDC 등 기본 토큰을 빌렸고, 이 부분이 공격자의 이익이 되었습니다. 그런 다음 공격자는 soVELO 계약에서 자신의 기본 토큰을 상환하려고 했습니다. exchangeRate의 증가와 상환을 위해 폐기해야 하는 soVELO 토큰 계산의 정확성 손실로 인해 공격자는 결국 가치가 있는 soVELO 토큰만 사용했습니다. 1. 이전에 예치된 VELO 토큰이 거의 모두 회수되었습니다. 이는 공격자가 다른 soToken에서 빌려 WETH 및 USDC와 같은 기본 토큰을 얻기 위해 1의 값을 가진 추가 soVELO 토큰을 사용하는 것으로 이해할 수 있습니다. 공격자는 동일한 기법을 사용하여 여러 차례 공격을 반복하였고, 궁극적으로 막대한 이익을 얻었습니다.
구체적인 단계는 다음과 같습니다.
공격자는 제안서의 다섯 번째 거래를 실행하고 제안서에 지정된 대출 요소를 설정합니다.
공격자는 VolatileV2 AMM - USDC/VELO 풀에서 "35,469,150,965,253,049,864,450,449" 값의 VELO 토큰을 플래시로 빌려주었고, 이로 인해 공격자의 후크 기능이 작동되었습니다. Hook 기능에서는 공격자가 계속해서 공격 동작을 수행한다.
공격자는 교환율을 더욱 높이기 위해 자신이 보유한 VELO 토큰을 soVELO 계약으로 보냅니다. 현재 soVELO 계약에는 "35,471,703,929,512,754,530,287,976"의 가치를 지닌 총 VELO 토큰이 있습니다(공격자가 3회 전송한 VELO 토큰의 합계).
공격자는 새로운 컨트랙트 0xa16388a6210545b27f669d5189648c1722300b8b를 생성합니다. 생성자에서 그가 보유한 soVELO 토큰 2개를 새로 생성된 컨트랙트 0xa163(이하 공격자 0xa163)으로 전송합니다.
공격자 0xa163은 자신이 보유한 soVELO 토큰을 사용하여 soWETH에서 "265,842,857,910,985,546,929"의 가치로 WETH를 빌렸습니다.
공격자 0xa163은 soVELO의 "redeemUnderlying" 기능을 호출하여 상환된 VELO 토큰의 값을 "35,471,603,929,512,754,530,287,976"(공격자가 이전에 soVELO 계약에 양도했거나 담보로 제공한 VELO 토큰 수)으로 지정했습니다. 이때 상환을 위해 폐기해야 하는 soVELO 토큰의 수는 "redeemTokens = RedeemAmountIn / exchangeRate" 공식에 따라 계산되어야 합니다.
"exchangeRateStoredInternal" 함수를 보면 이때 _totalSupply가 0이 아닌 2이므로 "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply" 공식을 통해 exchangeRate 값을 계산해야 함을 알 수 있습니다. , 현재 교환율은 "17,735,851,964,756,377,265,143,988,000,000,000,000,000,000"이며, 이 값은 초기 설정된 교환율 "200,000,000,000,000,000,000,000,00"보다 훨씬 큽니다.
새 exchangeRate를 기준으로 계산된 "redeemTokens"의 값은 "1.99"입니다. Solidity의 반올림 특성으로 인해 "redeemTokens"의 값은 최종적으로 1이 됩니다. 이는 공격자 0xa163이 이전에 예치된 거의 모든 VELO 토큰을 상환하기 위해 값이 1인 soVELO 토큰을 사용했음을 의미합니다. 동시에 공격자 0xa163은 soWETH에서 빌린 "265,842,857,910,985,546,929"의 가치로 WETH를 획득했습니다.
sovelo.redeemunderlying :
sovelo.exchangeratestoredinternal :
공격자 0xa163은 빌린 모든 weth와 구속 된 벨로 토큰을 상단 공격자에게 전송 한 다음 자체 파괴했습니다.
공격자는 값 1의 잠긴 soVELO 토큰을 되찾기 위해 새로 생성된 계약 0xa163에서 빌린 자산 중 일부를 청산하기 위해 soWETH의 "liquidateBorrow" 기능을 호출합니다. 현재 공격자는 값이 1인 soVELO 토큰만 보유하고 있습니다.
공격자는 soVELO의 "mint" 기능을 호출하여 soVELO 토큰을 다시 모기지 및 발행합니다. 목적은 2의 가치를 지닌 충분한 soVELO 토큰을 수집한 다음 위의 3~8단계를 다시 수행하여 다른 비보상 토큰에서 이익을 얻는 것입니다. .
공격자는 9단계를 여러 번 수행한 후 플래시론을 상환하고 수익을 남기고 떠납니다.
공격 후 사용자 @tonyke_bot 이 작업을 통해 공격자의 추가 공격을 막을 수 있는 이유는 이 트랜잭션으로 인해 soVELO의 totalSupply 크기와 totalCash 보유 VELO 토큰 수가 변경되고, exchangeRate 계산에 대한 totalSupply의 증가 영향이 더 크기 때문입니다. 따라서 exchangeRate가 작아지므로 공격자가 공격할 때 더 이상 정확도 손실을 이용해 soVELO를 획득할 수 없게 되어 더 이상 공격이 불가능해집니다.
공격자는 불법 수익금을 획득한 직후 자금을 이체했으며, 자금의 대부분은 공격을 계속하기 위해 주소를 변경하기 위해, 일부는 자금 세탁을 위해 다음 4개의 주소로 이체되었습니다.
0x4ab93fc50b82d4dc457db85888dfdae28d2 9b98d
공격자는 이 주소로 198 WETH를 전송했으며, 해당 주소는 동일한 공격 방법을 사용하여 다음 거래에서 불법 이익을 얻었습니다.
공격 후 주소는 위의 주소를 전송했습니다. 불법 이득 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb로.
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
공격자는 이 주소로 724277 USDC, 2353 VELO를 전송하고 USDC를 Ether로 교환했습니다. 자금의 일부는 즉시 스타게이트 크로스체인 브리지로 이체되었으며, 대부분의 불법 자금은 다음 주소에 남아 있었습니다:
0xbd18100a168321701955e348f03d0df4f517c13b
공격자는 33 WETH를 이체했습니다. 주소로 가서 채택해 보세요. 돈세탁을 위한 체인 링크는 다음과 같습니다:
0xbd18100a168321701955e348f03d0df4f517c13b->0x7e97b74252b6df53caf386fb4c54d4fb59cb6928->0xc521 bde5e53f537ff208970152b75a003093c2b4->0x9f09ec563222fe52712dc413d0b7b66cb5c7c795.
0x4fac0651bcc837bf889f6a7d79c1908419fe1770
공격자는 563 WETH를 이 주소로 전송한 다음 0x1915F77A116dcE7E9b8F4C4E43CDF8 1e로 전송했습니다. 2aCf9C68, 현재로서는 추가 조치가 없습니다.
이번 공격자의 자금세탁 방식은 비교적 전문적이며, 그 방식도 다양해지는 추세를 보이고 있습니다. 따라서 Web3 참가자의 경우 보안 측면에서 자금 세탁 방지 기능을 지속적으로 개선하고 KYT, AML 및 기타 관련 블록체인 거래 보안 제품을 통해 Defi 프로젝트의 보안을 개선해야 합니다.
정확도 손실은 심각하게 받아들여야 합니다. 정확성 손실로 인한 보안 문제는 끊임없이 발생하며, 특히 Defi 프로젝트에서는 정확성 손실로 인해 심각한 재정적 손실이 발생하는 경우가 많습니다. 프로젝트 당사자와 보안 감사자는 프로젝트에서 정확성이 손실된 코드를 주의 깊게 검토하고 이러한 취약점을 최대한 피하기 위해 테스트를 수행하는 것이 좋습니다.
Compound에서 cToken과 유사한 시장 생성 및 최초 모기지 발행 작업은 공격자에 의해 운영되어 환율을 조작하는 것을 피하기 위해 권한 있는 사용자가 수행하는 것이 좋습니다.
컨트랙트에 "this.balance" 또는 "token.balanceOf()" 값에 따라 달라지는 주요 변수가 있는 경우, "this.balance" 또는 "token.balanceOf()" 값에 따라 달라지는 주요 변수 변경 조건을 신중하게 고려해야 합니다. 변수 값을 변경하기 위해 기본 통화를 계약 또는 토큰 메소드로 직접 전송하거나 특정 함수를 호출해야만 변수 값을 변경할 수 있습니다.
위 내용은 100달러가 어떻게 650만 달러를 활용할 수 있습니까? Sonne Finance 공격 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!