Uniswap 및 Lendf.Me에 대한 공격의 전체 이야기: DeFi Lego 조합 하에서 "도미노" 붕괴
PeckShield
2020-04-21 05:16
本文约3045字,阅读全文需要约12分钟
이것은 올해 초 bZx가 공격을 받은 후 DeFi의 체계적인 위험 제어 허점을 이용한 해커의 또 다른 두 가지 공격입니다.

편집자 주: 이 기사의 출처는PeckShield(ID:PeckShield), 승인을 받아 Odaily에서 재인쇄했습니다.

편집자 주: 이 기사의 출처는

, 승인을 받아 Odaily에서 재인쇄했습니다.

4월 18일 오전 8시 58분부터 DeFi 플랫폼 Uniswap이 재진입 취약점을 이용한 해커의 공격을 받았습니다. PeckShield 보안 팀은 신속하게 문제를 찾아냈고 해커가 재진입 공격을 수행하기 위해 Uniswap 및 ERC777 표준의 호환성 결함을 사용했음을 발견했습니다.

안타깝게도 불과 24시간 후인 4월 19일 오전 8시 45분에 또 다른 잘 알려진 DeFi 플랫폼인 Lendf.Me도 유사한 방식으로 해커의 공격을 받았습니다.

해커 공격의 원리는 공격자가 이더리움 ERC777 표준의 transferFrom() 콜백 메커니즘을 사용하여 내부적으로 _callTokensToSend() 콜백 함수를 호출할 때 트랜잭션을 하이재킹하고 실제로 업데이트하는 _move() 함수 이전에 악의적인 공격을 수행하는 것입니다. 균형.

자세한 취약점 공격 세부 사항은 기사 뒷부분에서 자세히 소개하겠습니다.

Figure 1: ERC777 transferFrom()

이미지 설명

보조 제목

ERC777 표준 비즈니스 포트폴리오 호환성 문제

표준 확장의 기능 중 하나는 "후크" 메커니즘을 제공하는 것입니다. 이를 통해 일반 주소 또는 계약에서 tokensToSend() 후크 기능을 등록하여 토큰 전송을 제어하거나 거부할 수 있습니다. 이것은 원래 ERC20을 기반으로 토큰의 위험 제어 인터페이스를 강화했으며 이는 유익한 개선입니다. 그러나 DeFi 프로젝트의 구성 가능한 특성으로 인해 서로 다른 제품 간에 계약이 호출될 때 비즈니스 로직의 복잡성도 크게 증가하여 코드 삽입 공격의 가능성을 제공합니다.

Figure 2: ERC777-Compatible tokensToSend() Hijacking

이미지 설명

Figure 3: OpenZeppelin's Exploit Demo (Hook Setup)

그런 다음 공격자는 기존 PC의 후크 기능과 마찬가지로 tokensToSend()에서 무엇이든 할 수 있습니다. 아래 그림과 같이 공격자는 동일한 트랜잭션에 대해 여러 트랜잭션을 만들 수 있습니다.

Figure 4: OpenZeppelin's Exploit Demo (Hook Function)

이미지 설명

Uniswap은 공격을 수행하기 위해 ERC777 호환성 문제를 처음으로 악용했습니다. Bloxy의 악성 트랜잭션 스크린샷(해시: 0x9cb1d93d6859883361e8c2f9941f13d6156a1e8daa0ebe801b5d0b5a612723c1)과 같이 함수 내에서 tokenToEthSwapInput() 호출이 이루어집니다. 이는 공격자가 먼저 거래 환율을 조작한 다음 다른 imBTC를 더 낮은 가격으로 더 많은 ETH로 교환할 수 있음을 의미합니다.

Figure 5: Uniswap Hack

이미지 설명

Lendf.Me 공격 분석

Figure 6: Lendf.Me Hack

Uniswap이 공격을 받은 지 약 24시간 후, 또 다른 DeFi 플랫폼인 Lendf.Me도 해킹당했습니다. 아래는 공격 트랜잭션 중 하나의 스크린샷입니다. 그림에서와 같이 supply() 함수에서 실제 전송 함수 transferFrom()이 호출되면 후킹된 공격자의 컨트랙트에 Lendf.Me의 withdraw()를 훔치는 출금 작업이 포함됩니다.

정상적인 비즈니스 논리는 프로젝트 계약의 잔액에서 공격자가 인출한 290imBTC를 빼는 것입니다.그러나 supply()가 반환될 때 잔액은 재설정되지 않았으며 여전히 290imBTC입니다(라인 1,599 ). 공격자는 Lendf.Me에서 공격자의 imBTC 모기지 금액을 제어하고 수정합니다.충분히 큰 imBTC 모기지로 공격자는 다양한 유동 거래 쌍에서 10종 이상의 모든 가용 자산을 빌려줄 수 있습니다. ).

Figure 7: Lendf.Me Hack Details

이미지 설명

보조 제목

위의 그림과 같이 공격자는 수익을 낸 후 즉시 각 Token을 관련 계정 0xa9bf70으로 이체한 다음 공격자는 1inch.exchange 및 ParaSwap과 같은 플랫폼을 통해 더 인기 있는 WETH, PAX, BUSD 및 기타 토큰을 교환했습니다. 수십 번 ETH, DAI, BAT 토큰에 넣고 TUSD, USDT 토큰을 Aave 대출 플랫폼에 입금합니다. 지금까지 공격자와 관련 계정의 잔액은 위에 표시됩니다.

수리 제안

보조 제목

수리 제안

PeckShield 보안 팀은 개발자가 "Checks-Effects-Interactions" 접근 방식을 사용하여 이러한 재진입 공격을 방지할 것을 권장합니다. 예를 들어 Lendf.Me의 supply()에서 토큰 잔액이 먼저 업데이트되면 doTransferIn()이 호출됩니다. 이렇게 하면 공격이withdrawal() 후에 잔액을 재설정하는 것이 불가능해집니다.

반면 ERC777 표준 기능은 필연적으로 후크 메커니즘을 활성화하므로 모든 트랜잭션 기능이 재진입 위험을 감지하고 방지해야 합니다. 예를 들어, supply()와withdraw()가 동시에 실행되고 mutex가 추가되면 공격자는 supply()함수 내에서draft()작업을 수행할 수 없습니다.

마지막으로 무시할 수 없는 점은 DeFi 비즈니스 포트폴리오의 가능한 시스템적 위험을 심각하게 고려해야 한다는 것입니다.플랫폼 측은 제품이 온라인 상태가 되기 전에 견고한 코드 감사 및 취약성 조사가 있는지 확인해야 할 뿐만 아니라 서로 다른 제품의 비즈니스 결합 시 서로 다른 비즈니스 로직으로 인해 발생할 수 있는 시스템적 위험 제어 문제를 고려하십시오.

PeckShield
作者文库