여러 프로젝트가 해킹당했으며, Vyper 재진입 잠금 취약점으로 인한 손실이 5,900만 달러를 초과했습니다. 당신의 자금은 아직 안전한가요?
출처 :Beosin
2023년 7월 30일 저녁, 여러 프로젝트가 암흑의 순간을 맞이했습니다.
7월 30일 21:35경, Beosin 산하 Beosin EagleEye 보안 위험 모니터링, 경고 및 차단 플랫폼의 모니터링에 따르면, NFT 대출 프로토콜 JPEG'd 프로젝트가 공격을 받았습니다.
Beosin 보안 팀이 분석을 진행하는 동안, 또 다른 몇 개의 프로젝트가 연이어 피해를 입었습니다.
7월 30일 22:51경, msETH-ETH 풀장이 해커의 습격을 받았습니다.
7월 30일 23:35경, alETH-ETH 풀장이 동일한 공격 방식으로 해킹당했습니다.
이어 DeFi 프로젝트 Alchemix, Metronome 프로젝트에 속한 유동성 풀도 연이어 공격을 받았습니다.
같은 공격 방식이 해커에 의해 여러 번 이용되었는데, 도대체 어디서 문제가 발생한 것일까요?
여러 프로젝트가 공격받은 이유는 Vyper?
7월 31일 새벽, 이더리움 프로그래밍 언어 Vyper는 트위터에 Vyper 0.2.15, 0.2.16 및 0.3.0 버전에서 재진입 잠금에 취약점이 있으며, 원래의 ETH가 전송 시 callback을 조정할 수 있어 이들 ETH와 연결된 lp 풀들이 재진입 공격을 받을 수 있다고 밝혔습니다.
이어 Curve 공식 트위터는 재진입 잠금의 결함으로 인해 Vyper 0.2.15를 사용하는 많은 스테이블코인 풀(alETH/msETH/pETH)이 공격을 받았지만, 다른 풀은 안전하다고 발표했습니다.
Beosin 보안 팀의 공격받은 프로젝트 분석
다음은 이번 해킹 사건과 관련된 거래입니다. ● 공격 거래 0xc93eb238ff42632525e990119d3edc7775299a70b56e54d83ec4f53736400964 0xb676d789bb8b66a08105c844a49c2bcffb400e5c1cfabd4bc30cca4bff3c9801 0xa84aa065ce61dbb1eb50ab6ae67fc31a9da50dd2c74eefd561661bfce2f1620c 0x2e7dc8b2fb7e25fd00ed9565dcc0ad4546363171d5e00f196d48103983ae477c 0xcd99fadd7e28a42a063e07d9d86f67c88e10a7afe5921bd28cd1124924ae2052 ● 공격자 주소 0xC0ffeEBABE5D496B2DDE509f9fa189C25cF29671 0xdce5d6b41c32f578f875efffc0d422c57a75d7d8 0x6Ec21d1868743a44318c3C259a6d4953F9978538 0xb752DeF3a1fDEd45d6c4b9F4A8F18E645b41b324 ● 공격받은 계약 0xc897b98272AA23714464Ea2A0Bd5180f1B8C0025 0xC4C319E2D4d66CcA4464C0c2B32c9Bd23ebe784e 0x9848482da3Ee3076165ce6497eDA906E66bB85C5 0x8301AE4fc9c624d1D396cbDAa1ed877821D7C511
취약점 분석
Beosin 보안 팀의 분석에 따르면, 이번 공격은 주로 Vyper 0.2.15의 재진입 잠금이 무효화된 것에서 비롯되었으며, 공격자는 관련 유동성 풀의 removeliquidity 함수를 호출하여 유동성을 제거할 때 재진입하여 addliquidity 함수를 통해 유동성을 추가했습니다. 잔고 업데이트가 add_liquidity 함수에 재진입하기 전에 발생하여 가격 계산에 오류가 발생했습니다.
공격 프로세스
우리는 0xc93eb238f 거래 공격의 msETH-ETH-f 풀을 예로 들어보겠습니다.
해커 공격 준비 단계에서, 먼저 balancer:Vault를 통해 10,000개의 ETH를 대출하여 공격 자금을 마련합니다.
공격 단계:
- 첫 번째 단계, 공격자는 add_liquidity 함수를 호출하여 대출받은 5000 ETH를 풀에 추가합니다.
- 두 번째 단계, 이후 공격자는 removeliquidity 함수를 호출하여 풀의 ETH 유동성을 제거할 때 다시 재진입하여 addliquidity 함수를 통해 유동성을 추가합니다.
- 세 번째 단계, 잔고 업데이트가 addliquidity 함수에 재진입하기 전에 발생하여 가격 계산에 오류가 발생합니다. 주목할 점은 removeliquidity 함수와 add_liquidity 함수가 이미 재진입 방지를 위해 잠금을 사용하고 있다는 것입니다.
- 따라서 여기서 재진입 방지가 작동하지 않았습니다. 아래 그림에서 볼 수 있는 취약한 Vyper 코드를 읽어보면, 재진입 잠금의 이름이 두 번째로 나타날 때 storage_slot의 기존 수량이 1 증가하는 것을 알 수 있습니다. 다시 말해, 처음 잠금을 획득한 slot은 0이지만, 다시 함수가 잠금을 사용할 때 slot이 1로 변하며, 재진입 잠금은 이때 이미 무효화됩니다. https://github.com/vyperlang/vyper/commit/eae0eaf86eb462746e4867352126f6c1dd43302f
자금 통계
게시 시점까지, 이번 공격 사건으로 손실된 자금은 5900만 달러를 초과했으며, Beosin KYT는 현재 c0ffeebabe.eth 주소가 2879개의 ETH를 반환했으며, 도난당한 자금은 여전히 여러 공격자 주소에 남아 있다고 모니터링하고 있습니다.
후속 영향
이번 사건으로 인한 영향에 대해, 7월 31일 소식에 따르면, 바이낸스 창립자 자오창펑 CZ는 트위터에 CEX 가격 제공이 DeFi를 구했다고 언급했습니다. 바이낸스 사용자들은 영향을 받지 않았습니다. 바이낸스 팀은 Vyper의 재진입 취약점을 점검했습니다. 바이낸스는 0.3.7 이상의 버전만 사용합니다. 최신 코드베이스, 애플리케이션 및 운영 체제를 유지하는 것이 매우 중요합니다.
7월 31일 소식에 따르면, Curve는 Vyper 컴파일러의 문제로 인해 버전 0.2.15-0.3.0에서 CRV/ETH, alETH/ETH, msETH/ETH, pETH/ETH가 해커의 공격을 받았다고 밝혔습니다. 또한, Arbitrum Tricrypto 풀도 영향을 받을 수 있으며, 감사자와 Vyper 개발자들은 아직 공격 가능한 취약점을 찾지 못했지만, 사용 중단을 권장합니다.
이번 사건으로 인한 영향은 여전히 끝나지 않았으며, 자금이 있는 사용자들은 더욱 주의해야 합니다.
이번 사건에 대해 Beosin 보안 팀은 다음과 같이 권장합니다: 현재 Vyper 0.2.15, 0.2.16 및 0.3.0 버전의 재진입 잠금은 모두 무효화된 문제를 가지고 있으며, 관련 프로젝트 측에서 자체 점검을 진행할 것을 권장합니다. 프로젝트가 출시된 후, 프로젝트 측에서는 여전히 제3자 구성 요소/의존 라이브러리의 취약점 공개 정보를 주의 깊게 살펴보고, 안전 위험을 즉시 회피할 것을 강력히 권장합니다.