2024년 3월 28일, Prisma Finance는 플래시 대출 공격을 받아 프로젝트에서 약 1,221만 달러의 손실을 입었습니다.

SharkTeam은 이번 사건에 대한 기술적 분석을 실시하고 보안 예방 조치를 요약했으며, 후속 프로젝트가 이를 통해 교훈을 얻고 블록체인 산업을 위한 보안 라인을 공동으로 구축할 수 있기를 바랍니다.
공격자 1: 0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202 (약칭: 0x7e39)
공격 계약 1: 0xd996073019c74b2fb94ead236e32032405bc027c (약칭 0xd996)
공격자 2: 0x7fe83f45e0f53651b3ed9650d2a2c67d8855e385
공격 계약 2: 0x4148310fe4544e82f176570c6c7b649290a90e17
공격 대상 계약: 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
공격에는 16개의 트랜잭션이 포함되어 있으며 첫 번째 공격 트랜잭션을 예로 들어 보겠습니다.
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
공격 과정은 다음과 같습니다.
1. 주소 0x56a201b872b50bbdee0021ed4d1bb36359d291ed(약어로 0x56a2)에 있는 대상 계약의 모든 담보 및 부채를 읽습니다.

반환 결과는 다음과 같습니다.
반환 결과는 다음과 같습니다.

주소 0x56a2에는 대상 계약의 담보로 총 1,745 wstETH가 있고 총 부채는 1,442,100 mkUSD입니다.
2. 공격자 0x7e39는 공격 계약 0xd996을 통해 mkUSD 부채 계약의 flashLoan 기능을 호출합니다.

파라미터 수신자는 MigrateTroveZap으로 설정되어 있으며 금액은 위에서 쿼리한 모든 부채입니다.

그런 다음 수신기(여기서는 MigrateTroveZap)의 onFlashLoan 함수가 flashLoan 함수에서 호출됩니다.

onFlashLoan 기능은 우선 플래시론을 통해 원래의 부채를 모두 상환하고, 수취인에게 담보를 인출한 후, 수취인은 일정 금액의 담보를 다시 담보로 받아 일정 금액의 부채를 빌리게 됩니다. 다음과 같은 두 가지 주요 기능이 있습니다.
(1) closeTrove 기능, 부채를 상환하고 troverManager에서 수신자에게 모든 담보(1745.08 swtETH)를 인출합니다(여기서는 MigrateTroveZap 계약이 있습니다).

(2) openTrove 기능, 수신자는 463.18 wstETH를 troverManager에 다시 담보로 제공하고 1,443,598 mkUSD의 부채를 발생시킵니다.

위 데이터를 보면 flashLoan 기능이 실행된 후 troverManager에서 추출되고 주소 0x56a2에 속하는 담보가 여전히 수신자에 유지되며 금액은 약 1745.08 – 463.18 = 1281.90 wstETH임을 알 수 있습니다.
3. 공격자 0x7e39는 계약 0xd996을 공격하여 플래시 대출을 통해 Balancer로부터 1 wstETH를 빌렸습니다.

그런 다음 1 wstETH를 모기지하고 2000mkUSD의 부채를 빌리고 수수료를 더하면 총 부채는 2200mkUSD입니다.

4. 2단계와 유사하게 mkUSD 부채 계약에서 flashLoan 함수를 호출합니다. 여기서 매개변수 수신자는 여전히 MigrateTroveZap으로 설정되어 있으며 금액은 1 wstETH를 약속한 후 전체 부채, 즉 2000 mkUSD입니다. FlashLoan 함수에서는 수신기의 onFlashLoan 함수가 호출된 후 closeTrove 및 openTrove 함수가 호출됩니다.


그러나 여기서 closeTrove 및 openTrove 함수의 매개변수 계정은 더 이상 위의 주소 0x56a2가 아니라 1 wstETH를 약속하는 공격 계약 0xd996입니다.
(1) closeTrove 기능, 부채를 상환하고 troverManager에서 수신자에게 모든 담보(1swtETH)를 인출합니다(이것은 여전히 MigrateTroveZap 계약입니다). 이때 수신기에는 1281.90 +1=1282.90 wstETH가 있습니다.

(2) openTrove 기능, 수신자는 1282.80 wstETH(거의 전부)를 troverManager에 다시 담보로 제공하고 2001.8 mkUSD의 부채를 발생시킵니다.

실제로 여기 담보에 있는 1281.80 wstETH는 공격 계약 0xd996에 속하지 않고 위 주소 0x56a2에 속합니다.
5. 마지막으로 공격자 0x7e39는 공격 컨트랙트 0xd996을 통해 별도로 closeTrove 함수를 호출하여 저당권 1282.80 wstETH를 공격 컨트랙트 0xd996으로 추출했다.


플래시 대출을 상환한 후에도 공격자는 여전히 1281.80 wstETH, 즉 약 230만 달러의 수익을 올렸습니다.

이 사건의 근본 원인은 프로젝트 계약에 공격자가 이 취약점을 이용하여 다른 계정 주소에서 약속된 자산을 얻을 수 있는 논리 및 권한 확인이 있다는 것입니다.
공격자가 최종적으로 획득한 wstETH는 troverManager 계약의 원래 주소 0x56a2의 담보였으며, mkUSD 계약의 flashLoan 기능을 통해 MigrateTroveZap 계약의 onFlashLoan 기능의 매개 변수를 맞춤화하고 MigrateTroveZap을 사용하여 담보로 변환했습니다. 공격 계약을 사용하여 계약을 공격한 후 추출합니다.
공격자는 mkUSD 계약의 flashLoan 기능과 MigrateTroveZap 계약의 onFlashLoan 기능을 통해 다른 계좌 주소의 담보 및 인출을 조작합니다.


(1) onFlashLoan 함수의 수신자는 계정의 모든 담보를 수신하므로 수신자가 신뢰할 수 있는지 확인해야 하기 때문에 flashLoan 함수에는 매개변수 수신자 주소에 대한 확인이 부족합니다.
(1) onFlashLoan 함수의 수신자는 계정의 모든 담보를 수신하므로 수신자가 신뢰할 수 있는지 확인해야 하기 때문에 flashLoan 함수에는 매개변수 수신자 주소에 대한 확인이 부족합니다.
(2) onFlashLoan 기능은 closeTrove, openTrove 기능 모두 운영중인 계정의 자산이기 때문에 계정 주소 확인이 부족하므로 계정에 권한 확인을 추가해야 합니다.
이 두 개의 주소 매개변수를 확인하는 것 외에도 flashLoan 기능의 수량 매개변수와 구현 로직을 확인하는 것도 필요할 수 있습니다.
이 공격에 대응하여 우리는 개발 과정에서 다음과 같은 예방 조치를 따라야 합니다.
(1) 프로젝트의 설계 및 개발 과정에서 특히 자산 양도와 관련된 경우 논리의 무결성과 엄격함이 유지되어야 하며, 발신자가 기능 연구 권한에 대한 검증을 강화해야 합니다. , 호출 함수, 함수 매개변수, 전송 로직 등은 모두 안전하고 신뢰할 수 있습니다.
(2) 프로젝트가 온라인으로 진행되기 전에 계약 감사를 수행할 전문 제3자 감사팀을 찾아야 합니다.
SharkTeam의 비전은 Web3 세계를 보호하는 것입니다. 이 팀은 블록체인 및 스마트 계약의 기본 이론에 능숙한 전 세계의 숙련된 보안 전문가와 수석 연구원으로 구성되어 있습니다. 위험 식별 및 차단, 스마트 계약 감사, KYT/AML, 온체인 분석 등을 포함한 서비스를 제공하며 지능형 지속 위협(Advanced Persistant Threat, Advanced Persistant Threat)에 효과적으로 대처할 수 있는 온체인 지능형 위험 식별 및 차단 플랫폼 ChainAegis를 만들었습니다. 지속적인 위협) Web3 세계. , APT). Polkadot, Moonbeam, Polygon, Sui, OKX, imToken, Collab.Land 등 Web3 생태계의 다양한 분야의 주요 플레이어와 장기적인 협력 관계를 구축했습니다.
공식 홈페이지: https://www.sharkteam.org
트위터: https://twitter.com/sharkteamorg
텔레그램: https://t.me/sharkteamorg
디스코드: https://discord.gg/jGH9xXCjDZ
모든 댓글